From 55b1ab9e49d5713ca2b4508cdcdc02ee60a19cee Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 2 Jul 2020 12:23:57 +0100 Subject: [PATCH 001/538] Bump version --- .github/workflows/ci.yml | 8 ++++---- CHANGELOG.md | 8 ++++++++ Dockerfile | 4 ++-- environment.yml | 2 +- nextflow.config | 4 ++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c65240bd..5cfe6711b 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,13 +35,13 @@ jobs: - name: Build new docker image if: env.GIT_DIFF - run: docker build --no-cache . -t nfcore/chipseq:1.2.0 + run: docker build --no-cache . -t nfcore/chipseq:dev - name: Pull docker image if: ${{ !env.GIT_DIFF }} run: | docker pull nfcore/chipseq:dev - docker tag nfcore/chipseq:dev nfcore/chipseq:1.2.0 + docker tag nfcore/chipseq:dev nfcore/chipseq:dev - name: Install Nextflow run: | @@ -75,13 +75,13 @@ jobs: - name: Build new docker image if: env.GIT_DIFF - run: docker build --no-cache . -t nfcore/chipseq:1.2.0 + run: docker build --no-cache . -t nfcore/chipseq:dev - name: Pull docker image if: ${{ !env.GIT_DIFF }} run: | docker pull nfcore/chipseq:dev - docker tag nfcore/chipseq:dev nfcore/chipseq:1.2.0 + docker tag nfcore/chipseq:dev nfcore/chipseq:dev - name: Install Nextflow run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index aafc386f0..c33552316 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### `Added` + +### `Fixed` + +### `Dependencies` + ## [1.2.0] - 2020-07-02 ### `Added` diff --git a/Dockerfile b/Dockerfile index 0628abe4a..6b5f6538f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,10 +7,10 @@ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a # Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-chipseq-1.2.0/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-chipseq-1.3.0dev/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-chipseq-1.2.0 > nf-core-chipseq-1.2.0.yml +RUN conda env export --name nf-core-chipseq-1.3.0dev > nf-core-chipseq-1.3.0dev.yml # Instruct R processes to use these empty files instead of clashing with a local version RUN touch .Rprofile diff --git a/environment.yml b/environment.yml index 112077221..c7efd4d9b 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-chipseq-1.2.0 +name: nf-core-chipseq-1.3.0dev channels: - conda-forge - bioconda diff --git a/nextflow.config b/nextflow.config index 4e54affdf..2a22eb383 100644 --- a/nextflow.config +++ b/nextflow.config @@ -96,7 +96,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev -process.container = 'nfcore/chipseq:1.2.0' +process.container = 'nfcore/chipseq:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -169,7 +169,7 @@ manifest { description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = '1.2.0' + version = '1.3.0dev' } // Function to ensure that resource requirements don't go beyond From 65f59566e5774363f6f7a8394f78ec50a2fa43c4 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:15:01 +0100 Subject: [PATCH 002/538] Rename samplesheet --- bin/check_samplesheet.py | 191 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100755 bin/check_samplesheet.py diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py new file mode 100755 index 000000000..921349ecb --- /dev/null +++ b/bin/check_samplesheet.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python + +####################################################################### +####################################################################### +## Created on April 4th 2019 to check nf-core/chipseq design file +####################################################################### +####################################################################### + +import os +import sys +import argparse + +############################################ +############################################ +## PARSE ARGUMENTS +############################################ +############################################ + +Description = 'Reformat nf-core/chipseq samplesheet and check its contents.' +Epilog = "Example usage: python check_samplesheet.py " + +argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) + +## REQUIRED PARAMETERS +argParser.add_argument('DESIGN_FILE', help="Input samplesheet/design file.") +argParser.add_argument('READ_MAPPING_FILE', help="Output design file containing sample ids and reads.") +argParser.add_argument('CONTROL_MAPPING_FILE', help="Output design file containing ip vs control mappings.") +args = argParser.parse_args() + +############################################ +############################################ +## MAIN FUNCTION +############################################ +############################################ + +def reformat_design(DesignFile,ReadMappingFile,ControlMappingFile): + + ERROR_STR = 'ERROR: Please check design file' + HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] + + ## CHECK HEADER + fin = open(DesignFile,'r') + header = fin.readline().strip().split(',') + if header != HEADER: + print("{} header: {} != {}".format(ERROR_STR,','.join(header),','.join(HEADER))) + sys.exit(1) + + numColList = [] + sampleMappingDict = {} + antibodyDict = {} + while True: + line = fin.readline() + if line: + lspl = [x.strip() for x in line.strip().split(',')] + group,replicate,fastQFiles,antibody,control = lspl[0],lspl[1],[x for x in lspl[2:-2] if x],lspl[-2],lspl[-1] + + ## CHECK VALID NUMBER OF COLUMNS PER SAMPLE + numCols = len(lspl) + if numCols not in [6]: + print("{}: Invalid number of columns (should be 6)!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + numColList.append(numCols) + + ## CHECK GROUP ID DOESNT CONTAIN SPACES + if group.find(' ') != -1: + print("{}: Group id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + + ## CHECK REPLICATE COLUMN IS INTEGER + if not replicate.isdigit(): + print("{}: Replicate id not an integer!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + replicate = int(replicate) + + for fastq in fastQFiles: + ## CHECK FASTQ FILE EXTENSION + if fastq[-9:] != '.fastq.gz' and fastq[-6:] != '.fq.gz': + print("{}: FastQ file has incorrect extension (has to be '.fastq.gz' or 'fq.gz') - {}\nLine: '{}'".format(ERROR_STR,fastq,line.strip())) + sys.exit(1) + + ## CREATE GROUP MAPPING DICT = {GROUP_ID: {REPLICATE_ID:[[FASTQ_FILES]]} + if group not in sampleMappingDict: + sampleMappingDict[group] = {} + if replicate not in sampleMappingDict[group]: + sampleMappingDict[group][replicate] = [] + sampleMappingDict[group][replicate].append(fastQFiles) + + ## CHECK BOTH ANTIBODY AND CONTROL COLUMNS HAVE VALID VALUES + if antibody: + if antibody.find(' ') != -1: + print("{}: Antibody id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + if not control: + print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + if control: + if control.find(' ') != -1: + print("{}: Control id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + if not antibody: + print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) + sys.exit(1) + + ## CREATE ANTIBODY MAPPING CONTROL DICT + if antibody and control: + antibodyDict[group] = (antibody,control) + + else: + fin.close() + break + + ## CHECK IF DATA IS PAIRED-END OR SINGLE-END AND NOT A MIXTURE + if min(numColList) != max(numColList): + print("{}: Mixture of paired-end and single-end reads!".format(ERROR_STR)) + sys.exit(1) + + ## CHECK IF ANTIBODY AND CONTROL COLUMNS HAVE BEEN SPECIFIED AT LEAST ONCE + if len(antibodyDict) == 0: + print("{}: Antibody and Control must be specified at least once!".format(ERROR_STR)) + sys.exit(1) + + ## WRITE READ MAPPING FILE + antibodyGroupDict = {} + fout = open(ReadMappingFile,'w') + fout.write(','.join(['sample_id','fastq_1','fastq_2']) + '\n') + for group in sorted(sampleMappingDict.keys()): + + ## CHECK THAT REPLICATE IDS ARE IN FORMAT 1.. + uniq_rep_ids = set(sampleMappingDict[group].keys()) + if len(uniq_rep_ids) != max(uniq_rep_ids): + print("{}: Replicate IDs must start with 1..\nGroup: {}, Replicate IDs: {}".format(ERROR_STR,group,list(uniq_rep_ids))) + sys.exit(1) + + ## RECONSTRUCT LINE FOR SAMPLE IN DESIGN + for replicate in sorted(sampleMappingDict[group].keys()): + for idx in range(len(sampleMappingDict[group][replicate])): + fastQFiles = sampleMappingDict[group][replicate][idx] + + ## GET SAMPLE_ID,FASTQ_1,FASTQ_2 COLUMNS + sample_id = "{}_R{}_T{}".format(group,replicate,idx+1) + oList = [sample_id] + fastQFiles + if len(fastQFiles) == 1: + oList += [''] + fout.write(','.join(oList) + '\n') + + ## EXTRAPOLATE CONTROL COLUMN + if group in antibodyDict: + antibody,control = antibodyDict[group] + if control in sampleMappingDict.keys(): + control_id = "{}_R1".format(control) + if replicate in sampleMappingDict[control]: + control_id = "{}_R{}".format(control,replicate) + if antibody not in antibodyGroupDict: + antibodyGroupDict[antibody] = {} + if group not in antibodyGroupDict[antibody]: + antibodyGroupDict[antibody][group] = [] + antibodyList = [sample_id[:-3],control_id] + if not antibodyList in antibodyGroupDict[antibody][group]: + antibodyGroupDict[antibody][group].append(antibodyList) + else: + print("{}: Control id not a valid group\nControl id: {}, Valid Groups: {}".format(ERROR_STR,control,sorted(sampleMappingDict.keys()))) + sys.exit(1) + fout.close() + + ## WRITE SAMPLE TO CONTROL MAPPING FILE + fout = open(ControlMappingFile,'w') + fout.write(','.join(['sample_id','control_id','antibody','replicatesExist','multipleGroups']) + '\n') + for antibody in sorted(antibodyGroupDict.keys()): + repsExist = '0' + if max([len(x) for x in antibodyGroupDict[antibody].values()]) > 1: + repsExist = '1' + multipleGroups = '0' + if len(antibodyGroupDict[antibody].keys()) > 1: + multipleGroups = '1' + for group in sorted(antibodyGroupDict[antibody].keys()): + for antibodyList in antibodyGroupDict[antibody][group]: + fout.write(','.join(antibodyList+[antibody,repsExist,multipleGroups]) + '\n') + fout.close() + +############################################ +############################################ +## RUN FUNCTION +############################################ +############################################ + +reformat_design(DesignFile=args.DESIGN_FILE,ReadMappingFile=args.READ_MAPPING_FILE,ControlMappingFile=args.CONTROL_MAPPING_FILE) + +############################################ +############################################ +############################################ +############################################ From 456d7d7515bd2f689b0fce62909de8f9c81005cb Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:15:13 +0100 Subject: [PATCH 003/538] Renamed --- bin/check_design.py | 191 -------------------------------------------- 1 file changed, 191 deletions(-) delete mode 100755 bin/check_design.py diff --git a/bin/check_design.py b/bin/check_design.py deleted file mode 100755 index 51a993753..000000000 --- a/bin/check_design.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python - -####################################################################### -####################################################################### -## Created on April 4th 2019 to check nf-core/chipseq design file -####################################################################### -####################################################################### - -import os -import sys -import argparse - -############################################ -############################################ -## PARSE ARGUMENTS -############################################ -############################################ - -Description = 'Reformat nf-core/chipseq design file and check its contents.' -Epilog = """Example usage: python check_design.py """ - -argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) - -## REQUIRED PARAMETERS -argParser.add_argument('DESIGN_FILE', help="Input design file.") -argParser.add_argument('READ_MAPPING_FILE', help="Output design file containing sample ids and reads.") -argParser.add_argument('CONTROL_MAPPING_FILE', help="Output design file containing ip vs control mappings.") -args = argParser.parse_args() - -############################################ -############################################ -## MAIN FUNCTION -############################################ -############################################ - -def reformat_design(DesignFile,ReadMappingFile,ControlMappingFile): - - ERROR_STR = 'ERROR: Please check design file' - HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] - - ## CHECK HEADER - fin = open(DesignFile,'r') - header = fin.readline().strip().split(',') - if header != HEADER: - print("{} header: {} != {}".format(ERROR_STR,','.join(header),','.join(HEADER))) - sys.exit(1) - - numColList = [] - sampleMappingDict = {} - antibodyDict = {} - while True: - line = fin.readline() - if line: - lspl = [x.strip() for x in line.strip().split(',')] - group,replicate,fastQFiles,antibody,control = lspl[0],lspl[1],[x for x in lspl[2:-2] if x],lspl[-2],lspl[-1] - - ## CHECK VALID NUMBER OF COLUMNS PER SAMPLE - numCols = len(lspl) - if numCols not in [6]: - print("{}: Invalid number of columns (should be 6)!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - numColList.append(numCols) - - ## CHECK GROUP ID DOESNT CONTAIN SPACES - if group.find(' ') != -1: - print("{}: Group id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - - ## CHECK REPLICATE COLUMN IS INTEGER - if not replicate.isdigit(): - print("{}: Replicate id not an integer!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - replicate = int(replicate) - - for fastq in fastQFiles: - ## CHECK FASTQ FILE EXTENSION - if fastq[-9:] != '.fastq.gz' and fastq[-6:] != '.fq.gz': - print("{}: FastQ file has incorrect extension (has to be '.fastq.gz' or 'fq.gz') - {}\nLine: '{}'".format(ERROR_STR,fastq,line.strip())) - sys.exit(1) - - ## CREATE GROUP MAPPING DICT = {GROUP_ID: {REPLICATE_ID:[[FASTQ_FILES]]} - if group not in sampleMappingDict: - sampleMappingDict[group] = {} - if replicate not in sampleMappingDict[group]: - sampleMappingDict[group][replicate] = [] - sampleMappingDict[group][replicate].append(fastQFiles) - - ## CHECK BOTH ANTIBODY AND CONTROL COLUMNS HAVE VALID VALUES - if antibody: - if antibody.find(' ') != -1: - print("{}: Antibody id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - if not control: - print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - if control: - if control.find(' ') != -1: - print("{}: Control id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - if not antibody: - print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - - ## CREATE ANTIBODY MAPPING CONTROL DICT - if antibody and control: - antibodyDict[group] = (antibody,control) - - else: - fin.close() - break - - ## CHECK IF DATA IS PAIRED-END OR SINGLE-END AND NOT A MIXTURE - if min(numColList) != max(numColList): - print("{}: Mixture of paired-end and single-end reads!".format(ERROR_STR)) - sys.exit(1) - - ## CHECK IF ANTIBODY AND CONTROL COLUMNS HAVE BEEN SPECIFIED AT LEAST ONCE - if len(antibodyDict) == 0: - print("{}: Antibody and Control must be specified at least once!".format(ERROR_STR)) - sys.exit(1) - - ## WRITE READ MAPPING FILE - antibodyGroupDict = {} - fout = open(ReadMappingFile,'w') - fout.write(','.join(['sample_id','fastq_1','fastq_2']) + '\n') - for group in sorted(sampleMappingDict.keys()): - - ## CHECK THAT REPLICATE IDS ARE IN FORMAT 1.. - uniq_rep_ids = set(sampleMappingDict[group].keys()) - if len(uniq_rep_ids) != max(uniq_rep_ids): - print("{}: Replicate IDs must start with 1..\nGroup: {}, Replicate IDs: {}".format(ERROR_STR,group,list(uniq_rep_ids))) - sys.exit(1) - - ## RECONSTRUCT LINE FOR SAMPLE IN DESIGN - for replicate in sorted(sampleMappingDict[group].keys()): - for idx in range(len(sampleMappingDict[group][replicate])): - fastQFiles = sampleMappingDict[group][replicate][idx] - - ## GET SAMPLE_ID,FASTQ_1,FASTQ_2 COLUMNS - sample_id = "{}_R{}_T{}".format(group,replicate,idx+1) - oList = [sample_id] + fastQFiles - if len(fastQFiles) == 1: - oList += [''] - fout.write(','.join(oList) + '\n') - - ## EXTRAPOLATE CONTROL COLUMN - if group in antibodyDict: - antibody,control = antibodyDict[group] - if control in sampleMappingDict.keys(): - control_id = "{}_R1".format(control) - if replicate in sampleMappingDict[control]: - control_id = "{}_R{}".format(control,replicate) - if antibody not in antibodyGroupDict: - antibodyGroupDict[antibody] = {} - if group not in antibodyGroupDict[antibody]: - antibodyGroupDict[antibody][group] = [] - antibodyList = [sample_id[:-3],control_id] - if not antibodyList in antibodyGroupDict[antibody][group]: - antibodyGroupDict[antibody][group].append(antibodyList) - else: - print("{}: Control id not a valid group\nControl id: {}, Valid Groups: {}".format(ERROR_STR,control,sorted(sampleMappingDict.keys()))) - sys.exit(1) - fout.close() - - ## WRITE SAMPLE TO CONTROL MAPPING FILE - fout = open(ControlMappingFile,'w') - fout.write(','.join(['sample_id','control_id','antibody','replicatesExist','multipleGroups']) + '\n') - for antibody in sorted(antibodyGroupDict.keys()): - repsExist = '0' - if max([len(x) for x in antibodyGroupDict[antibody].values()]) > 1: - repsExist = '1' - multipleGroups = '0' - if len(antibodyGroupDict[antibody].keys()) > 1: - multipleGroups = '1' - for group in sorted(antibodyGroupDict[antibody].keys()): - for antibodyList in antibodyGroupDict[antibody][group]: - fout.write(','.join(antibodyList+[antibody,repsExist,multipleGroups]) + '\n') - fout.close() - -############################################ -############################################ -## RUN FUNCTION -############################################ -############################################ - -reformat_design(DesignFile=args.DESIGN_FILE,ReadMappingFile=args.READ_MAPPING_FILE,ControlMappingFile=args.CONTROL_MAPPING_FILE) - -############################################ -############################################ -############################################ -############################################ From 1da324507433a235f93cedc3bd8813e9ad0d432e Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:15:23 +0100 Subject: [PATCH 004/538] All uppercase --- conf/base.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index f6b9dec38..789af0d6c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -41,7 +41,7 @@ process { withLabel:error_ignore { errorStrategy = 'ignore' } - withName:get_software_versions { + withName:GET_SOFTWARE_VERSIONS { cache = false } From 5b543ca80c20310b1621c06ffa0682d6c965a7d2 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:15:33 +0100 Subject: [PATCH 005/538] Strip out boilerplate code --- main.nf | 2975 ++++++++++++++++++++++++------------------------------- 1 file changed, 1311 insertions(+), 1664 deletions(-) diff --git a/main.nf b/main.nf index fa9c455ac..4c63e5497 100755 --- a/main.nf +++ b/main.nf @@ -9,116 +9,25 @@ ---------------------------------------------------------------------------------------- */ -def helpMessage() { - log.info nfcoreHeader() - log.info""" - Usage: +nextflow.preview.dsl = 2 - The typical command for running the pipeline is as follows: - - nextflow run nf-core/chipseq --input design.csv --genome GRCh37 -profile docker - - Mandatory arguments: - --input [file] Comma-separated file containing information about the samples in the experiment (see docs/usage.md) (Default: './design.csv') - --fasta [file] Path to Fasta reference. Not mandatory when using reference in iGenomes config via --genome (Default: false) - --gtf [file] Path to GTF file. Not mandatory when using reference in iGenomes config via --genome (Default: false) - -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, awsbatch, test - - Generic - --single_end [bool] Specifies that the input is single-end reads (Default: false) - --seq_center [str] Sequencing center information to be added to read group of BAM files (Default: false) - --fragment_size [int] Estimated fragment size used to extend single-end reads (Default: 200) - --fingerprint_bins [int] Number of genomic bins to use when calculating fingerprint plot (Default: 500000) - - References If not specified in the configuration file or you wish to overwrite any of the references - --genome [str] Name of iGenomes reference (Default: false) - --bwa_index [file] Full path to directory containing BWA index including base name i.e. /path/to/index/genome.fa (Default: false) - --gene_bed [file] Path to BED file containing gene intervals (Default: false) - --macs_gsize [str] Effective genome size parameter required by MACS2. If using iGenomes config, values have only been provided when --genome is set as GRCh37, GRCm38, hg19, mm10, BDGP6 and WBcel235 (Default: false) - --blacklist [file] Path to blacklist regions (.BED format), used for filtering alignments (Default: false) - --save_reference [bool] If generated by the pipeline save the BWA index in the results directory (Default: false) - - Trimming - --clip_r1 [int] Instructs Trim Galore to remove bp from the 5' end of read 1 (or single-end reads) (Default: 0) - --clip_r2 [int] Instructs Trim Galore to remove bp from the 5' end of read 2 (paired-end reads only) (Default: 0) - --three_prime_clip_r1 [int] Instructs Trim Galore to remove bp from the 3' end of read 1 AFTER adapter/quality trimming has been performed (Default: 0) - --three_prime_clip_r2 [int] Instructs Trim Galore to re move bp from the 3' end of read 2 AFTER adapter/quality trimming has been performed (Default: 0) - --trim_nextseq [int] Instructs Trim Galore to apply the --nextseq=X option, to trim based on quality after removing poly-G tails (Default: 0) - --skip_trimming [bool] Skip the adapter trimming step (Default: false) - --save_trimmed [bool] Save the trimmed FastQ files in the results directory (Default: false) - - Alignments - --bwa_min_score [int] Don’t output BWA MEM alignments with score lower than this parameter (Default: false) - --keep_dups [bool] Duplicate reads are not filtered from alignments (Default: false) - --keep_multi_map [bool] Reads mapping to multiple locations are not filtered from alignments (Default: false) - --save_align_intermeds [bool] Save the intermediate BAM files from the alignment step - not done by default (Default: false) - - Peaks - --narrow_peak [bool] Run MACS2 in narrowPeak mode (Default: false) - --broad_cutoff [float] Specifies broad cutoff value for MACS2. Only used when --narrow_peak isnt specified (Default: 0.1) - --macs_fdr [float] Minimum FDR (q-value) cutoff for peak detection, --macs_fdr and --macs_pvalue are mutually exclusive (Default: false) - --macs_pvalue [float] p-value cutoff for peak detection, --macs_fdr and --macs_pvalue are mutually exclusive (Default: false) - --min_reps_consensus [int] Number of biological replicates required from a given condition for a peak to contribute to a consensus peak (Default: 1) - --save_macs_pileup [bool] Instruct MACS2 to create bedGraph files normalised to signal per million reads (Default: false) - --skip_peak_qc [bool] Skip MACS2 peak QC plot generation (Default: false) - --skip_peak_annotation [bool] Skip annotation of MACS2 and consensus peaks with HOMER (Default: false) - --skip_consensus_peaks [bool] Skip consensus peak generation (Default: false) - - Differential analysis - --deseq2_vst [bool] Use vst transformation instead of rlog with DESeq2 (Default: false) - --skip_diff_analysis [bool] Skip differential accessibility analysis (Default: false) - - QC - --skip_fastqc [bool] Skip FastQC (Default: false) - --skip_picard_metrics [bool] Skip Picard CollectMultipleMetrics (Default: false) - --skip_preseq [bool] Skip Preseq (Default: false) - --skip_plot_profile [bool] Skip deepTools plotProfile (Default: false) - --skip_plot_fingerprint [bool] Skip deepTools plotFingerprint (Default: false) - --skip_spp [bool] Skip Phantompeakqualtools (Default: false) - --skip_igv [bool] Skip IGV (Default: false) - --skip_multiqc [bool] Skip MultiQC (Default: false) - - Other - --outdir [file] The output directory where the results will be saved (Default: './results') - --publish_dir_mode [str] Mode for publishing results in the output directory. Available: symlink, rellink, link, copy, copyNoFollow, move (Default: copy) - --email [email] Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits (Default: false) - --email_on_fail [email] Same as --email, except only send mail if the workflow is not successful (Default: false) - --max_multiqc_email_size [str] Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) - -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic (Default: false) - - AWSBatch options: - --awsqueue [str] The AWSBatch JobQueue that needs to be set when running on AWSBatch - --awsregion [str] The AWS Region for your AWS Batch job to run on - --awscli [str] Path to the AWS CLI tool - """.stripIndent() -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- SET UP CONFIGURATION VARIABLES -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Show help message +/* + * Print help message if required + */ if (params.help) { - helpMessage() + def command = "nextflow run nf-core/chipseq --input design.csv --genome GRCh37 -profile docker" + log.info Headers.nf_core(workflow, params.monochrome_logs) + log.info Schema.params_help("$baseDir/nextflow_schema.json", command) exit 0 } -// Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name -custom_runName = params.name -if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - custom_runName = workflow.runName -} - //////////////////////////////////////////////////// /* -- DEFAULT PARAMETER VALUES -- */ //////////////////////////////////////////////////// +/* + * Reference genomes + */ // Check if genome exists in the config file if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" @@ -136,37 +45,13 @@ params.anno_readme = params.genome ? params.genomes[ params.genome ].readme ?: f // Global variables def PEAK_TYPE = params.narrow_peak ? 'narrowPeak' : 'broadPeak' -//////////////////////////////////////////////////// -/* -- CONFIG FILES -- */ -//////////////////////////////////////////////////// - -// Pipeline config -ch_multiqc_config = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() -ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) -ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) - -// JSON files required by BAMTools for alignment filtering -if (params.single_end) { - ch_bamtools_filter_config = file(params.bamtools_filter_se_config, checkIfExists: true) -} else { - ch_bamtools_filter_config = file(params.bamtools_filter_pe_config, checkIfExists: true) -} - -// Header files for MultiQC -ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) -ch_frip_score_header = file("$baseDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) -ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) -ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) -ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) -ch_spp_correlation_header = file("$baseDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) -ch_spp_nsc_header = file("$baseDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) -ch_spp_rsc_header = file("$baseDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) - //////////////////////////////////////////////////// /* -- VALIDATE INPUTS -- */ //////////////////////////////////////////////////// +/* + * Validate parameters + */ if (params.input) { ch_input = file(params.input, checkIfExists: true) } else { exit 1, 'Samples design file not specified!' } if (params.gtf) { ch_gtf = file(params.gtf, checkIfExists: true) } else { exit 1, 'GTF annotation file not specified!' } if (params.gene_bed) { ch_gene_bed = file(params.gene_bed, checkIfExists: true) } @@ -195,1572 +80,1334 @@ if (params.anno_readme && file(params.anno_readme).exists()) { file(params.anno_readme).copyTo("${params.outdir}/genome/") } -//////////////////////////////////////////////////// -/* -- AWS -- */ -//////////////////////////////////////////////////// - -if (workflow.profile.contains('awsbatch')) { - // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, 'Specify correct --awsqueue and --awsregion parameters on AWSBatch!' - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, 'Outdir not on S3 - specify S3 Bucket to run on AWSBatch!' - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (params.tracedir.startsWith('s3:')) exit 1, 'Specify a local tracedir or run without trace! S3 cannot be used for tracefiles.' -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- HEADER LOG INFO -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Header log info -log.info nfcoreHeader() -def summary = [:] -summary['Run Name'] = custom_runName ?: workflow.runName -summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' -summary['Design File'] = params.input -summary['Genome'] = params.genome ?: 'Not supplied' -summary['Fasta File'] = params.fasta -summary['GTF File'] = params.gtf -if (params.gene_bed) summary['Gene BED File'] = params.gene_bed -if (params.bwa_index) summary['BWA Index'] = params.bwa_index -if (params.blacklist) summary['Blacklist BED'] = params.blacklist -if (params.bwa_min_score) summary['BWA Min Score'] = params.bwa_min_score -summary['MACS2 Genome Size'] = params.macs_gsize ?: 'Not supplied' -summary['Min Consensus Reps'] = params.min_reps_consensus -if (params.macs_gsize) summary['MACS2 Narrow Peaks'] = params.narrow_peak ? 'Yes' : 'No' -if (!params.narrow_peak) summary['MACS2 Broad Cutoff'] = params.broad_cutoff -if (params.macs_fdr) summary['MACS2 FDR'] = params.macs_fdr -if (params.macs_pvalue) summary['MACS2 P-value'] = params.macs_pvalue -if (params.skip_trimming) { - summary['Trimming Step'] = 'Skipped' -} else { - summary['Trim R1'] = "$params.clip_r1 bp" - summary['Trim R2'] = "$params.clip_r2 bp" - summary["Trim 3' R1"] = "$params.three_prime_clip_r1 bp" - summary["Trim 3' R2"] = "$params.three_prime_clip_r2 bp" - summary['NextSeq Trim'] = "$params.trim_nextseq bp" -} -if (params.seq_center) summary['Sequencing Center'] = params.seq_center -if (params.single_end) summary['Fragment Size'] = "$params.fragment_size bp" -summary['Fingerprint Bins'] = params.fingerprint_bins -if (params.keep_dups) summary['Keep Duplicates'] = 'Yes' -if (params.keep_multi_map) summary['Keep Multi-mapped'] = 'Yes' -summary['Save Genome Index'] = params.save_reference ? 'Yes' : 'No' -if (params.save_trimmed) summary['Save Trimmed'] = 'Yes' -if (params.save_align_intermeds) summary['Save Intermeds'] = 'Yes' -if (params.save_macs_pileup) summary['Save MACS2 Pileup'] = 'Yes' -if (params.skip_peak_qc) summary['Skip MACS2 Peak QC'] = 'Yes' -if (params.skip_peak_annotation) summary['Skip Peak Annotation'] = 'Yes' -if (params.skip_consensus_peaks) summary['Skip Consensus Peaks'] = 'Yes' -if (params.deseq2_vst) summary['Use DESeq2 vst Transform'] = 'Yes' -if (params.skip_diff_analysis) summary['Skip Differential Analysis'] = 'Yes' -if (params.skip_fastqc) summary['Skip FastQC'] = 'Yes' -if (params.skip_picard_metrics) summary['Skip Picard Metrics'] = 'Yes' -if (params.skip_preseq) summary['Skip Preseq'] = 'Yes' -if (params.skip_plot_profile) summary['Skip plotProfile'] = 'Yes' -if (params.skip_plot_fingerprint) summary['Skip plotFingerprint'] = 'Yes' -if (params.skip_spp) summary['Skip spp'] = 'Yes' -if (params.skip_igv) summary['Skip IGV'] = 'Yes' -if (params.skip_multiqc) summary['Skip MultiQC'] = 'Yes' -summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" -if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" -summary['Output Dir'] = params.outdir -summary['Launch Dir'] = workflow.launchDir -summary['Working Dir'] = workflow.workDir -summary['Script Dir'] = workflow.projectDir -summary['User'] = workflow.userName -if (workflow.profile.contains('awsbatch')) { - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue - summary['AWS CLI'] = params.awscli -} -summary['Config Profile'] = workflow.profile -if (params.config_profile_description) summary['Config Description'] = params.config_profile_description -if (params.config_profile_contact) summary['Config Contact'] = params.config_profile_contact -if (params.config_profile_url) summary['Config URL'] = params.config_profile_url -if (params.email || params.email_on_fail) { - summary['E-mail Address'] = params.email - summary['E-mail on failure'] = params.email_on_fail - summary['MultiQC Max Size'] = params.max_multiqc_email_size -} -log.info summary.collect { k,v -> "${k.padRight(20)}: $v" }.join('\n') -log.info "-\033[2m--------------------------------------------------\033[0m-" - -// Check the hostnames against configured profiles -checkHostname() - -// Show a big warning message if we're not running MACS -if (!params.macs_gsize) { - def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' - log.warn "=================================================================\n" + - " WARNING! MACS genome size parameter not $warnstring.\n" + - " Peak calling, annotation and differential analysis will be skipped.\n" + - " Please specify value for '--macs_gsize' to run these steps.\n" + - "=======================================================================" -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- PARSE DESIGN FILE -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * PREPROCESSING: Reformat design file, check validitiy and create IP vs control mappings - */ -process CHECK_DESIGN { - tag "$design" - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode - - input: - path design from ch_input - - output: - path 'design_reads.csv' into ch_design_reads_csv - path 'design_controls.csv' into ch_design_controls_csv - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - check_design.py $design design_reads.csv design_controls.csv - """ -} - -/* - * Create channels for input fastq files - */ -if (params.single_end) { - ch_design_reads_csv - .splitCsv(header:true, sep:',') - .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true) ] ] } - .into { ch_raw_reads_fastqc; - ch_raw_reads_trimgalore } -} else { - ch_design_reads_csv - .splitCsv(header:true, sep:',') - .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] } - .into { ch_raw_reads_fastqc; - ch_raw_reads_trimgalore } -} - -/* - * Create a channel with [sample_id, control id, antibody, replicatesExist, multipleGroups] - */ -ch_design_controls_csv - .splitCsv(header:true, sep:',') - .map { row -> [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] } - .set { ch_design_controls_csv } - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- PREPARE ANNOTATION FILES -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * PREPROCESSING: Build BWA index - */ -if (!params.bwa_index) { - process BWA_INDEX { - tag "$fasta" - label 'process_high' - publishDir path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - saveAs: { params.save_reference ? it : null }, mode: params.publish_dir_mode - - input: - path fasta from ch_fasta - - output: - path 'BWAIndex' into ch_bwa_index - - script: - """ - bwa index -a bwtsw $fasta - mkdir BWAIndex && mv ${fasta}* BWAIndex - """ - } -} - -/* - * PREPROCESSING: Generate gene BED file - */ -// If --gtf is supplied along with --genome -// Make gene bed from supplied --gtf instead of using iGenomes one automatically -def MAKE_BED = false -if (!params.gene_bed) { - MAKE_BED = true -} else if (params.genome && params.gtf) { - if (params.genomes[ params.genome ].gtf != params.gtf) { - MAKE_BED = true - } -} -if (MAKE_BED) { - process MAKE_GENE_BED { - tag "$gtf" - label 'process_low' - publishDir "${params.outdir}/genome", mode: params.publish_dir_mode - - input: - path gtf from ch_gtf - - output: - path '*.bed' into ch_gene_bed - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - gtf2bed $gtf > ${gtf.baseName}.bed - """ - } -} - -/* - * PREPROCESSING: Prepare genome intervals for filtering - */ -process MAKE_GENOME_FILTER { - tag "$fasta" - publishDir "${params.outdir}/genome", mode: params.publish_dir_mode - - input: - path fasta from ch_fasta - path blacklist from ch_blacklist.ifEmpty([]) - - output: - path "$fasta" // FASTA FILE FOR IGV - path '*.fai' // FAI INDEX FOR REFERENCE GENOME - path '*.bed' into ch_genome_filter_regions // BED FILE WITHOUT BLACKLIST REGIONS - path '*.sizes' into ch_genome_sizes_bigwig // CHROMOSOME SIZES FILE FOR BEDTOOLS - - script: - blacklist_filter = params.blacklist ? "sortBed -i $blacklist -g ${fasta}.sizes | complementBed -i stdin -g ${fasta}.sizes" : "awk '{print \$1, '0' , \$2}' OFS='\t' ${fasta}.sizes" - """ - samtools faidx $fasta - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - $blacklist_filter > ${fasta}.include_regions.bed - """ -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- FASTQ QC -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * STEP 1: FastQC - */ -process FASTQC { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, - saveAs: { filename -> - filename.endsWith('.zip') ? "zips/$filename" : filename - } - - when: - !params.skip_fastqc - - input: - tuple val(name), path(reads) from ch_raw_reads_fastqc - - output: - path '*.{zip,html}' into ch_fastqc_reports_mqc - - script: - // Added soft-links to original fastqs for consistent naming in MultiQC - if (params.single_end) { - """ - [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - fastqc -q -t $task.cpus ${name}.fastq.gz - """ - } else { - """ - [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz - [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - fastqc -q -t $task.cpus ${name}_1.fastq.gz - fastqc -q -t $task.cpus ${name}_2.fastq.gz - """ - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- ADAPTER TRIMMING -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * STEP 2: Trim Galore! - */ -if (params.skip_trimming) { - ch_trimmed_reads = ch_raw_reads_trimgalore - ch_trimgalore_results_mqc = Channel.empty() - ch_trimgalore_fastqc_reports_mqc = Channel.empty() -} else { - process TRIMGALORE { - tag "$name" - label 'process_high' - publishDir "${params.outdir}/trim_galore", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.html')) "fastqc/$filename" - else if (filename.endsWith('.zip')) "fastqc/zips/$filename" - else if (filename.endsWith('trimming_report.txt')) "logs/$filename" - else params.save_trimmed ? filename : null - } - - input: - tuple val(name), path(reads) from ch_raw_reads_trimgalore - - output: - tuple val(name), path('*.fq.gz') into ch_trimmed_reads - path '*.txt' into ch_trimgalore_results_mqc - path '*.{zip,html}' into ch_trimgalore_fastqc_reports_mqc - - script: - // Calculate number of --cores for TrimGalore based on value of task.cpus - // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 - // See: https://github.com/nf-core/atacseq/pull/65 - def cores = 1 - if (task.cpus) { - cores = (task.cpus as int) - 4 - if (params.single_end) cores = (task.cpus as int) - 3 - if (cores < 1) cores = 1 - if (cores > 4) cores = 4 - } - - c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' - c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' - tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' - tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' - nextseq = params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' - - // Added soft-links to original fastqs for consistent naming in MultiQC - if (params.single_end) { - """ - [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - trim_galore --cores $cores --fastqc --gzip $c_r1 $tpc_r1 $nextseq ${name}.fastq.gz - """ - } else { - """ - [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz - [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - trim_galore --cores $cores --paired --fastqc --gzip $c_r1 $c_r2 $tpc_r1 $tpc_r2 $nextseq ${name}_1.fastq.gz ${name}_2.fastq.gz - """ - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- ALIGN -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * STEP 3.1: Map read(s) with bwa mem - */ -process BWA_MEM { - tag "$name" - label 'process_high' - - input: - tuple val(name), path(reads) from ch_trimmed_reads - path index from ch_bwa_index.collect() - - output: - tuple val(name), path('*.bam') into ch_bwa_bam - - script: - prefix = "${name}.Lb" - rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\'" - if (params.seq_center) { - rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\\tCN:${params.seq_center}\'" - } - score = params.bwa_min_score ? "-T ${params.bwa_min_score}" : '' - """ - bwa mem \\ - -t $task.cpus \\ - -M \\ - -R $rg \\ - $score \\ - ${index}/${bwa_base} \\ - $reads \\ - | samtools view -@ $task.cpus -b -h -F 0x0100 -O BAM -o ${prefix}.bam - - """ -} - -/* - * STEP 3.2: Convert BAM to coordinate sorted BAM - */ -process SORT_BAM { - tag "$name" - label 'process_medium' - if (params.save_align_intermeds) { - publishDir path: "${params.outdir}/bwa/library", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.flagstat')) "samtools_stats/$filename" - else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" - else if (filename.endsWith('.stats')) "samtools_stats/$filename" - else filename - } - } - - input: - tuple val(name), path(bam) from ch_bwa_bam - - output: - tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_sort_bam_merge - path '*.{flagstat,idxstats,stats}' into ch_sort_bam_flagstat_mqc - - script: - prefix = "${name}.Lb" - """ - samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam - samtools index ${prefix}.sorted.bam - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - """ -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- MERGE LIBRARY BAM -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - /* - * STEP 4.1: Merge BAM files for all libraries from same sample replicate + * Check parameters */ -ch_sort_bam_merge - .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1] ] } - .groupTuple(by: [0]) - .map { it -> [ it[0], it[1].flatten() ] } - .set { ch_sort_bam_merge } +Checks.aws_batch(workflow, params) // Check AWS batch settings +Checks.hostname(workflow, params, log) // Check the hostnames against configured profiles +Checks.macs2_warn(params, log) // Show a big warning message if we're not running MACS -process MERGED_BAM { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.flagstat')) "samtools_stats/$filename" - else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" - else if (filename.endsWith('.stats')) "samtools_stats/$filename" - else if (filename.endsWith('.metrics.txt')) "picard_metrics/$filename" - else params.save_align_intermeds ? filename : null - } - - input: - tuple val(name), path(bams) from ch_sort_bam_merge - - output: - tuple val(name), path("*${prefix}.sorted.{bam,bam.bai}") into ch_merge_bam_filter, - ch_merge_bam_preseq - path '*.{flagstat,idxstats,stats}' into ch_merge_bam_stats_mqc - path '*.txt' into ch_merge_bam_metrics_mqc - - script: - prefix = "${name}.mLb.mkD" - bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.toGiga() - } - if (bam_files.size() > 1) { - """ - picard -Xmx${avail_mem}g MergeSamFiles \\ - ${'INPUT='+bam_files.join(' INPUT=')} \\ - OUTPUT=${name}.sorted.bam \\ - SORT_ORDER=coordinate \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp - samtools index ${name}.sorted.bam - - picard -Xmx${avail_mem}g MarkDuplicates \\ - INPUT=${name}.sorted.bam \\ - OUTPUT=${prefix}.sorted.bam \\ - ASSUME_SORTED=true \\ - REMOVE_DUPLICATES=false \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp - - samtools index ${prefix}.sorted.bam - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - """ - } else { - """ - picard -Xmx${avail_mem}g MarkDuplicates \\ - INPUT=${bam_files[0]} \\ - OUTPUT=${prefix}.sorted.bam \\ - ASSUME_SORTED=true \\ - REMOVE_DUPLICATES=false \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp - - samtools index ${prefix}.sorted.bam - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - """ - } -} +//////////////////////////////////////////////////// +/* -- CONFIG FILES -- */ +//////////////////////////////////////////////////// /* - * STEP 4.2: Filter BAM file at merged library-level + * Stage config files */ -process MERGED_BAM_FILTER { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, - saveAs: { filename -> - if (params.single_end || params.save_align_intermeds) { - if (filename.endsWith('.flagstat')) "samtools_stats/$filename" - else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" - else if (filename.endsWith('.stats')) "samtools_stats/$filename" - else if (filename.endsWith('.sorted.bam')) filename - else if (filename.endsWith('.sorted.bam.bai')) filename - else null - } - } - - input: - tuple val(name), path(bam) from ch_merge_bam_filter - path bed from ch_genome_filter_regions.collect() - path bamtools_filter_config from ch_bamtools_filter_config - - output: - tuple val(name), path('*.{bam,bam.bai}') into ch_filter_bam - tuple val(name), path('*.flagstat') into ch_filter_bam_flagstat - path '*.{idxstats,stats}' into ch_filter_bam_stats_mqc - - script: - prefix = params.single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" - filter_params = params.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' - dup_params = params.keep_dups ? '' : '-F 0x0400' - multimap_params = params.keep_multi_map ? '' : '-q 1' - blacklist_params = params.blacklist ? "-L $bed" : '' - name_sort_bam = params.single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" - """ - samtools view \\ - $filter_params \\ - $dup_params \\ - $multimap_params \\ - $blacklist_params \\ - -b ${bam[0]} \\ - | bamtools filter \\ - -out ${prefix}.sorted.bam \\ - -script $bamtools_filter_config - - samtools index ${prefix}.sorted.bam - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - - $name_sort_bam - """ -} +ch_multiqc_config = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() +ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) +ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) -/* - * STEP 4.3: Remove orphan reads from paired-end BAM file - */ +// JSON files required by BAMTools for alignment filtering if (params.single_end) { - ch_filter_bam - .into { ch_rm_orphan_bam_metrics; - ch_rm_orphan_bam_bigwig; - ch_rm_orphan_bam_macs_1; - ch_rm_orphan_bam_macs_2; - ch_rm_orphan_bam_phantompeakqualtools; - ch_rm_orphan_name_bam_counts } - - ch_filter_bam_flagstat - .into { ch_rm_orphan_flagstat_bigwig; - ch_rm_orphan_flagstat_macs; - ch_rm_orphan_flagstat_mqc } - - ch_filter_bam_stats_mqc - .set { ch_rm_orphan_stats_mqc } + ch_bamtools_filter_config = file(params.bamtools_filter_se_config, checkIfExists: true) } else { - process MERGED_BAM_REMOVE_ORPHAN { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.flagstat')) "samtools_stats/$filename" - else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" - else if (filename.endsWith('.stats')) "samtools_stats/$filename" - else if (filename.endsWith('.sorted.bam')) filename - else if (filename.endsWith('.sorted.bam.bai')) filename - else null - } - - input: - tuple val(name), path(bam) from ch_filter_bam - - output: - tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_rm_orphan_bam_metrics, - ch_rm_orphan_bam_bigwig, - ch_rm_orphan_bam_macs_1, - ch_rm_orphan_bam_macs_2, - ch_rm_orphan_bam_phantompeakqualtools - tuple val(name), path("${prefix}.bam") into ch_rm_orphan_name_bam_counts - tuple val(name), path('*.flagstat') into ch_rm_orphan_flagstat_bigwig, - ch_rm_orphan_flagstat_macs, - ch_rm_orphan_flagstat_mqc - path '*.{idxstats,stats}' into ch_rm_orphan_stats_mqc - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - prefix = "${name}.mLb.clN" - """ - bampe_rm_orphan.py ${bam[0]} ${prefix}.bam --only_fr_pairs - - samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix ${prefix}.bam - samtools index ${prefix}.sorted.bam - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - """ - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- MERGE LIBRARY BAM POST-ANALYSIS -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * STEP 5.1: Preseq analysis after merging libraries and before filtering - */ -process PRESEQ { - tag "$name" - label 'process_medium' - label 'error_ignore' - publishDir "${params.outdir}/bwa/mergedLibrary/preseq", mode: params.publish_dir_mode - - when: - !params.skip_preseq - - input: - tuple val(name), path(bam) from ch_merge_bam_preseq - - output: - path '*.ccurve.txt' into ch_preseq_mqc - path '*.log' - - script: - pe = params.single_end ? '' : '-pe' - """ - preseq lc_extrap \\ - -output ${name}.ccurve.txt \\ - -verbose \\ - -bam \\ - $pe \\ - -seed 1 \\ - ${bam[0]} - cp .command.err ${name}.command.log - """ -} - -/* - * STEP 5.2: Picard CollectMultipleMetrics after merging libraries and filtering - */ -process PICARD_METRICS { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('_metrics')) "picard_metrics/$filename" - else if (filename.endsWith('.pdf')) "picard_metrics/pdf/$filename" - else null - } - - when: - !params.skip_picard_metrics - - input: - tuple val(name), path(bam) from ch_rm_orphan_bam_metrics - path fasta from ch_fasta - - output: - path '*_metrics' into ch_collectmetrics_mqc - path '*.pdf' - - script: - prefix = "${name}.mLb.clN" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.toGiga() - } - """ - picard -Xmx${avail_mem}g CollectMultipleMetrics \\ - INPUT=${bam[0]} \\ - OUTPUT=${prefix}.CollectMultipleMetrics \\ - REFERENCE_SEQUENCE=$fasta \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp - """ -} - -/* - * STEP 5.3: Read depth normalised bigWig - */ -process BIGWIG { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/bigwig", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('scale_factor.txt')) "scale/$filename" - else if (filename.endsWith('.bigWig')) filename - else null - } - - input: - tuple val(name), path(bam), path(flagstat) from ch_rm_orphan_bam_bigwig.join(ch_rm_orphan_flagstat_bigwig, by: [0]) - path sizes from ch_genome_sizes_bigwig.collect() - - output: - tuple val(name), path('*.bigWig') into ch_bigwig_plotprofile - path '*igv.txt' into ch_bigwig_igv - path '*scale_factor.txt' - - script: - pe_fragment = params.single_end ? '' : '-pc' - extend = (params.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' - """ - SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') - echo \$SCALE_FACTOR > ${name}.scale_factor.txt - genomeCoverageBed -ibam ${bam[0]} -bg -scale \$SCALE_FACTOR $pe_fragment $extend | sort -T '.' -k1,1 -k2,2n > ${name}.bedGraph - - bedGraphToBigWig ${name}.bedGraph $sizes ${name}.bigWig - - find * -type f -name "*.bigWig" -exec echo -e "bwa/mergedLibrary/bigwig/"{}"\\t0,0,178" \\; > ${name}.bigWig.igv.txt - """ -} - -/* - * STEP 5.4: Generate gene body coverage plot with deepTools plotProfile and plotHeatmap - */ -process PLOTPROFILE { - tag "$name" - label 'process_high' - publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotProfile", mode: params.publish_dir_mode - - when: - !params.skip_plot_profile - - input: - tuple val(name), path(bigwig) from ch_bigwig_plotprofile - path bed from ch_gene_bed - - output: - path '*.plotProfile.tab' into ch_plotprofile_mqc - path '*.{gz,pdf,mat.tab}' - - script: - """ - computeMatrix scale-regions \\ - --regionsFileName $bed \\ - --scoreFileName $bigwig \\ - --outFileName ${name}.computeMatrix.mat.gz \\ - --outFileNameMatrix ${name}.computeMatrix.vals.mat.tab \\ - --regionBodyLength 1000 \\ - --beforeRegionStartLength 3000 \\ - --afterRegionStartLength 3000 \\ - --skipZeros \\ - --smartLabels \\ - --numberOfProcessors $task.cpus - - plotProfile --matrixFile ${name}.computeMatrix.mat.gz \\ - --outFileName ${name}.plotProfile.pdf \\ - --outFileNameData ${name}.plotProfile.tab - - plotHeatmap --matrixFile ${name}.computeMatrix.mat.gz \\ - --outFileName ${name}.plotHeatmap.pdf \\ - --outFileNameMatrix ${name}.plotHeatmap.mat.tab - """ -} - -/* - * STEP 5.5: Phantompeakqualtools - */ -process PHANTOMPEAKQUALTOOLS { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/phantompeakqualtools", mode: params.publish_dir_mode - - when: - !params.skip_spp - - input: - tuple val(name), path(bam) from ch_rm_orphan_bam_phantompeakqualtools - path spp_correlation_header from ch_spp_correlation_header - path spp_nsc_header from ch_spp_nsc_header - path spp_rsc_header from ch_spp_rsc_header - - output: - path '*.spp.out' into ch_spp_out_mqc - path '*_mqc.tsv' into ch_spp_csv_mqc - path '*.pdf' - - script: - """ - RUN_SPP=`which run_spp.R` - Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="${bam[0]}" -savp="${name}.spp.pdf" -savd="${name}.spp.Rdata" -out="${name}.spp.out" -p=$task.cpus - cp $spp_correlation_header ${name}_spp_correlation_mqc.tsv - Rscript -e "load('${name}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${name}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" - - awk -v OFS='\t' '{print "${name}", \$9}' ${name}.spp.out | cat $spp_nsc_header - > ${name}_spp_nsc_mqc.tsv - awk -v OFS='\t' '{print "${name}", \$10}' ${name}.spp.out | cat $spp_rsc_header - > ${name}_spp_rsc_mqc.tsv - """ -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- MERGE LIBRARY PEAK ANALYSIS -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Create channel linking IP bams with control bams -ch_rm_orphan_bam_macs_1 - .combine(ch_rm_orphan_bam_macs_2) - .set { ch_rm_orphan_bam_macs_1 } - -ch_design_controls_csv - .combine(ch_rm_orphan_bam_macs_1) - .filter { it[0] == it[5] && it[1] == it[7] } - .join(ch_rm_orphan_flagstat_macs) - .map { it -> it[2..-1] } - .into { ch_group_bam_macs; - ch_group_bam_plotfingerprint; - ch_group_bam_counts } - -/* - * STEP 6.1: deepTools plotFingerprint - */ -process PLOTFINGERPRINT { - tag "${ip} vs ${control}" - label 'process_high' - publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotFingerprint", mode: params.publish_dir_mode - - when: - !params.skip_plot_fingerprint - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_plotfingerprint - - output: - path '*.raw.txt' into ch_plotfingerprint_mqc - path '*.{txt,pdf}' - - script: - extend = (params.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' - """ - plotFingerprint \\ - --bamfiles ${ipbam[0]} ${controlbam[0]} \\ - --plotFile ${ip}.plotFingerprint.pdf \\ - $extend \\ - --labels $ip $control \\ - --outRawCounts ${ip}.plotFingerprint.raw.txt \\ - --outQualityMetrics ${ip}.plotFingerprint.qcmetrics.txt \\ - --skipZeros \\ - --JSDsample ${controlbam[0]} \\ - --numberOfProcessors $task.cpus \\ - --numberOfSamples $params.fingerprint_bins - """ -} - -/* - * STEP 6.2: Call peaks with MACS2 and calculate FRiP score - */ -process MACS2 { - tag "${ip} vs ${control}" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.tsv')) "qc/$filename" - else if (filename.endsWith('.igv.txt')) null - else filename - } - - when: - params.macs_gsize - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_macs - path peak_count_header from ch_peak_count_header - path frip_score_header from ch_frip_score_header - - output: - tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path("*.$PEAK_TYPE") into ch_macs_homer, - ch_macs_qc, - ch_macs_consensus - path '*igv.txt' into ch_macs_igv - path '*_mqc.tsv' into ch_macs_mqc - path '*.{bed,xls,gappedPeak,bdg}' - - script: - broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" - format = params.single_end ? 'BAM' : 'BAMPE' - pileup = params.save_macs_pileup ? '-B --SPMR' : '' - fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' - pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' - """ - macs2 callpeak \\ - -t ${ipbam[0]} \\ - -c ${controlbam[0]} \\ - $broad \\ - -f $format \\ - -g $params.macs_gsize \\ - -n $ip \\ - $pileup \\ - $fdr \\ - $pvalue \\ - --keep-dup all - - cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv - - READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') - grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv - - find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt - """ -} - -/* - * STEP 6.3: Annotate peaks with HOMER - */ -process MACS2_ANNOTATE { - tag "${ip} vs ${control}" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode - - when: - params.macs_gsize && !params.skip_peak_annotation - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path(peak) from ch_macs_homer - path fasta from ch_fasta - path gtf from ch_gtf - - output: - path '*.txt' into ch_macs_annotate - - script: - """ - annotatePeaks.pl \\ - $peak \\ - $fasta \\ - -gid \\ - -gtf $gtf \\ - -cpu $task.cpus \\ - > ${ip}_peaks.annotatePeaks.txt - """ -} - -/* - * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation - */ -process MACS2_QC { - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode - - when: - params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc - - input: - path peaks from ch_macs_qc.collect{ it[-1] } - path annos from ch_macs_annotate.collect() - path peak_annotation_header from ch_peak_annotation_header - - output: - path '*.tsv' into ch_macs_qc_mqc - path '*.{txt,pdf}' - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - plot_macs_qc.r \\ - -i ${peaks.join(',')} \\ - -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ - -o ./ \\ - -p macs_peak - - plot_homer_annotatepeaks.r \\ - -i ${annos.join(',')} \\ - -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ - -o ./ \\ - -p macs_annotatePeaks - - cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv - """ -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- CONSENSUS PEAKS ANALYSIS -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Group by ip from this point and carry forward boolean variables -ch_macs_consensus - .map { it -> [ it[0], it[1], it[2], it[-1] ] } - .groupTuple() - .map { it -> [ it[0], it[1][0], it[2][0], it[3].sort() ] } - .set { ch_macs_consensus } - -/* - * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection - */ -process CONSENSUS_PEAKS { - tag "${antibody}" - label 'process_long' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.igv.txt')) null - else filename - } - - when: - params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path(peaks) from ch_macs_consensus - - output: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*.bed') into ch_macs_consensus_bed - tuple val(antibody), path('*.saf') into ch_macs_consensus_saf - path '*.boolean.txt' into ch_macs_consensus_bool - path '*igv.txt' into ch_macs_consensus_igv - path '*.intersect.{txt,plot.pdf}' - - script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ - prefix = "${antibody}.consensus_peaks" - mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') - collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') - expandparam = params.narrow_peak ? '--is_narrow_peak' : '' - """ - sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ - | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt - - macs2_merged_expand.py ${prefix}.txt \\ - ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ - ${prefix}.boolean.txt \\ - --min_replicates $params.min_reps_consensus \\ - $expandparam - - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed - - echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf - - plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf - - find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt - """ -} - -/* - * STEP 7.2: Annotate consensus peaks with HOMER, and add annotation to boolean output file - */ -process CONSENSUS_PEAKS_ANNOTATE { - tag "${antibody}" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode - - when: - params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks && !params.skip_peak_annotation - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bed) from ch_macs_consensus_bed - path bool from ch_macs_consensus_bool - path fasta from ch_fasta - path gtf from ch_gtf - - output: - path '*.annotatePeaks.txt' - - script: - prefix = "${antibody}.consensus_peaks" - """ - annotatePeaks.pl \\ - $bed \\ - $fasta \\ - -gid \\ - -gtf $gtf \\ - -cpu $task.cpus \\ - > ${prefix}.annotatePeaks.txt - - cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - """ -} - -// Get BAM and SAF files for each ip -ch_group_bam_counts - .map { it -> [ it[3], [ it[0], it[1], it[2] ] ] } - .join(ch_rm_orphan_name_bam_counts) - .map { it -> [ it[1][0], it[1][1], it[1][2], it[2] ] } - .groupTuple() - .map { it -> [ it[0], it[1][0], it[2][0], it[3].flatten().sort() ] } - .join(ch_macs_consensus_saf) - .set { ch_group_bam_counts } - -/* - * STEP 7.3: Count reads in consensus peaks with featureCounts - */ -process CONSENSUS_PEAKS_COUNTS { - tag "${antibody}" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode - - when: - params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bams), path(saf) from ch_group_bam_counts - - output: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*featureCounts.txt') into ch_macs_consensus_counts - path '*featureCounts.txt.summary' into ch_macs_consensus_counts_mqc - - script: - prefix = "${antibody}.consensus_peaks" - bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() - pe_params = params.single_end ? '' : '-p --donotsort' - """ - featureCounts \\ - -F SAF \\ - -O \\ - --fracOverlap 0.2 \\ - -T $task.cpus \\ - $pe_params \\ - -a $saf \\ - -o ${prefix}.featureCounts.txt \\ - ${bam_files.join(' ')} - """ -} - -/* - * STEP 7.4: Differential analysis with DESeq2 - */ -process CONSENSUS_PEAKS_DESEQ2 { - tag "${antibody}" - label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.igv.txt')) null - else filename - } - - when: - params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis - - input: - tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts - path deseq2_pca_header from ch_deseq2_pca_header - path deseq2_clustering_header from ch_deseq2_clustering_header - - output: - path '*.tsv' into ch_macs_consensus_deseq_mqc - path '*igv.txt' into ch_macs_consensus_deseq_comp_igv - path '*.{RData,results.txt,pdf,log}' - path 'sizeFactors' - path '*vs*/*.{pdf,txt}' - path '*vs*/*.bed' - - script: - prefix = "${antibody}.consensus_peaks" - bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' - vst = params.deseq2_vst ? '--vst TRUE' : '' - """ - featurecounts_deseq2.r \\ - --featurecount_file $counts \\ - --bam_suffix '$bam_ext' \\ - --outdir ./ \\ - --outprefix $prefix \\ - --outsuffix '' \\ - --cores $task.cpus \\ - $vst - - sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt - cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv - - sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt - cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv - - find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt - """ + ch_bamtools_filter_config = file(params.bamtools_filter_pe_config, checkIfExists: true) } -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- IGV -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* - * STEP 8: Create IGV session file - */ -process IGV { - publishDir "${params.outdir}/igv/${PEAK_TYPE}", mode: params.publish_dir_mode - - when: - !params.skip_igv - - input: - path fasta from ch_fasta - path bigwigs from ch_bigwig_igv.collect().ifEmpty([]) - path peaks from ch_macs_igv.collect().ifEmpty([]) - path consensus_peaks from ch_macs_consensus_igv.collect().ifEmpty([]) - path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) - - output: - path '*.{txt,xml}' - - script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ - """ - cat *.txt > igv_files.txt - igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' - """ -} +// Header files for MultiQC +ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) +ch_frip_score_header = file("$baseDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) +ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) +ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) +ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) +ch_spp_correlation_header = file("$baseDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) +ch_spp_nsc_header = file("$baseDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) +ch_spp_rsc_header = file("$baseDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- MULTIQC -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////// +/* -- PARAMETER SUMMARY -- */ +//////////////////////////////////////////////////// /* - * Parse software version numbers + * Print parameter summary */ -process get_software_versions { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.indexOf('.csv') > 0) filename - else null - } - - output: - path 'software_versions_mqc.yaml' into ch_software_versions_mqc - path 'software_versions.csv' - - script: - """ - echo $workflow.manifest.version > v_pipeline.txt - echo $workflow.nextflow.version > v_nextflow.txt - fastqc --version > v_fastqc.txt - trim_galore --version > v_trim_galore.txt - echo \$(bwa 2>&1) > v_bwa.txt - samtools --version > v_samtools.txt - bedtools --version > v_bedtools.txt - echo \$(bamtools --version 2>&1) > v_bamtools.txt - echo \$(plotFingerprint --version 2>&1) > v_deeptools.txt || true - picard MarkDuplicates --version &> v_picard.txt || true - echo \$(R --version 2>&1) > v_R.txt - python -c "import pysam; print(pysam.__version__)" > v_pysam.txt - echo \$(macs2 --version 2>&1) > v_macs2.txt - touch v_homer.txt - echo \$(featureCounts -v 2>&1) > v_featurecounts.txt - preseq &> v_preseq.txt - multiqc --version > v_multiqc.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ +// Has the run name been specified by the user? +// this has the bonus effect of catching both -name and --name +run_name = params.name +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + run_name = workflow.runName } - -Channel.from(summary.collect{ [it.key, it.value] }) - .map { k,v -> "
$k
${v ?: 'N/A'}
" } - .reduce { a, b -> return [a, b].join("\n ") } - .map { x -> """ - id: 'nf-core-chipseq-summary' - description: " - this information is collected when the pipeline is started." - section_name: 'nf-core/chipseq Workflow Summary' - section_href: 'https://github.com/nf-core/chipseq' - plot_type: 'html' - data: | -
- $x -
- """.stripIndent() } - .set { ch_workflow_summary } +summary = Schema.params_summary(workflow, params, run_name) +log.info Headers.nf_core(workflow, params.monochrome_logs) +log.info summary.collect { k,v -> "${k.padRight(22)}: $v" }.join("\n") +log.info "-\033[2m----------------------------------------------------\033[0m-" /* - * STEP 9: MultiQC + * Include local pipeline modules */ -process MULTIQC { - publishDir "${params.outdir}/multiqc/${PEAK_TYPE}", mode: params.publish_dir_mode - - when: - !params.skip_multiqc - - input: - path (multiqc_config) from ch_multiqc_config - path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) +include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) +include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) +include { CHECK_SAMPLESHEET; check_samplesheet_paths } from './modules/local/check_samplesheet' params(params) - path ('software_versions/*') from ch_software_versions_mqc.collect() - path workflow_summary from ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml') - - path ('fastqc/*') from ch_fastqc_reports_mqc.collect().ifEmpty([]) - path ('trimgalore/*') from ch_trimgalore_results_mqc.collect().ifEmpty([]) - path ('trimgalore/fastqc/*') from ch_trimgalore_fastqc_reports_mqc.collect().ifEmpty([]) - - path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() - path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() - path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} - path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() - path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() - path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() - - path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) - path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) - path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) - path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - - path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) - path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) - path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) - path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) - path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) - - output: - path '*multiqc_report.html' into ch_multiqc_report - path '*_data' - - script: - rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' - custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' - """ - multiqc . -f $rtitle $rfilename $custom_config_file - """ -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- REPORTS/DOCUMENTATION -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// +// /* +// * Include nf-core modules +// */ +// include { FASTQC } from './modules/nf-core/fastqc' params(params) +// include { MULTIQC } from './modules/nf-core/multiqc' params(params) /* - * STEP 10: Output description HTML + * Run the workflow */ -process output_documentation { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode - - input: - path output_docs from ch_output_docs - path images from ch_output_docs_images - - output: - path 'results_description.html' - - script: - """ - markdown_to_html.py $output_docs -o results_description.html - """ +workflow { + + // CHECK_SAMPLESHEET(ch_input) + // .splitCsv(header:true, sep:',') + // .map { check_samplesheet_paths(it) } + // .set { ch_raw_reads } + // + // FASTQC(ch_raw_reads) + + OUTPUT_DOCUMENTATION( + ch_output_docs, + ch_output_docs_images) + + GET_SOFTWARE_VERSIONS() + + // MULTIQC( + // summary, + // FASTQC.out, + // ch_multiqc_config + // ) } /* - * Completion e-mail notification + * Send completion email */ workflow.onComplete { - - // Set up the e-mail variables - def subject = "[nf-core/chipseq] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[nf-core/chipseq] FAILED: $workflow.runName" - } - def email_fields = [:] - email_fields['version'] = workflow.manifest.version - email_fields['runName'] = custom_runName ?: workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary - email_fields['summary']['Date Started'] = workflow.start - email_fields['summary']['Date Completed'] = workflow.complete - email_fields['summary']['Pipeline script file path'] = workflow.scriptFile - email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision - email_fields['summary']['Nextflow Version'] = workflow.nextflow.version - email_fields['summary']['Nextflow Build'] = workflow.nextflow.build - email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = ch_multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList) { - log.warn "[nf-core/chipseq] Found multiple reports from process 'multiqc', will use only one" - mqc_report = mqc_report[0] - } - } - } catch (all) { - log.warn "[nf-core/chipseq] Could not attach MultiQC report to summary email" - } - - // Check if we are only sending emails on failure - email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$baseDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$baseDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] - def sf = new File("$baseDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (sendmail)" - } catch (all) { - // Catch failures and try with plaintext - [ 'mail', '-s', subject, email_address ].execute() << email_txt - log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (mail)" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_red = params.monochrome_logs ? '' : "\033[0;31m"; - c_reset = params.monochrome_logs ? '' : "\033[0m"; - - if (workflow.stats.ignoredCount > 0 && workflow.success) { - log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" - log.info "-${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${c_reset}-" - log.info "-${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${c_reset}-" - } - - if (workflow.success) { - log.info "-${c_purple}[nf-core/chipseq]${c_green} Pipeline completed successfully${c_reset}-" - } else { - checkHostname() - log.info "-${c_purple}[nf-core/chipseq]${c_red} Pipeline completed with errors${c_reset}-" - } - -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- NF-CORE HEADER -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -def nfcoreHeader() { - // Log colors ANSI codes - c_black = params.monochrome_logs ? '' : "\033[0;30m"; - c_blue = params.monochrome_logs ? '' : "\033[0;34m"; - c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; - c_dim = params.monochrome_logs ? '' : "\033[2m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_white = params.monochrome_logs ? '' : "\033[0;37m"; - c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; - - return """ -${c_dim}--------------------------------------------------${c_reset}- - ${c_green},--.${c_black}/${c_green},-.${c_reset} - ${c_blue} ___ __ __ __ ___ ${c_green}/,-._.--~\'${c_reset} - ${c_blue} |\\ | |__ __ / ` / \\ |__) |__ ${c_yellow}} {${c_reset} - ${c_blue} | \\| | \\__, \\__/ | \\ |___ ${c_green}\\`-._,-`-,${c_reset} - ${c_green}`._,._,\'${c_reset} - ${c_purple} nf-core/chipseq v${workflow.manifest.version}${c_reset} - -${c_dim}--------------------------------------------------${c_reset}- - """.stripIndent() -} - -def checkHostname() { - def c_reset = params.monochrome_logs ? '' : "\033[0m" - def c_white = params.monochrome_logs ? '' : "\033[0;37m" - def c_red = params.monochrome_logs ? '' : "\033[1;91m" - def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" - if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.error "====================================================\n" + - " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + - " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + - "============================================================" - } - } - } - } + def multiqc_report = [] + Completion.email(workflow, params, summary, run_name, baseDir, multiqc_report, log) + Completion.summary(workflow, params, log) } +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- PARSE DESIGN FILE -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * PREPROCESSING: Reformat design file, check validitiy and create IP vs control mappings +// */ +// process CHECK_DESIGN { +// tag "$design" +// publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode +// +// input: +// path design from ch_input +// +// output: +// path 'design_reads.csv' into ch_design_reads_csv +// path 'design_controls.csv' into ch_design_controls_csv +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// """ +// check_design.py $design design_reads.csv design_controls.csv +// """ +// } +// +// /* +// * Create channels for input fastq files +// */ +// if (params.single_end) { +// ch_design_reads_csv +// .splitCsv(header:true, sep:',') +// .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true) ] ] } +// .into { ch_raw_reads_fastqc; +// ch_raw_reads_trimgalore } +// } else { +// ch_design_reads_csv +// .splitCsv(header:true, sep:',') +// .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] } +// .into { ch_raw_reads_fastqc; +// ch_raw_reads_trimgalore } +// } +// +// /* +// * Create a channel with [sample_id, control id, antibody, replicatesExist, multipleGroups] +// */ +// ch_design_controls_csv +// .splitCsv(header:true, sep:',') +// .map { row -> [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] } +// .set { ch_design_controls_csv } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- PREPARE ANNOTATION FILES -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * PREPROCESSING: Build BWA index +// */ +// if (!params.bwa_index) { +// process BWA_INDEX { +// tag "$fasta" +// label 'process_high' +// publishDir path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, +// saveAs: { params.save_reference ? it : null }, mode: params.publish_dir_mode +// +// input: +// path fasta from ch_fasta +// +// output: +// path 'BWAIndex' into ch_bwa_index +// +// script: +// """ +// bwa index -a bwtsw $fasta +// mkdir BWAIndex && mv ${fasta}* BWAIndex +// """ +// } +// } +// +// /* +// * PREPROCESSING: Generate gene BED file +// */ +// // If --gtf is supplied along with --genome +// // Make gene bed from supplied --gtf instead of using iGenomes one automatically +// def MAKE_BED = false +// if (!params.gene_bed) { +// MAKE_BED = true +// } else if (params.genome && params.gtf) { +// if (params.genomes[ params.genome ].gtf != params.gtf) { +// MAKE_BED = true +// } +// } +// if (MAKE_BED) { +// process MAKE_GENE_BED { +// tag "$gtf" +// label 'process_low' +// publishDir "${params.outdir}/genome", mode: params.publish_dir_mode +// +// input: +// path gtf from ch_gtf +// +// output: +// path '*.bed' into ch_gene_bed +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// """ +// gtf2bed $gtf > ${gtf.baseName}.bed +// """ +// } +// } +// +// /* +// * PREPROCESSING: Prepare genome intervals for filtering +// */ +// process MAKE_GENOME_FILTER { +// tag "$fasta" +// publishDir "${params.outdir}/genome", mode: params.publish_dir_mode +// +// input: +// path fasta from ch_fasta +// path blacklist from ch_blacklist.ifEmpty([]) +// +// output: +// path "$fasta" // FASTA FILE FOR IGV +// path '*.fai' // FAI INDEX FOR REFERENCE GENOME +// path '*.bed' into ch_genome_filter_regions // BED FILE WITHOUT BLACKLIST REGIONS +// path '*.sizes' into ch_genome_sizes_bigwig // CHROMOSOME SIZES FILE FOR BEDTOOLS +// +// script: +// blacklist_filter = params.blacklist ? "sortBed -i $blacklist -g ${fasta}.sizes | complementBed -i stdin -g ${fasta}.sizes" : "awk '{print \$1, '0' , \$2}' OFS='\t' ${fasta}.sizes" +// """ +// samtools faidx $fasta +// cut -f 1,2 ${fasta}.fai > ${fasta}.sizes +// $blacklist_filter > ${fasta}.include_regions.bed +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- FASTQ QC -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 1: FastQC +// */ +// process FASTQC { +// tag "$name" +// label 'process_medium' +// publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, +// saveAs: { filename -> +// filename.endsWith('.zip') ? "zips/$filename" : filename +// } +// +// when: +// !params.skip_fastqc +// +// input: +// tuple val(name), path(reads) from ch_raw_reads_fastqc +// +// output: +// path '*.{zip,html}' into ch_fastqc_reports_mqc +// +// script: +// // Added soft-links to original fastqs for consistent naming in MultiQC +// if (params.single_end) { +// """ +// [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz +// fastqc -q -t $task.cpus ${name}.fastq.gz +// """ +// } else { +// """ +// [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz +// [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz +// fastqc -q -t $task.cpus ${name}_1.fastq.gz +// fastqc -q -t $task.cpus ${name}_2.fastq.gz +// """ +// } +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- ADAPTER TRIMMING -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 2: Trim Galore! +// */ +// if (params.skip_trimming) { +// ch_trimmed_reads = ch_raw_reads_trimgalore +// ch_trimgalore_results_mqc = Channel.empty() +// ch_trimgalore_fastqc_reports_mqc = Channel.empty() +// } else { +// process TRIMGALORE { +// tag "$name" +// label 'process_high' +// publishDir "${params.outdir}/trim_galore", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.html')) "fastqc/$filename" +// else if (filename.endsWith('.zip')) "fastqc/zips/$filename" +// else if (filename.endsWith('trimming_report.txt')) "logs/$filename" +// else params.save_trimmed ? filename : null +// } +// +// input: +// tuple val(name), path(reads) from ch_raw_reads_trimgalore +// +// output: +// tuple val(name), path('*.fq.gz') into ch_trimmed_reads +// path '*.txt' into ch_trimgalore_results_mqc +// path '*.{zip,html}' into ch_trimgalore_fastqc_reports_mqc +// +// script: +// // Calculate number of --cores for TrimGalore based on value of task.cpus +// // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 +// // See: https://github.com/nf-core/atacseq/pull/65 +// def cores = 1 +// if (task.cpus) { +// cores = (task.cpus as int) - 4 +// if (params.single_end) cores = (task.cpus as int) - 3 +// if (cores < 1) cores = 1 +// if (cores > 4) cores = 4 +// } +// +// c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' +// c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' +// tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' +// tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' +// nextseq = params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' +// +// // Added soft-links to original fastqs for consistent naming in MultiQC +// if (params.single_end) { +// """ +// [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz +// trim_galore --cores $cores --fastqc --gzip $c_r1 $tpc_r1 $nextseq ${name}.fastq.gz +// """ +// } else { +// """ +// [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz +// [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz +// trim_galore --cores $cores --paired --fastqc --gzip $c_r1 $c_r2 $tpc_r1 $tpc_r2 $nextseq ${name}_1.fastq.gz ${name}_2.fastq.gz +// """ +// } +// } +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- ALIGN -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 3.1: Map read(s) with bwa mem +// */ +// process BWA_MEM { +// tag "$name" +// label 'process_high' +// +// input: +// tuple val(name), path(reads) from ch_trimmed_reads +// path index from ch_bwa_index.collect() +// +// output: +// tuple val(name), path('*.bam') into ch_bwa_bam +// +// script: +// prefix = "${name}.Lb" +// rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\'" +// if (params.seq_center) { +// rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\\tCN:${params.seq_center}\'" +// } +// score = params.bwa_min_score ? "-T ${params.bwa_min_score}" : '' +// """ +// bwa mem \\ +// -t $task.cpus \\ +// -M \\ +// -R $rg \\ +// $score \\ +// ${index}/${bwa_base} \\ +// $reads \\ +// | samtools view -@ $task.cpus -b -h -F 0x0100 -O BAM -o ${prefix}.bam - +// """ +// } +// +// /* +// * STEP 3.2: Convert BAM to coordinate sorted BAM +// */ +// process SORT_BAM { +// tag "$name" +// label 'process_medium' +// if (params.save_align_intermeds) { +// publishDir path: "${params.outdir}/bwa/library", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" +// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" +// else if (filename.endsWith('.stats')) "samtools_stats/$filename" +// else filename +// } +// } +// +// input: +// tuple val(name), path(bam) from ch_bwa_bam +// +// output: +// tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_sort_bam_merge +// path '*.{flagstat,idxstats,stats}' into ch_sort_bam_flagstat_mqc +// +// script: +// prefix = "${name}.Lb" +// """ +// samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam +// samtools index ${prefix}.sorted.bam +// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat +// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats +// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- MERGE LIBRARY BAM -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 4.1: Merge BAM files for all libraries from same sample replicate +// */ +// ch_sort_bam_merge +// .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1] ] } +// .groupTuple(by: [0]) +// .map { it -> [ it[0], it[1].flatten() ] } +// .set { ch_sort_bam_merge } +// +// process MERGED_BAM { +// tag "$name" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" +// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" +// else if (filename.endsWith('.stats')) "samtools_stats/$filename" +// else if (filename.endsWith('.metrics.txt')) "picard_metrics/$filename" +// else params.save_align_intermeds ? filename : null +// } +// +// input: +// tuple val(name), path(bams) from ch_sort_bam_merge +// +// output: +// tuple val(name), path("*${prefix}.sorted.{bam,bam.bai}") into ch_merge_bam_filter, +// ch_merge_bam_preseq +// path '*.{flagstat,idxstats,stats}' into ch_merge_bam_stats_mqc +// path '*.txt' into ch_merge_bam_metrics_mqc +// +// script: +// prefix = "${name}.mLb.mkD" +// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() +// def avail_mem = 3 +// if (!task.memory) { +// log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' +// } else { +// avail_mem = task.memory.toGiga() +// } +// if (bam_files.size() > 1) { +// """ +// picard -Xmx${avail_mem}g MergeSamFiles \\ +// ${'INPUT='+bam_files.join(' INPUT=')} \\ +// OUTPUT=${name}.sorted.bam \\ +// SORT_ORDER=coordinate \\ +// VALIDATION_STRINGENCY=LENIENT \\ +// TMP_DIR=tmp +// samtools index ${name}.sorted.bam +// +// picard -Xmx${avail_mem}g MarkDuplicates \\ +// INPUT=${name}.sorted.bam \\ +// OUTPUT=${prefix}.sorted.bam \\ +// ASSUME_SORTED=true \\ +// REMOVE_DUPLICATES=false \\ +// METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ +// VALIDATION_STRINGENCY=LENIENT \\ +// TMP_DIR=tmp +// +// samtools index ${prefix}.sorted.bam +// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats +// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat +// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats +// """ +// } else { +// """ +// picard -Xmx${avail_mem}g MarkDuplicates \\ +// INPUT=${bam_files[0]} \\ +// OUTPUT=${prefix}.sorted.bam \\ +// ASSUME_SORTED=true \\ +// REMOVE_DUPLICATES=false \\ +// METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ +// VALIDATION_STRINGENCY=LENIENT \\ +// TMP_DIR=tmp +// +// samtools index ${prefix}.sorted.bam +// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats +// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat +// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats +// """ +// } +// } +// +// /* +// * STEP 4.2: Filter BAM file at merged library-level +// */ +// process MERGED_BAM_FILTER { +// tag "$name" +// label 'process_medium' +// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (params.single_end || params.save_align_intermeds) { +// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" +// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" +// else if (filename.endsWith('.stats')) "samtools_stats/$filename" +// else if (filename.endsWith('.sorted.bam')) filename +// else if (filename.endsWith('.sorted.bam.bai')) filename +// else null +// } +// } +// +// input: +// tuple val(name), path(bam) from ch_merge_bam_filter +// path bed from ch_genome_filter_regions.collect() +// path bamtools_filter_config from ch_bamtools_filter_config +// +// output: +// tuple val(name), path('*.{bam,bam.bai}') into ch_filter_bam +// tuple val(name), path('*.flagstat') into ch_filter_bam_flagstat +// path '*.{idxstats,stats}' into ch_filter_bam_stats_mqc +// +// script: +// prefix = params.single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" +// filter_params = params.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' +// dup_params = params.keep_dups ? '' : '-F 0x0400' +// multimap_params = params.keep_multi_map ? '' : '-q 1' +// blacklist_params = params.blacklist ? "-L $bed" : '' +// name_sort_bam = params.single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" +// """ +// samtools view \\ +// $filter_params \\ +// $dup_params \\ +// $multimap_params \\ +// $blacklist_params \\ +// -b ${bam[0]} \\ +// | bamtools filter \\ +// -out ${prefix}.sorted.bam \\ +// -script $bamtools_filter_config +// +// samtools index ${prefix}.sorted.bam +// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat +// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats +// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats +// +// $name_sort_bam +// """ +// } +// +// /* +// * STEP 4.3: Remove orphan reads from paired-end BAM file +// */ +// if (params.single_end) { +// ch_filter_bam +// .into { ch_rm_orphan_bam_metrics; +// ch_rm_orphan_bam_bigwig; +// ch_rm_orphan_bam_macs_1; +// ch_rm_orphan_bam_macs_2; +// ch_rm_orphan_bam_phantompeakqualtools; +// ch_rm_orphan_name_bam_counts } +// +// ch_filter_bam_flagstat +// .into { ch_rm_orphan_flagstat_bigwig; +// ch_rm_orphan_flagstat_macs; +// ch_rm_orphan_flagstat_mqc } +// +// ch_filter_bam_stats_mqc +// .set { ch_rm_orphan_stats_mqc } +// } else { +// process MERGED_BAM_REMOVE_ORPHAN { +// tag "$name" +// label 'process_medium' +// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" +// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" +// else if (filename.endsWith('.stats')) "samtools_stats/$filename" +// else if (filename.endsWith('.sorted.bam')) filename +// else if (filename.endsWith('.sorted.bam.bai')) filename +// else null +// } +// +// input: +// tuple val(name), path(bam) from ch_filter_bam +// +// output: +// tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_rm_orphan_bam_metrics, +// ch_rm_orphan_bam_bigwig, +// ch_rm_orphan_bam_macs_1, +// ch_rm_orphan_bam_macs_2, +// ch_rm_orphan_bam_phantompeakqualtools +// tuple val(name), path("${prefix}.bam") into ch_rm_orphan_name_bam_counts +// tuple val(name), path('*.flagstat') into ch_rm_orphan_flagstat_bigwig, +// ch_rm_orphan_flagstat_macs, +// ch_rm_orphan_flagstat_mqc +// path '*.{idxstats,stats}' into ch_rm_orphan_stats_mqc +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// prefix = "${name}.mLb.clN" +// """ +// bampe_rm_orphan.py ${bam[0]} ${prefix}.bam --only_fr_pairs +// +// samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix ${prefix}.bam +// samtools index ${prefix}.sorted.bam +// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat +// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats +// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats +// """ +// } +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- MERGE LIBRARY BAM POST-ANALYSIS -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 5.1: Preseq analysis after merging libraries and before filtering +// */ +// process PRESEQ { +// tag "$name" +// label 'process_medium' +// label 'error_ignore' +// publishDir "${params.outdir}/bwa/mergedLibrary/preseq", mode: params.publish_dir_mode +// +// when: +// !params.skip_preseq +// +// input: +// tuple val(name), path(bam) from ch_merge_bam_preseq +// +// output: +// path '*.ccurve.txt' into ch_preseq_mqc +// path '*.log' +// +// script: +// pe = params.single_end ? '' : '-pe' +// """ +// preseq lc_extrap \\ +// -output ${name}.ccurve.txt \\ +// -verbose \\ +// -bam \\ +// $pe \\ +// -seed 1 \\ +// ${bam[0]} +// cp .command.err ${name}.command.log +// """ +// } +// +// /* +// * STEP 5.2: Picard CollectMultipleMetrics after merging libraries and filtering +// */ +// process PICARD_METRICS { +// tag "$name" +// label 'process_medium' +// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('_metrics')) "picard_metrics/$filename" +// else if (filename.endsWith('.pdf')) "picard_metrics/pdf/$filename" +// else null +// } +// +// when: +// !params.skip_picard_metrics +// +// input: +// tuple val(name), path(bam) from ch_rm_orphan_bam_metrics +// path fasta from ch_fasta +// +// output: +// path '*_metrics' into ch_collectmetrics_mqc +// path '*.pdf' +// +// script: +// prefix = "${name}.mLb.clN" +// def avail_mem = 3 +// if (!task.memory) { +// log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' +// } else { +// avail_mem = task.memory.toGiga() +// } +// """ +// picard -Xmx${avail_mem}g CollectMultipleMetrics \\ +// INPUT=${bam[0]} \\ +// OUTPUT=${prefix}.CollectMultipleMetrics \\ +// REFERENCE_SEQUENCE=$fasta \\ +// VALIDATION_STRINGENCY=LENIENT \\ +// TMP_DIR=tmp +// """ +// } +// +// /* +// * STEP 5.3: Read depth normalised bigWig +// */ +// process BIGWIG { +// tag "$name" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/bigwig", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('scale_factor.txt')) "scale/$filename" +// else if (filename.endsWith('.bigWig')) filename +// else null +// } +// +// input: +// tuple val(name), path(bam), path(flagstat) from ch_rm_orphan_bam_bigwig.join(ch_rm_orphan_flagstat_bigwig, by: [0]) +// path sizes from ch_genome_sizes_bigwig.collect() +// +// output: +// tuple val(name), path('*.bigWig') into ch_bigwig_plotprofile +// path '*igv.txt' into ch_bigwig_igv +// path '*scale_factor.txt' +// +// script: +// pe_fragment = params.single_end ? '' : '-pc' +// extend = (params.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' +// """ +// SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') +// echo \$SCALE_FACTOR > ${name}.scale_factor.txt +// genomeCoverageBed -ibam ${bam[0]} -bg -scale \$SCALE_FACTOR $pe_fragment $extend | sort -T '.' -k1,1 -k2,2n > ${name}.bedGraph +// +// bedGraphToBigWig ${name}.bedGraph $sizes ${name}.bigWig +// +// find * -type f -name "*.bigWig" -exec echo -e "bwa/mergedLibrary/bigwig/"{}"\\t0,0,178" \\; > ${name}.bigWig.igv.txt +// """ +// } +// +// /* +// * STEP 5.4: Generate gene body coverage plot with deepTools plotProfile and plotHeatmap +// */ +// process PLOTPROFILE { +// tag "$name" +// label 'process_high' +// publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotProfile", mode: params.publish_dir_mode +// +// when: +// !params.skip_plot_profile +// +// input: +// tuple val(name), path(bigwig) from ch_bigwig_plotprofile +// path bed from ch_gene_bed +// +// output: +// path '*.plotProfile.tab' into ch_plotprofile_mqc +// path '*.{gz,pdf,mat.tab}' +// +// script: +// """ +// computeMatrix scale-regions \\ +// --regionsFileName $bed \\ +// --scoreFileName $bigwig \\ +// --outFileName ${name}.computeMatrix.mat.gz \\ +// --outFileNameMatrix ${name}.computeMatrix.vals.mat.tab \\ +// --regionBodyLength 1000 \\ +// --beforeRegionStartLength 3000 \\ +// --afterRegionStartLength 3000 \\ +// --skipZeros \\ +// --smartLabels \\ +// --numberOfProcessors $task.cpus +// +// plotProfile --matrixFile ${name}.computeMatrix.mat.gz \\ +// --outFileName ${name}.plotProfile.pdf \\ +// --outFileNameData ${name}.plotProfile.tab +// +// plotHeatmap --matrixFile ${name}.computeMatrix.mat.gz \\ +// --outFileName ${name}.plotHeatmap.pdf \\ +// --outFileNameMatrix ${name}.plotHeatmap.mat.tab +// """ +// } +// +// /* +// * STEP 5.5: Phantompeakqualtools +// */ +// process PHANTOMPEAKQUALTOOLS { +// tag "$name" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/phantompeakqualtools", mode: params.publish_dir_mode +// +// when: +// !params.skip_spp +// +// input: +// tuple val(name), path(bam) from ch_rm_orphan_bam_phantompeakqualtools +// path spp_correlation_header from ch_spp_correlation_header +// path spp_nsc_header from ch_spp_nsc_header +// path spp_rsc_header from ch_spp_rsc_header +// +// output: +// path '*.spp.out' into ch_spp_out_mqc +// path '*_mqc.tsv' into ch_spp_csv_mqc +// path '*.pdf' +// +// script: +// """ +// RUN_SPP=`which run_spp.R` +// Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="${bam[0]}" -savp="${name}.spp.pdf" -savd="${name}.spp.Rdata" -out="${name}.spp.out" -p=$task.cpus +// cp $spp_correlation_header ${name}_spp_correlation_mqc.tsv +// Rscript -e "load('${name}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${name}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" +// +// awk -v OFS='\t' '{print "${name}", \$9}' ${name}.spp.out | cat $spp_nsc_header - > ${name}_spp_nsc_mqc.tsv +// awk -v OFS='\t' '{print "${name}", \$10}' ${name}.spp.out | cat $spp_rsc_header - > ${name}_spp_rsc_mqc.tsv +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- MERGE LIBRARY PEAK ANALYSIS -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// // Create channel linking IP bams with control bams +// ch_rm_orphan_bam_macs_1 +// .combine(ch_rm_orphan_bam_macs_2) +// .set { ch_rm_orphan_bam_macs_1 } +// +// ch_design_controls_csv +// .combine(ch_rm_orphan_bam_macs_1) +// .filter { it[0] == it[5] && it[1] == it[7] } +// .join(ch_rm_orphan_flagstat_macs) +// .map { it -> it[2..-1] } +// .into { ch_group_bam_macs; +// ch_group_bam_plotfingerprint; +// ch_group_bam_counts } +// +// /* +// * STEP 6.1: deepTools plotFingerprint +// */ +// process PLOTFINGERPRINT { +// tag "${ip} vs ${control}" +// label 'process_high' +// publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotFingerprint", mode: params.publish_dir_mode +// +// when: +// !params.skip_plot_fingerprint +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_plotfingerprint +// +// output: +// path '*.raw.txt' into ch_plotfingerprint_mqc +// path '*.{txt,pdf}' +// +// script: +// extend = (params.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' +// """ +// plotFingerprint \\ +// --bamfiles ${ipbam[0]} ${controlbam[0]} \\ +// --plotFile ${ip}.plotFingerprint.pdf \\ +// $extend \\ +// --labels $ip $control \\ +// --outRawCounts ${ip}.plotFingerprint.raw.txt \\ +// --outQualityMetrics ${ip}.plotFingerprint.qcmetrics.txt \\ +// --skipZeros \\ +// --JSDsample ${controlbam[0]} \\ +// --numberOfProcessors $task.cpus \\ +// --numberOfSamples $params.fingerprint_bins +// """ +// } +// +// /* +// * STEP 6.2: Call peaks with MACS2 and calculate FRiP score +// */ +// process MACS2 { +// tag "${ip} vs ${control}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.tsv')) "qc/$filename" +// else if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_macs +// path peak_count_header from ch_peak_count_header +// path frip_score_header from ch_frip_score_header +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path("*.$PEAK_TYPE") into ch_macs_homer, +// ch_macs_qc, +// ch_macs_consensus +// path '*igv.txt' into ch_macs_igv +// path '*_mqc.tsv' into ch_macs_mqc +// path '*.{bed,xls,gappedPeak,bdg}' +// +// script: +// broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" +// format = params.single_end ? 'BAM' : 'BAMPE' +// pileup = params.save_macs_pileup ? '-B --SPMR' : '' +// fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' +// pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' +// """ +// macs2 callpeak \\ +// -t ${ipbam[0]} \\ +// -c ${controlbam[0]} \\ +// $broad \\ +// -f $format \\ +// -g $params.macs_gsize \\ +// -n $ip \\ +// $pileup \\ +// $fdr \\ +// $pvalue \\ +// --keep-dup all +// +// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv +// +// READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') +// grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv +// +// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt +// """ +// } +// +// /* +// * STEP 6.3: Annotate peaks with HOMER +// */ +// process MACS2_ANNOTATE { +// tag "${ip} vs ${control}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && !params.skip_peak_annotation +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path(peak) from ch_macs_homer +// path fasta from ch_fasta +// path gtf from ch_gtf +// +// output: +// path '*.txt' into ch_macs_annotate +// +// script: +// """ +// annotatePeaks.pl \\ +// $peak \\ +// $fasta \\ +// -gid \\ +// -gtf $gtf \\ +// -cpu $task.cpus \\ +// > ${ip}_peaks.annotatePeaks.txt +// """ +// } +// +// /* +// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation +// */ +// process MACS2_QC { +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc +// +// input: +// path peaks from ch_macs_qc.collect{ it[-1] } +// path annos from ch_macs_annotate.collect() +// path peak_annotation_header from ch_peak_annotation_header +// +// output: +// path '*.tsv' into ch_macs_qc_mqc +// path '*.{txt,pdf}' +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// """ +// plot_macs_qc.r \\ +// -i ${peaks.join(',')} \\ +// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ +// -o ./ \\ +// -p macs_peak +// +// plot_homer_annotatepeaks.r \\ +// -i ${annos.join(',')} \\ +// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ +// -o ./ \\ +// -p macs_annotatePeaks +// +// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- CONSENSUS PEAKS ANALYSIS -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// // Group by ip from this point and carry forward boolean variables +// ch_macs_consensus +// .map { it -> [ it[0], it[1], it[2], it[-1] ] } +// .groupTuple() +// .map { it -> [ it[0], it[1][0], it[2][0], it[3].sort() ] } +// .set { ch_macs_consensus } +// +// /* +// * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection +// */ +// process CONSENSUS_PEAKS { +// tag "${antibody}" +// label 'process_long' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(peaks) from ch_macs_consensus +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*.bed') into ch_macs_consensus_bed +// tuple val(antibody), path('*.saf') into ch_macs_consensus_saf +// path '*.boolean.txt' into ch_macs_consensus_bool +// path '*igv.txt' into ch_macs_consensus_igv +// path '*.intersect.{txt,plot.pdf}' +// +// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ +// prefix = "${antibody}.consensus_peaks" +// mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') +// collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') +// expandparam = params.narrow_peak ? '--is_narrow_peak' : '' +// """ +// sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ +// | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt +// +// macs2_merged_expand.py ${prefix}.txt \\ +// ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ +// ${prefix}.boolean.txt \\ +// --min_replicates $params.min_reps_consensus \\ +// $expandparam +// +// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed +// +// echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf +// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf +// +// plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf +// +// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt +// """ +// } +// +// /* +// * STEP 7.2: Annotate consensus peaks with HOMER, and add annotation to boolean output file +// */ +// process CONSENSUS_PEAKS_ANNOTATE { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks && !params.skip_peak_annotation +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bed) from ch_macs_consensus_bed +// path bool from ch_macs_consensus_bool +// path fasta from ch_fasta +// path gtf from ch_gtf +// +// output: +// path '*.annotatePeaks.txt' +// +// script: +// prefix = "${antibody}.consensus_peaks" +// """ +// annotatePeaks.pl \\ +// $bed \\ +// $fasta \\ +// -gid \\ +// -gtf $gtf \\ +// -cpu $task.cpus \\ +// > ${prefix}.annotatePeaks.txt +// +// cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt +// paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt +// """ +// } +// +// // Get BAM and SAF files for each ip +// ch_group_bam_counts +// .map { it -> [ it[3], [ it[0], it[1], it[2] ] ] } +// .join(ch_rm_orphan_name_bam_counts) +// .map { it -> [ it[1][0], it[1][1], it[1][2], it[2] ] } +// .groupTuple() +// .map { it -> [ it[0], it[1][0], it[2][0], it[3].flatten().sort() ] } +// .join(ch_macs_consensus_saf) +// .set { ch_group_bam_counts } +// +// /* +// * STEP 7.3: Count reads in consensus peaks with featureCounts +// */ +// process CONSENSUS_PEAKS_COUNTS { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bams), path(saf) from ch_group_bam_counts +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*featureCounts.txt') into ch_macs_consensus_counts +// path '*featureCounts.txt.summary' into ch_macs_consensus_counts_mqc +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() +// pe_params = params.single_end ? '' : '-p --donotsort' +// """ +// featureCounts \\ +// -F SAF \\ +// -O \\ +// --fracOverlap 0.2 \\ +// -T $task.cpus \\ +// $pe_params \\ +// -a $saf \\ +// -o ${prefix}.featureCounts.txt \\ +// ${bam_files.join(' ')} +// """ +// } +// +// /* +// * STEP 7.4: Differential analysis with DESeq2 +// */ +// process CONSENSUS_PEAKS_DESEQ2 { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts +// path deseq2_pca_header from ch_deseq2_pca_header +// path deseq2_clustering_header from ch_deseq2_clustering_header +// +// output: +// path '*.tsv' into ch_macs_consensus_deseq_mqc +// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv +// path '*.{RData,results.txt,pdf,log}' +// path 'sizeFactors' +// path '*vs*/*.{pdf,txt}' +// path '*vs*/*.bed' +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' +// vst = params.deseq2_vst ? '--vst TRUE' : '' +// """ +// featurecounts_deseq2.r \\ +// --featurecount_file $counts \\ +// --bam_suffix '$bam_ext' \\ +// --outdir ./ \\ +// --outprefix $prefix \\ +// --outsuffix '' \\ +// --cores $task.cpus \\ +// $vst +// +// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv +// +// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv +// +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- IGV -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// /* +// * STEP 8: Create IGV session file +// */ +// process IGV { +// publishDir "${params.outdir}/igv/${PEAK_TYPE}", mode: params.publish_dir_mode +// +// when: +// !params.skip_igv +// +// input: +// path fasta from ch_fasta +// path bigwigs from ch_bigwig_igv.collect().ifEmpty([]) +// path peaks from ch_macs_igv.collect().ifEmpty([]) +// path consensus_peaks from ch_macs_consensus_igv.collect().ifEmpty([]) +// path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) +// +// output: +// path '*.{txt,xml}' +// +// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ +// """ +// cat *.txt > igv_files.txt +// igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' +// """ +// } +// +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// /* -- -- */ +// /* -- MULTIQC -- */ +// /* -- -- */ +// /////////////////////////////////////////////////////////////////////////////// +// /////////////////////////////////////////////////////////////////////////////// +// +// Channel.from(summary.collect{ [it.key, it.value] }) +// .map { k,v -> "
$k
${v ?: 'N/A'}
" } +// .reduce { a, b -> return [a, b].join("\n ") } +// .map { x -> """ +// id: 'nf-core-chipseq-summary' +// description: " - this information is collected when the pipeline is started." +// section_name: 'nf-core/chipseq Workflow Summary' +// section_href: 'https://github.com/nf-core/chipseq' +// plot_type: 'html' +// data: | +//
+// $x +//
+// """.stripIndent() } +// .set { ch_workflow_summary } +// +// /* +// * STEP 9: MultiQC +// */ +// process MULTIQC { +// publishDir "${params.outdir}/multiqc/${PEAK_TYPE}", mode: params.publish_dir_mode +// +// when: +// !params.skip_multiqc +// +// input: +// path (multiqc_config) from ch_multiqc_config +// path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) +// +// path ('software_versions/*') from ch_software_versions_mqc.collect() +// path workflow_summary from ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml') +// +// path ('fastqc/*') from ch_fastqc_reports_mqc.collect().ifEmpty([]) +// path ('trimgalore/*') from ch_trimgalore_results_mqc.collect().ifEmpty([]) +// path ('trimgalore/fastqc/*') from ch_trimgalore_fastqc_reports_mqc.collect().ifEmpty([]) +// +// path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() +// path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() +// path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} +// path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() +// path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() +// path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() +// +// path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) +// path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) +// path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) +// path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) +// +// path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) +// path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) +// path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) +// path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) +// path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) +// +// output: +// path '*multiqc_report.html' into ch_multiqc_report +// path '*_data' +// +// script: +// rtitle = custom_runName ? "--title \"$custom_runName\"" : '' +// rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' +// custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' +// """ +// multiqc . -f $rtitle $rfilename $custom_config_file +// """ +// } +// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /* -- -- */ From ac3f66238235764eecd98a5495d08c9a2f325c5f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:15:56 +0100 Subject: [PATCH 006/538] Add nf-core modules --- modules/nf-core/fastqc.nf | 32 ++++++++++++++++++++++++ modules/nf-core/multiqc.nf | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 modules/nf-core/fastqc.nf create mode 100755 modules/nf-core/multiqc.nf diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf new file mode 100755 index 000000000..5129ab488 --- /dev/null +++ b/modules/nf-core/fastqc.nf @@ -0,0 +1,32 @@ +/* + * FastQC + */ +process FASTQC { + tag "$name" + label 'process_medium' + publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, + saveAs: { filename -> + filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" + } + + input: + tuple val(name), val(single_end), path(reads) + + output: + path "*.{zip,html}" + + script: + // Add soft-links to original FastQs for consistent naming in pipeline + if (single_end) { + """ + [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz + fastqc --quiet --threads $task.cpus ${name}.fastq.gz + """ + } else { + """ + [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz + [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz + fastqc --quiet --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz + """ + } +} diff --git a/modules/nf-core/multiqc.nf b/modules/nf-core/multiqc.nf new file mode 100755 index 000000000..5efb77a52 --- /dev/null +++ b/modules/nf-core/multiqc.nf @@ -0,0 +1,51 @@ +// Has the run name been specified by the user? +// this has the bonus effect of catching both -name and --name +custom_runName = params.name +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + custom_runName = workflow.runName +} + +// Channel.from(summary.collect{ [it.key, it.value] }) +// .map { k,v -> "
$k
${v ?: 'N/A'}
" } +// .reduce { a, b -> return [a, b].join("\n ") } +// .map { x -> """ +// id: 'nf-core-chipseq-summary' +// description: " - this information is collected when the pipeline is started." +// section_name: 'nf-core/chipseq Workflow Summary' +// section_href: 'https://github.com/nf-core/chipseq' +// plot_type: 'html' +// data: | +//
+// $x +//
+// """.stripIndent() } +// .set { ch_workflow_summary } + +/* + * MultiQC + */ +process MULTIQC { + publishDir "${params.outdir}/multiqc", mode: params.publish_dir_mode + + input: + path (multiqc_config) from ch_multiqc_config + path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) + // TODO nf-core: Add in log files from your new processes for MultiQC to find! + path ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) + path ('software_versions/*') from ch_software_versions_yaml.collect() + path workflow_summary from ch_workflow_summary.collectFile(name: "workflow_summary_mqc.yaml") + + output: + path "*multiqc_report.html" + path "*_data" + path "multiqc_plots" + + script: + rtitle = custom_runName ? "--title \"$custom_runName\"" : '' + rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' + // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time + """ + multiqc -f $rtitle $rfilename $custom_config_file . + """ +} From ed7ed293a46a04d222f9a98089dd51f744a01e97 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:16:05 +0100 Subject: [PATCH 007/538] Add local modules --- modules/local/check_samplesheet.nf | 35 +++++++++++++++++++++++++ modules/local/get_software_versions.nf | 36 ++++++++++++++++++++++++++ modules/local/output_documentation.nf | 18 +++++++++++++ 3 files changed, 89 insertions(+) create mode 100755 modules/local/check_samplesheet.nf create mode 100755 modules/local/get_software_versions.nf create mode 100755 modules/local/output_documentation.nf diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf new file mode 100755 index 000000000..bc74e20cc --- /dev/null +++ b/modules/local/check_samplesheet.nf @@ -0,0 +1,35 @@ +/* + * Reformat design file, check validitiy and create IP vs control mappings + */ +process CHECK_SAMPLESHEET { + tag "$samplesheet" + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode + + input: + path samplesheet + + output: + path 'design_reads.csv' + path 'design_controls.csv' + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + check_samplesheet.py $design design_reads.csv design_controls.csv + """ +} + +// // Function to get list of [ sample, single_end?, [ fastq_1, fastq_2 ] ] +// def check_samplesheet_paths(LinkedHashMap samplesheet) { +// def sample = samplesheet.sample +// def single_end = samplesheet.single_end.toBoolean() +// def fastq_1 = samplesheet.fastq_1 +// def fastq_2 = samplesheet.fastq_2 +// +// def array = [] +// if (single_end) { +// array = [ sample, single_end, [ file(fastq_1, checkIfExists: true) ] ] +// } else { +// array = [ sample, single_end, [ file(fastq_1, checkIfExists: true), file(fastq_2, checkIfExists: true) ] ] +// } +// return array +// } diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf new file mode 100755 index 000000000..9d19a8758 --- /dev/null +++ b/modules/local/get_software_versions.nf @@ -0,0 +1,36 @@ +/* + * Parse software version numbers + */ +process GET_SOFTWARE_VERSIONS { + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, + saveAs: { filename -> + if (filename.indexOf(".csv") > 0) filename + else null + } + + output: + path 'software_versions_mqc.yaml' + path "software_versions.csv" + + script: + """ + echo $workflow.manifest.version > v_pipeline.txt + echo $workflow.nextflow.version > v_nextflow.txt + fastqc --version > v_fastqc.txt + trim_galore --version > v_trim_galore.txt + echo \$(bwa 2>&1) > v_bwa.txt + samtools --version > v_samtools.txt + bedtools --version > v_bedtools.txt + echo \$(bamtools --version 2>&1) > v_bamtools.txt + echo \$(plotFingerprint --version 2>&1) > v_deeptools.txt || true + picard MarkDuplicates --version &> v_picard.txt || true + echo \$(R --version 2>&1) > v_R.txt + python -c "import pysam; print(pysam.__version__)" > v_pysam.txt + echo \$(macs2 --version 2>&1) > v_macs2.txt + touch v_homer.txt + echo \$(featureCounts -v 2>&1) > v_featurecounts.txt + preseq &> v_preseq.txt + multiqc --version > v_multiqc.txt + scrape_software_versions.py &> software_versions_mqc.yaml + """ +} diff --git a/modules/local/output_documentation.nf b/modules/local/output_documentation.nf new file mode 100755 index 000000000..b6d24b0f5 --- /dev/null +++ b/modules/local/output_documentation.nf @@ -0,0 +1,18 @@ +/* + * Output Markdown documentation to HTML + */ +process OUTPUT_DOCUMENTATION { + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode + + input: + path output_docs + path images + + output: + path "results_description.html" + + script: + """ + markdown_to_html.py $output_docs -o results_description.html + """ +} From 5fd6bfd4162145a61c6916fe1067d2eab5c77509 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:16:21 +0100 Subject: [PATCH 008/538] Add Groovy libs --- lib/Checks.groovy | 47 ++++++++++++ lib/Completion.groovy | 118 +++++++++++++++++++++++++++++ lib/Headers.groovy | 39 ++++++++++ lib/Schema.groovy | 169 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 373 insertions(+) create mode 100755 lib/Checks.groovy create mode 100755 lib/Completion.groovy create mode 100755 lib/Headers.groovy create mode 100755 lib/Schema.groovy diff --git a/lib/Checks.groovy b/lib/Checks.groovy new file mode 100755 index 000000000..034e9d838 --- /dev/null +++ b/lib/Checks.groovy @@ -0,0 +1,47 @@ +/* + * This file holds several functions used to perform standard checks for the nf-core pipeline template. + */ + +class Checks { + + static void aws_batch(workflow, params) { + if (workflow.profile.contains('awsbatch')) { + assert !params.awsqueue || !params.awsregion : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + // related: https://github.com/nextflow-io/nextflow/issues/813 + assert !params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + // Prevent trace files to be stored on S3 since S3 does not support rolling files. + assert params.tracedir.startsWith('s3:') : "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." + } + } + + static void hostname(workflow, params, log) { + Map colors = Headers.log_colours(params.monochrome_logs) + if (params.hostnames) { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } + } + } + } + } + + // Show a big warning message if we're not running MACS + static void macs2_warn(params, log) { + if (!params.macs_gsize) { + def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' + log.warn "=================================================================\n" + + " WARNING! MACS genome size parameter not $warnstring.\n" + + " Peak calling, annotation and differential analysis will be skipped.\n" + + " Please specify value for '--macs_gsize' to run these steps.\n" + + "=======================================================================" + } + } +} diff --git a/lib/Completion.groovy b/lib/Completion.groovy new file mode 100755 index 000000000..bcdcdc71a --- /dev/null +++ b/lib/Completion.groovy @@ -0,0 +1,118 @@ +/* + * Functions to be run on completion of pipeline + */ + +class Completion { + static void email(workflow, params, summary, run_name, baseDir, multiqc_report, log) { + + // Set up the e-mail variables + def subject = "[$workflow.manifest.name] Successful: $workflow.runName" + if (!workflow.success) { + subject = "[$workflow.manifest.name] FAILED: $workflow.runName" + } + + def email_fields = [:] + email_fields['version'] = workflow.manifest.version + email_fields['runName'] = run_name ?: workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary + email_fields['summary']['Date Started'] = workflow.start + email_fields['summary']['Date Completed'] = workflow.complete + email_fields['summary']['Pipeline script file path'] = workflow.scriptFile + email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision + email_fields['summary']['Nextflow Version'] = workflow.nextflow.version + email_fields['summary']['Nextflow Build'] = workflow.nextflow.build + email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) + // On success try attach the multiqc report + def mqc_report = null + try { + if (workflow.success) { + mqc_report = multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList) { + log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" + mqc_report = mqc_report[0] + } + } + } catch (all) { + log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" + } + + // Check if we are only sending emails on failure + def email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("$baseDir/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("$baseDir/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$baseDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] + def sf = new File("$baseDir/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + if (email_address) { + try { + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "[$workflow.manifest.name] Sent summary e-mail to $email_address (sendmail)" + } catch (all) { + // Catch failures and try with plaintext + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + if ( mqc_report.size() <= params.max_multiqc_email_size.toBytes() ) { + mail_cmd += [ '-A', mqc_report ] + } + mail_cmd.execute() << email_html + log.info "[$workflow.manifest.name] Sent summary e-mail to $email_address (mail)" + } + } + + // Write summary e-mail HTML to a file + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + def output_hf = new File(output_d, "pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + def output_tf = new File(output_d, "pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } + } + + static void summary(workflow, params, log) { + Map colors = Headers.log_colours(params.monochrome_logs) + if (workflow.stats.ignoredCount > 0 && workflow.success) { + log.info "-${colors.purple}Warning, pipeline completed, but with errored process(es) ${colors.reset}-" + log.info "-${colors.red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${colors.reset}-" + log.info "-${colors.green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${colors.reset}-" + } + if (workflow.success) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" + } else { + Checks.hostname() + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } + } +} diff --git a/lib/Headers.groovy b/lib/Headers.groovy new file mode 100755 index 000000000..8fd9c8c6f --- /dev/null +++ b/lib/Headers.groovy @@ -0,0 +1,39 @@ +/* + * This file holds several functions used to render the nf-core ANSI header. + */ + +class Headers { + + private static Map log_colours(Boolean monochrome_logs) { + Map colorcodes = [:] + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['yellow_bold'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + colorcodes['red'] = monochrome_logs ? '' : "\033[1;91m" + return colorcodes + } + + static String nf_core(workflow, monochrome_logs) { + Map colors = log_colours(monochrome_logs) + String.format( + """\n + -${colors.dim}----------------------------------------------------${colors.reset}- + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + -${colors.dim}----------------------------------------------------${colors.reset}- + """.stripIndent() + ) + } +} + diff --git a/lib/Schema.groovy b/lib/Schema.groovy new file mode 100755 index 000000000..e07e454c3 --- /dev/null +++ b/lib/Schema.groovy @@ -0,0 +1,169 @@ +/* + * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. + */ + +import groovy.json.JsonSlurper + +class Schema { + /* + * This method tries to read a JSON params file + */ + private static LinkedHashMap params_get(String path) { + def params_map = new LinkedHashMap() + try { + params_map = params_try(path) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + /* + Method to actually read in JSON file using Groovy. + Group (as Key), values are all parameters + - Parameter1 as Key, Description as Value + - Parameter2 as Key, Description as Value + .... + Group + - + */ + private static LinkedHashMap params_try(String path) throws Exception { + + def json = new File(path).text + def Map json_params = (Map) new JsonSlurper().parseText(json).get('properties') + + /* Tree looks like this in nf-core schema + * properties <- this is what the first get('properties') gets us + group 1 + properties + description + group 2 + properties + description + group 3 + properties + description + */ + def params_map = new LinkedHashMap() + json_params.each { key, val -> + def Map group = json_params."$key".properties // Gets the property object of the group + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put("$innerkey", [ "$value.type", "$value.description" ]) + } + params_map.put("$key", sub_params) + } + return params_map + } + + private static Integer params_max_chars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def params = params_map.get(group) // This gets the parameters of that particular group + for (par in params.keySet()) { + if (par.size() > max_chars) { + max_chars = par.size() + } + } + } + return max_chars + } + + private static String params_beautify(params_map) { + String output = "" + def max_chars = params_max_chars(params_map) + 1 + for (group in params_map.keySet()) { + output += group + "\n" + def params = params_map.get(group) // This gets the parameters of that particular group + for (par in params.keySet()) { + def type = "[" + params.get(par)[0] + "]" + def description = params.get(par)[1] + output+= " \u001B[1m" + par.padRight(max_chars) + "\u001B[1m" + type.padRight(10) + description + "\n" + } + output += "\n" + } + return output + } + + private static String params_help(path, command) { + String output = "Typical pipeline command:\n\n" + output += " ${command}\n\n" + output += params_beautify(params_get(path)) + } + + private static LinkedHashMap params_summary(workflow, params, run_name) { + def Map summary = [:] + if (workflow.revision) summary['Pipeline Release'] = workflow.revision + summary['Run Name'] = run_name ?: workflow.runName + summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' + summary['Design File'] = params.input + summary['Genome'] = params.genome ?: 'Not supplied' + summary['Fasta File'] = params.fasta + summary['GTF File'] = params.gtf + if (params.gene_bed) summary['Gene BED File'] = params.gene_bed + if (params.bwa_index) summary['BWA Index'] = params.bwa_index + if (params.blacklist) summary['Blacklist BED'] = params.blacklist + if (params.bwa_min_score) summary['BWA Min Score'] = params.bwa_min_score + summary['MACS2 Genome Size'] = params.macs_gsize ?: 'Not supplied' + summary['Min Consensus Reps'] = params.min_reps_consensus + if (params.macs_gsize) summary['MACS2 Narrow Peaks'] = params.narrow_peak ? 'Yes' : 'No' + if (!params.narrow_peak) summary['MACS2 Broad Cutoff'] = params.broad_cutoff + if (params.macs_fdr) summary['MACS2 FDR'] = params.macs_fdr + if (params.macs_pvalue) summary['MACS2 P-value'] = params.macs_pvalue + if (params.skip_trimming) { + summary['Trimming Step'] = 'Skipped' + } else { + summary['Trim R1'] = "$params.clip_r1 bp" + summary['Trim R2'] = "$params.clip_r2 bp" + summary["Trim 3' R1"] = "$params.three_prime_clip_r1 bp" + summary["Trim 3' R2"] = "$params.three_prime_clip_r2 bp" + summary['NextSeq Trim'] = "$params.trim_nextseq bp" + } + if (params.seq_center) summary['Sequencing Center'] = params.seq_center + if (params.single_end) summary['Fragment Size'] = "$params.fragment_size bp" + summary['Fingerprint Bins'] = params.fingerprint_bins + if (params.keep_dups) summary['Keep Duplicates'] = 'Yes' + if (params.keep_multi_map) summary['Keep Multi-mapped'] = 'Yes' + summary['Save Genome Index'] = params.save_reference ? 'Yes' : 'No' + if (params.save_trimmed) summary['Save Trimmed'] = 'Yes' + if (params.save_align_intermeds) summary['Save Intermeds'] = 'Yes' + if (params.save_macs_pileup) summary['Save MACS2 Pileup'] = 'Yes' + if (params.skip_peak_qc) summary['Skip MACS2 Peak QC'] = 'Yes' + if (params.skip_peak_annotation) summary['Skip Peak Annotation'] = 'Yes' + if (params.skip_consensus_peaks) summary['Skip Consensus Peaks'] = 'Yes' + if (params.deseq2_vst) summary['Use DESeq2 vst Transform'] = 'Yes' + if (params.skip_diff_analysis) summary['Skip Differential Analysis'] = 'Yes' + if (params.skip_fastqc) summary['Skip FastQC'] = 'Yes' + if (params.skip_picard_metrics) summary['Skip Picard Metrics'] = 'Yes' + if (params.skip_preseq) summary['Skip Preseq'] = 'Yes' + if (params.skip_plot_profile) summary['Skip plotProfile'] = 'Yes' + if (params.skip_plot_fingerprint) summary['Skip plotFingerprint'] = 'Yes' + if (params.skip_spp) summary['Skip spp'] = 'Yes' + if (params.skip_igv) summary['Skip IGV'] = 'Yes' + if (params.skip_multiqc) summary['Skip MultiQC'] = 'Yes' + summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" + if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" + summary['Output dir'] = params.outdir + summary['Launch dir'] = workflow.launchDir + summary['Working dir'] = workflow.workDir + summary['Script dir'] = workflow.projectDir + summary['User'] = workflow.userName + if (workflow.profile.contains('awsbatch')) { + summary['AWS Region'] = params.awsregion + summary['AWS Queue'] = params.awsqueue + summary['AWS CLI'] = params.awscli + } + summary['Config Profile'] = workflow.profile + if (params.config_profile_description) summary['Config Profile Descr'] = params.config_profile_description + if (params.config_profile_contact) summary['Config Profile Contact'] = params.config_profile_contact + if (params.config_profile_url) summary['Config Profile URL'] = params.config_profile_url + summary['Config Files'] = workflow.configFiles.join(', ') + if (params.email || params.email_on_fail) { + summary['E-mail Address'] = params.email + summary['E-mail on failure'] = params.email_on_fail + summary['MultiQC maxsize'] = params.max_multiqc_email_size + } + return summary + } +} From a039c0e87614cdeba5225207caaa39e6a7d6d837 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:21:26 +0100 Subject: [PATCH 009/538] Minor updates --- main.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 4c63e5497..632c3038e 100755 --- a/main.nf +++ b/main.nf @@ -189,9 +189,6 @@ workflow.onComplete { // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // -// /* -// * PREPROCESSING: Reformat design file, check validitiy and create IP vs control mappings -// */ // process CHECK_DESIGN { // tag "$design" // publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode @@ -208,7 +205,7 @@ workflow.onComplete { // check_design.py $design design_reads.csv design_controls.csv // """ // } -// + // /* // * Create channels for input fastq files // */ From 9d62b01a2c22c53fb6e60e3b6bc55fcd10db1e30 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:26:52 +0100 Subject: [PATCH 010/538] Get tests passing --- modules/local/check_samplesheet.nf | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf index bc74e20cc..a839758f4 100755 --- a/modules/local/check_samplesheet.nf +++ b/modules/local/check_samplesheet.nf @@ -18,18 +18,18 @@ process CHECK_SAMPLESHEET { """ } -// // Function to get list of [ sample, single_end?, [ fastq_1, fastq_2 ] ] -// def check_samplesheet_paths(LinkedHashMap samplesheet) { -// def sample = samplesheet.sample -// def single_end = samplesheet.single_end.toBoolean() -// def fastq_1 = samplesheet.fastq_1 -// def fastq_2 = samplesheet.fastq_2 -// -// def array = [] -// if (single_end) { -// array = [ sample, single_end, [ file(fastq_1, checkIfExists: true) ] ] -// } else { -// array = [ sample, single_end, [ file(fastq_1, checkIfExists: true), file(fastq_2, checkIfExists: true) ] ] -// } -// return array -// } +// Function to get list of [ sample, single_end?, [ fastq_1, fastq_2 ] ] +def check_samplesheet_paths(LinkedHashMap samplesheet) { + def sample = samplesheet.sample + def single_end = samplesheet.single_end.toBoolean() + def fastq_1 = samplesheet.fastq_1 + def fastq_2 = samplesheet.fastq_2 + + def array = [] + if (single_end) { + array = [ sample, single_end, [ file(fastq_1, checkIfExists: true) ] ] + } else { + array = [ sample, single_end, [ file(fastq_1, checkIfExists: true), file(fastq_2, checkIfExists: true) ] ] + } + return array +} From 76212dc837cd123cd2f5eb4f5cecd92f00d3045c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 13 Jul 2020 17:48:23 +0100 Subject: [PATCH 011/538] Bump Nextflow version --- .github/workflows/ci.yml | 4 ++-- CHANGELOG.md | 5 +++++ README.md | 2 +- nextflow.config | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5cfe6711b..aaed40ac2 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['19.10.0', ''] + nxf_ver: ['20.04.1', ''] steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -57,7 +57,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest env: - NXF_VER: '19.10.0' + NXF_VER: '20.04.1' NXF_ANSI_LOG: false strategy: matrix: diff --git a/CHANGELOG.md b/CHANGELOG.md index c33552316..4d3d088e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Added` +* Move template boilerplate code to Groovy `lib/` +* Implement pipeline in DSL 2 + ### `Fixed` ### `Dependencies` +* Update Nextflow `19.10.0` -> `20.04.1` + ## [1.2.0] - 2020-07-02 ### `Added` diff --git a/README.md b/README.md index 09d9d5b47..58ab48a8b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.04.1-brightgreen.svg)](https://www.nextflow.io/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3240506.svg)](https://doi.org/10.5281/zenodo.3240506) [![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) diff --git a/nextflow.config b/nextflow.config index 2a22eb383..23d6bc75c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -168,7 +168,7 @@ manifest { homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' - nextflowVersion = '>=19.10.0' + nextflowVersion = '>=20.04.1' version = '1.3.0dev' } From 4402ada977234b00c37ae297456d52101060362f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 08:47:50 +0100 Subject: [PATCH 012/538] Update params to hostnames --- lib/Completion.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Completion.groovy b/lib/Completion.groovy index bcdcdc71a..4363275dd 100755 --- a/lib/Completion.groovy +++ b/lib/Completion.groovy @@ -111,7 +111,7 @@ class Completion { if (workflow.success) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" } else { - Checks.hostname() + Checks.hostname(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } From 8b4aa8561ab2210ee74cf82ec74f8d79628d35ba Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 08:48:02 +0100 Subject: [PATCH 013/538] Get inputs into pipeline --- main.nf | 78 ++++++++++++++++----------------------------------------- 1 file changed, 21 insertions(+), 57 deletions(-) diff --git a/main.nf b/main.nf index 632c3038e..836632d53 100755 --- a/main.nf +++ b/main.nf @@ -139,7 +139,9 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" */ include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) -include { CHECK_SAMPLESHEET; check_samplesheet_paths } from './modules/local/check_samplesheet' params(params) +include { CHECK_SAMPLESHEET + get_samplesheet_paths + get_samplesheet_design } from './modules/local/check_samplesheet' params(params) // /* // * Include nf-core modules @@ -152,12 +154,24 @@ include { CHECK_SAMPLESHEET; check_samplesheet_paths } from './modules/local/che */ workflow { - // CHECK_SAMPLESHEET(ch_input) - // .splitCsv(header:true, sep:',') - // .map { check_samplesheet_paths(it) } - // .set { ch_raw_reads } - // - // FASTQC(ch_raw_reads) + // Get paths to FastQ files + // [sample, single_end?, [ fastq_1, fastq_2 ]] + CHECK_SAMPLESHEET(ch_input) + .reads + .splitCsv(header:true, sep:',') + .map { get_samplesheet_paths(it, params.single_end) } + .set { ch_raw_reads } + + // Get design information from samplesheet + // [sample, control, antibody, replicatesExist?, multipleGroups?] + CHECK_SAMPLESHEET + .out + .controls + .splitCsv(header:true, sep:',') + .map { get_samplesheet_design(it) } + .set { ch_design } + + // FASTQC(ch_raw_reads_fastqc) OUTPUT_DOCUMENTATION( ch_output_docs, @@ -181,56 +195,6 @@ workflow.onComplete { Completion.summary(workflow, params, log) } -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- PARSE DESIGN FILE -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// process CHECK_DESIGN { -// tag "$design" -// publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode -// -// input: -// path design from ch_input -// -// output: -// path 'design_reads.csv' into ch_design_reads_csv -// path 'design_controls.csv' into ch_design_controls_csv -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// """ -// check_design.py $design design_reads.csv design_controls.csv -// """ -// } - -// /* -// * Create channels for input fastq files -// */ -// if (params.single_end) { -// ch_design_reads_csv -// .splitCsv(header:true, sep:',') -// .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true) ] ] } -// .into { ch_raw_reads_fastqc; -// ch_raw_reads_trimgalore } -// } else { -// ch_design_reads_csv -// .splitCsv(header:true, sep:',') -// .map { row -> [ row.sample_id, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] } -// .into { ch_raw_reads_fastqc; -// ch_raw_reads_trimgalore } -// } -// -// /* -// * Create a channel with [sample_id, control id, antibody, replicatesExist, multipleGroups] -// */ -// ch_design_controls_csv -// .splitCsv(header:true, sep:',') -// .map { row -> [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] } -// .set { ch_design_controls_csv } -// // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ From dab4f8eab19b16c1348e4ad8d2d89d6c8bd32bad Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 08:48:14 +0100 Subject: [PATCH 014/538] Fix Groovy functions --- modules/local/check_samplesheet.nf | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf index a839758f4..a8c011a8c 100755 --- a/modules/local/check_samplesheet.nf +++ b/modules/local/check_samplesheet.nf @@ -9,21 +9,20 @@ process CHECK_SAMPLESHEET { path samplesheet output: - path 'design_reads.csv' - path 'design_controls.csv' + path 'samplesheet_reads.csv', emit: reads + path 'samplesheet_controls.csv', emit: controls script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ - check_samplesheet.py $design design_reads.csv design_controls.csv + check_samplesheet.py $samplesheet samplesheet_reads.csv samplesheet_controls.csv """ } // Function to get list of [ sample, single_end?, [ fastq_1, fastq_2 ] ] -def check_samplesheet_paths(LinkedHashMap samplesheet) { - def sample = samplesheet.sample - def single_end = samplesheet.single_end.toBoolean() - def fastq_1 = samplesheet.fastq_1 - def fastq_2 = samplesheet.fastq_2 +def get_samplesheet_paths(LinkedHashMap row, boolean single_end) { + def sample = row.sample_id + def fastq_1 = row.fastq_1 + def fastq_2 = row.fastq_2 def array = [] if (single_end) { @@ -33,3 +32,8 @@ def check_samplesheet_paths(LinkedHashMap samplesheet) { } return array } + +// Function to get list of [sample, control, antibody, replicatesExist?, multipleGroups?] +def get_samplesheet_design(LinkedHashMap row) { + return [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] +} From a0dcd6481a8e99433bc76547d4948aa9afc319a2 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 18:47:27 +0100 Subject: [PATCH 015/538] Get processes working until sorting bams --- main.nf | 355 ++++++++++---------------------------------------------- 1 file changed, 62 insertions(+), 293 deletions(-) diff --git a/main.nf b/main.nf index 836632d53..2ccfeea21 100755 --- a/main.nf +++ b/main.nf @@ -59,7 +59,7 @@ if (params.blacklist) { ch_blacklist = Channel.fromPath(params.blacklist, checkI if (params.fasta) { lastPath = params.fasta.lastIndexOf(File.separator) - bwa_base = params.fasta.substring(lastPath+1) + params.bwa_base = params.fasta.substring(lastPath+1) ch_fasta = file(params.fasta, checkIfExists: true) } else { exit 1, 'Fasta file not specified!' @@ -68,7 +68,7 @@ if (params.fasta) { if (params.bwa_index) { lastPath = params.bwa_index.lastIndexOf(File.separator) bwa_dir = params.bwa_index.substring(0,lastPath+1) - bwa_base = params.bwa_index.substring(lastPath+1) + params.bwa_base = params.bwa_index.substring(lastPath+1) Channel .fromPath(bwa_dir, checkIfExists: true) .set { ch_bwa_index } @@ -80,6 +80,17 @@ if (params.anno_readme && file(params.anno_readme).exists()) { file(params.anno_readme).copyTo("${params.outdir}/genome/") } +// If --gtf is supplied along with --genome +// Make gene bed from supplied --gtf instead of using iGenomes one automatically +def MAKE_BED = false +if (!params.gene_bed) { + MAKE_BED = true +} else if (params.genome && params.gtf) { + if (params.genomes[ params.genome ].gtf != params.gtf) { + MAKE_BED = true + } +} + /* * Check parameters */ @@ -137,33 +148,41 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" /* * Include local pipeline modules */ -include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) -include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) include { CHECK_SAMPLESHEET get_samplesheet_paths get_samplesheet_design } from './modules/local/check_samplesheet' params(params) +include { GTF2BED } from './modules/local/gtf2bed' params(params) +include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' params(params) +include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' params(params) +include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) +include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) -// /* -// * Include nf-core modules -// */ -// include { FASTQC } from './modules/nf-core/fastqc' params(params) -// include { MULTIQC } from './modules/nf-core/multiqc' params(params) +/* + * Include nf-core modules + */ +include { FASTQC } from './modules/nf-core/fastqc' params(params) +include { BWA_INDEX } from './modules/nf-core/bwa_index' params(params) +include { TRIMGALORE } from './modules/nf-core/trimgalore' params(params) +include { BWA_MEM } from './modules/nf-core/bwa_mem' params(params) +include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' params(params) +include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' params(params) +include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' params(params) +include { MULTIQC } from './modules/nf-core/multiqc' params(params) /* * Run the workflow */ workflow { - // Get paths to FastQ files - // [sample, single_end?, [ fastq_1, fastq_2 ]] + /* + * READ IN SAMPLESHEET + */ CHECK_SAMPLESHEET(ch_input) .reads .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, params.single_end) } .set { ch_raw_reads } - // Get design information from samplesheet - // [sample, control, antibody, replicatesExist?, multipleGroups?] CHECK_SAMPLESHEET .out .controls @@ -171,8 +190,37 @@ workflow { .map { get_samplesheet_design(it) } .set { ch_design } - // FASTQC(ch_raw_reads_fastqc) + /* + * PREPARE GENOME FILES + */ + if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_bwa_index } } + if (MAKE_BED) { GTF2BED(ch_gtf).set { ch_gene_bed } } + MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) + /* + * READ QC & TRIMMING + */ + FASTQC(ch_raw_reads) + if (params.skip_trimming) { + ch_trimmed_reads = ch_raw_reads + ch_trimgalore_log_mqc = Channel.empty() + ch_trimgalore_fastqc_mqc = Channel.empty() + } else { + TRIMGALORE(ch_raw_reads).reads.set { ch_trimmed_reads } + ch_trimgalore_log_mqc = TRIMGALORE.out.log + ch_trimgalore_fastqc_mqc = TRIMGALORE.out.fastqc + } + + /* + * MAP READS & BAM QC + */ + BWA_MEM(ch_trimmed_reads, ch_bwa_index.collect()) + SAMTOOLS_SORT(BWA_MEM.out) | SAMTOOLS_INDEX + SAMTOOLS_STATS(SAMTOOLS_SORT.out) + + /* + * PIPELINE REPORTING + */ OUTPUT_DOCUMENTATION( ch_output_docs, ch_output_docs_images) @@ -195,285 +243,6 @@ workflow.onComplete { Completion.summary(workflow, params, log) } -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- PREPARE ANNOTATION FILES -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * PREPROCESSING: Build BWA index -// */ -// if (!params.bwa_index) { -// process BWA_INDEX { -// tag "$fasta" -// label 'process_high' -// publishDir path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, -// saveAs: { params.save_reference ? it : null }, mode: params.publish_dir_mode -// -// input: -// path fasta from ch_fasta -// -// output: -// path 'BWAIndex' into ch_bwa_index -// -// script: -// """ -// bwa index -a bwtsw $fasta -// mkdir BWAIndex && mv ${fasta}* BWAIndex -// """ -// } -// } -// -// /* -// * PREPROCESSING: Generate gene BED file -// */ -// // If --gtf is supplied along with --genome -// // Make gene bed from supplied --gtf instead of using iGenomes one automatically -// def MAKE_BED = false -// if (!params.gene_bed) { -// MAKE_BED = true -// } else if (params.genome && params.gtf) { -// if (params.genomes[ params.genome ].gtf != params.gtf) { -// MAKE_BED = true -// } -// } -// if (MAKE_BED) { -// process MAKE_GENE_BED { -// tag "$gtf" -// label 'process_low' -// publishDir "${params.outdir}/genome", mode: params.publish_dir_mode -// -// input: -// path gtf from ch_gtf -// -// output: -// path '*.bed' into ch_gene_bed -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// """ -// gtf2bed $gtf > ${gtf.baseName}.bed -// """ -// } -// } -// -// /* -// * PREPROCESSING: Prepare genome intervals for filtering -// */ -// process MAKE_GENOME_FILTER { -// tag "$fasta" -// publishDir "${params.outdir}/genome", mode: params.publish_dir_mode -// -// input: -// path fasta from ch_fasta -// path blacklist from ch_blacklist.ifEmpty([]) -// -// output: -// path "$fasta" // FASTA FILE FOR IGV -// path '*.fai' // FAI INDEX FOR REFERENCE GENOME -// path '*.bed' into ch_genome_filter_regions // BED FILE WITHOUT BLACKLIST REGIONS -// path '*.sizes' into ch_genome_sizes_bigwig // CHROMOSOME SIZES FILE FOR BEDTOOLS -// -// script: -// blacklist_filter = params.blacklist ? "sortBed -i $blacklist -g ${fasta}.sizes | complementBed -i stdin -g ${fasta}.sizes" : "awk '{print \$1, '0' , \$2}' OFS='\t' ${fasta}.sizes" -// """ -// samtools faidx $fasta -// cut -f 1,2 ${fasta}.fai > ${fasta}.sizes -// $blacklist_filter > ${fasta}.include_regions.bed -// """ -// } -// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- FASTQ QC -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * STEP 1: FastQC -// */ -// process FASTQC { -// tag "$name" -// label 'process_medium' -// publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, -// saveAs: { filename -> -// filename.endsWith('.zip') ? "zips/$filename" : filename -// } -// -// when: -// !params.skip_fastqc -// -// input: -// tuple val(name), path(reads) from ch_raw_reads_fastqc -// -// output: -// path '*.{zip,html}' into ch_fastqc_reports_mqc -// -// script: -// // Added soft-links to original fastqs for consistent naming in MultiQC -// if (params.single_end) { -// """ -// [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz -// fastqc -q -t $task.cpus ${name}.fastq.gz -// """ -// } else { -// """ -// [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz -// [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz -// fastqc -q -t $task.cpus ${name}_1.fastq.gz -// fastqc -q -t $task.cpus ${name}_2.fastq.gz -// """ -// } -// } -// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- ADAPTER TRIMMING -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * STEP 2: Trim Galore! -// */ -// if (params.skip_trimming) { -// ch_trimmed_reads = ch_raw_reads_trimgalore -// ch_trimgalore_results_mqc = Channel.empty() -// ch_trimgalore_fastqc_reports_mqc = Channel.empty() -// } else { -// process TRIMGALORE { -// tag "$name" -// label 'process_high' -// publishDir "${params.outdir}/trim_galore", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.html')) "fastqc/$filename" -// else if (filename.endsWith('.zip')) "fastqc/zips/$filename" -// else if (filename.endsWith('trimming_report.txt')) "logs/$filename" -// else params.save_trimmed ? filename : null -// } -// -// input: -// tuple val(name), path(reads) from ch_raw_reads_trimgalore -// -// output: -// tuple val(name), path('*.fq.gz') into ch_trimmed_reads -// path '*.txt' into ch_trimgalore_results_mqc -// path '*.{zip,html}' into ch_trimgalore_fastqc_reports_mqc -// -// script: -// // Calculate number of --cores for TrimGalore based on value of task.cpus -// // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 -// // See: https://github.com/nf-core/atacseq/pull/65 -// def cores = 1 -// if (task.cpus) { -// cores = (task.cpus as int) - 4 -// if (params.single_end) cores = (task.cpus as int) - 3 -// if (cores < 1) cores = 1 -// if (cores > 4) cores = 4 -// } -// -// c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' -// c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' -// tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' -// tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' -// nextseq = params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' -// -// // Added soft-links to original fastqs for consistent naming in MultiQC -// if (params.single_end) { -// """ -// [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz -// trim_galore --cores $cores --fastqc --gzip $c_r1 $tpc_r1 $nextseq ${name}.fastq.gz -// """ -// } else { -// """ -// [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz -// [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz -// trim_galore --cores $cores --paired --fastqc --gzip $c_r1 $c_r2 $tpc_r1 $tpc_r2 $nextseq ${name}_1.fastq.gz ${name}_2.fastq.gz -// """ -// } -// } -// } -// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- ALIGN -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * STEP 3.1: Map read(s) with bwa mem -// */ -// process BWA_MEM { -// tag "$name" -// label 'process_high' -// -// input: -// tuple val(name), path(reads) from ch_trimmed_reads -// path index from ch_bwa_index.collect() -// -// output: -// tuple val(name), path('*.bam') into ch_bwa_bam -// -// script: -// prefix = "${name}.Lb" -// rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\'" -// if (params.seq_center) { -// rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\\tCN:${params.seq_center}\'" -// } -// score = params.bwa_min_score ? "-T ${params.bwa_min_score}" : '' -// """ -// bwa mem \\ -// -t $task.cpus \\ -// -M \\ -// -R $rg \\ -// $score \\ -// ${index}/${bwa_base} \\ -// $reads \\ -// | samtools view -@ $task.cpus -b -h -F 0x0100 -O BAM -o ${prefix}.bam - -// """ -// } -// -// /* -// * STEP 3.2: Convert BAM to coordinate sorted BAM -// */ -// process SORT_BAM { -// tag "$name" -// label 'process_medium' -// if (params.save_align_intermeds) { -// publishDir path: "${params.outdir}/bwa/library", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" -// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" -// else if (filename.endsWith('.stats')) "samtools_stats/$filename" -// else filename -// } -// } -// -// input: -// tuple val(name), path(bam) from ch_bwa_bam -// -// output: -// tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_sort_bam_merge -// path '*.{flagstat,idxstats,stats}' into ch_sort_bam_flagstat_mqc -// -// script: -// prefix = "${name}.Lb" -// """ -// samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam -// samtools index ${prefix}.sorted.bam -// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat -// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats -// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats -// """ -// } -// // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ From 1da66990b603084ab15f0d0b88dbd8478e72c88d Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 18:47:41 +0100 Subject: [PATCH 016/538] This is not the atacseq pipeline --- nextflow_schema.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 5614b18c1..1d0dfff29 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema", "$id": "https://raw.githubusercontent.com/nf-core/atacseq/master/nextflow_schema.json", - "title": "nf-core/atacseq pipeline parameters", - "description": "ATACSeq peak-calling and differential analysis pipeline.", + "title": "nf-core/chipseq pipeline parameters", + "description": "ChIP-seq peak-calling and differential analysis pipeline.", "type": "object", "properties": { "Input/output options": { @@ -537,4 +537,4 @@ "fa_icon": "fas fa-file-import" } } -} \ No newline at end of file +} From 2dd559ece569f9babc1aa6c67ad4b2a8e6f74c8f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 18:48:04 +0100 Subject: [PATCH 017/538] Initial commit of local modules --- modules/local/get_chrom_sizes.nf | 20 ++++++++++++++++++++ modules/local/gtf2bed.nf | 19 +++++++++++++++++++ modules/local/make_genome_filter.nf | 27 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 modules/local/get_chrom_sizes.nf create mode 100644 modules/local/gtf2bed.nf create mode 100644 modules/local/make_genome_filter.nf diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf new file mode 100644 index 000000000..9c9a35f86 --- /dev/null +++ b/modules/local/get_chrom_sizes.nf @@ -0,0 +1,20 @@ +/* + * Get chromosome sizes from a fasta file + */ + process GET_CHROM_SIZES { + tag "$fasta" + publishDir "${params.outdir}/genome", mode: params.publish_dir_mode + + input: + path fasta + + output: + path '*.sizes', emit: sizes + path '*.fai', emit: fai + + script: + """ + samtools faidx $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + """ + } diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf new file mode 100644 index 000000000..304eb6b03 --- /dev/null +++ b/modules/local/gtf2bed.nf @@ -0,0 +1,19 @@ +/* + * Convert GTF to BED file + */ +process GTF2BED { + tag "$gtf" + //label 'process_low' + publishDir "${params.outdir}/genome", mode: params.publish_dir_mode + + input: + path gtf + + output: + path '*.bed' + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + gtf2bed $gtf > ${gtf.baseName}.bed + """ +} diff --git a/modules/local/make_genome_filter.nf b/modules/local/make_genome_filter.nf new file mode 100644 index 000000000..5e91d61ce --- /dev/null +++ b/modules/local/make_genome_filter.nf @@ -0,0 +1,27 @@ +/* + * Prepare genome intervals for filtering + * by removing regions in blacklist file + */ +process MAKE_GENOME_FILTER { + tag "$sizes" + publishDir "${params.outdir}/genome", mode: params.publish_dir_mode + + input: + path sizes + path blacklist + + output: + path '*.bed' + + script: + file_out = "${sizes.simpleName}.include_regions.bed" + if (params.blacklist) { + """ + sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out + """ + } else { + """ + awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out + """ + } +} From 5936c6f699fe0168b1bc2ea65f5e3e01ded1602d Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 18:48:47 +0100 Subject: [PATCH 018/538] Add local nf-core modules to get pipeline working --- modules/nf-core/bwa_index.nf | 21 +++++++++++ modules/nf-core/bwa_mem.nf | 32 ++++++++++++++++ modules/nf-core/samtools_flagstats.nf | 0 modules/nf-core/samtools_idxstats.nf | 0 modules/nf-core/samtools_index.nf | 20 ++++++++++ modules/nf-core/samtools_sort.nf | 20 ++++++++++ modules/nf-core/samtools_stats.nf | 24 ++++++++++++ modules/nf-core/trimgalore.nf | 54 +++++++++++++++++++++++++++ 8 files changed, 171 insertions(+) create mode 100644 modules/nf-core/bwa_index.nf create mode 100644 modules/nf-core/bwa_mem.nf create mode 100644 modules/nf-core/samtools_flagstats.nf create mode 100644 modules/nf-core/samtools_idxstats.nf create mode 100644 modules/nf-core/samtools_index.nf create mode 100644 modules/nf-core/samtools_sort.nf create mode 100644 modules/nf-core/samtools_stats.nf create mode 100644 modules/nf-core/trimgalore.nf diff --git a/modules/nf-core/bwa_index.nf b/modules/nf-core/bwa_index.nf new file mode 100644 index 000000000..8f6e5f52e --- /dev/null +++ b/modules/nf-core/bwa_index.nf @@ -0,0 +1,21 @@ +/* + * Build BWA index + */ +process BWA_INDEX { + tag "$fasta" + //label 'process_high' + // publishDir path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, + // saveAs: { params.save_reference ? it : null }, mode: params.publish_dir_mode + + input: + path fasta + + output: + path 'BWAIndex' + + script: + """ + bwa index -a bwtsw $fasta + mkdir BWAIndex && mv ${fasta}* BWAIndex + """ +} diff --git a/modules/nf-core/bwa_mem.nf b/modules/nf-core/bwa_mem.nf new file mode 100644 index 000000000..a0c72a81d --- /dev/null +++ b/modules/nf-core/bwa_mem.nf @@ -0,0 +1,32 @@ +/* + * Map read(s) with bwa mem + */ +process BWA_MEM { + tag "$name" + label 'process_high' + + input: + tuple val(name), val(single_end), path(reads) + path index + + output: + tuple val(name), val(single_end), path('*.bam') + + script: + prefix = "${name}.Lb" + rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\'" + if (params.seq_center) { + rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\\tCN:${params.seq_center}\'" + } + score = params.bwa_min_score ? "-T ${params.bwa_min_score}" : '' + """ + bwa mem \\ + -t $task.cpus \\ + -M \\ + -R $rg \\ + $score \\ + ${index}/${params.bwa_base} \\ + $reads \\ + | samtools view -@ $task.cpus -b -h -F 0x0100 -O BAM -o ${prefix}.bam - + """ +} diff --git a/modules/nf-core/samtools_flagstats.nf b/modules/nf-core/samtools_flagstats.nf new file mode 100644 index 000000000..e69de29bb diff --git a/modules/nf-core/samtools_idxstats.nf b/modules/nf-core/samtools_idxstats.nf new file mode 100644 index 000000000..e69de29bb diff --git a/modules/nf-core/samtools_index.nf b/modules/nf-core/samtools_index.nf new file mode 100644 index 000000000..007b0b978 --- /dev/null +++ b/modules/nf-core/samtools_index.nf @@ -0,0 +1,20 @@ +/* + * Index BAM file + */ +process SAMTOOLS_INDEX { + tag "$name" + label 'process_medium' + publishDir path: "${params.outdir}", mode: params.publish_dir_mode + + input: + tuple val(name), val(single_end), path(bam) + + output: + tuple val(name), val(single_end), path('*.bai') + + script: + prefix = "${name}.Lb" + """ + samtools index ${prefix}.sorted.bam + """ +} diff --git a/modules/nf-core/samtools_sort.nf b/modules/nf-core/samtools_sort.nf new file mode 100644 index 000000000..2192ec88f --- /dev/null +++ b/modules/nf-core/samtools_sort.nf @@ -0,0 +1,20 @@ +/* + * Sort BAM file + */ +process SAMTOOLS_SORT { + tag "$name" + label 'process_medium' + publishDir path: "${params.outdir}", mode: params.publish_dir_mode + + input: + tuple val(name), val(single_end), path(bam) + + output: + tuple val(name), val(single_end), path('*.bam') + + script: + prefix = "${name}.Lb" + """ + samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam + """ +} diff --git a/modules/nf-core/samtools_stats.nf b/modules/nf-core/samtools_stats.nf new file mode 100644 index 000000000..c470ee0fd --- /dev/null +++ b/modules/nf-core/samtools_stats.nf @@ -0,0 +1,24 @@ +/* + * Index BAM file + */ +process SAMTOOLS_STATS { + tag "$name" + label 'process_medium' + publishDir path: "${params.outdir}", mode: params.publish_dir_mode + + input: + tuple val(name), val(single_end), path(bam) + + output: + tuple val(name), val(single_end), path('*.stats'), emit: stats + tuple val(name), val(single_end), path('*.flagstat'), emit: flagstat + tuple val(name), val(single_end), path('*.idxstats'), emit: idxstats + + script: + prefix = "${name}.Lb" + """ + samtools stats $bam > ${bam}.stats + samtools flagstat $bam > ${bam}.flagstat + samtools idxstats $bam > ${bam}.idxstats + """ +} diff --git a/modules/nf-core/trimgalore.nf b/modules/nf-core/trimgalore.nf new file mode 100644 index 000000000..08cb5c0df --- /dev/null +++ b/modules/nf-core/trimgalore.nf @@ -0,0 +1,54 @@ +/* + * Trim Galore! + */ +process TRIMGALORE { + tag "$name" + label 'process_high' + publishDir "${params.outdir}/trim_galore", mode: params.publish_dir_mode, + saveAs: { filename -> + if (filename.endsWith('.html')) "fastqc/$filename" + else if (filename.endsWith('.zip')) "fastqc/zips/$filename" + else if (filename.endsWith('trimming_report.txt')) "logs/$filename" + else params.save_trimmed ? filename : null + } + + input: + tuple val(name), val(single_end), path(reads) + + output: + tuple val(name), val(single_end), path('*.fq.gz'), emit: reads + path '*.txt', emit: log + path '*.{zip,html}', emit: fastqc + + script: + // Calculate number of --cores for TrimGalore based on value of task.cpus + // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 + // See: https://github.com/nf-core/atacseq/pull/65 + def cores = 1 + if (task.cpus) { + cores = (task.cpus as int) - 4 + if (single_end) cores = (task.cpus as int) - 3 + if (cores < 1) cores = 1 + if (cores > 4) cores = 4 + } + + c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' + c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' + tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' + tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' + nextseq = params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' + + // Added soft-links to original fastqs for consistent naming in MultiQC + if (single_end) { + """ + [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz + trim_galore --cores $cores --fastqc --gzip $c_r1 $tpc_r1 $nextseq ${name}.fastq.gz + """ + } else { + """ + [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz + [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz + trim_galore --cores $cores --paired --fastqc --gzip $c_r1 $c_r2 $tpc_r1 $tpc_r2 $nextseq ${name}_1.fastq.gz ${name}_2.fastq.gz + """ + } +} From 602985e2fdd31d3d84f5059b28679aad6ccda541 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 21:32:52 +0100 Subject: [PATCH 019/538] Remove cache for testing --- conf/base.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/base.config b/conf/base.config index 789af0d6c..ea4261cd6 100644 --- a/conf/base.config +++ b/conf/base.config @@ -41,8 +41,8 @@ process { withLabel:error_ignore { errorStrategy = 'ignore' } - withName:GET_SOFTWARE_VERSIONS { - cache = false - } + //withName:GET_SOFTWARE_VERSIONS { + // cache = false + //} } From aeab6c21d1b6370898cfc555ebad90d2260b6d38 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 21:33:02 +0100 Subject: [PATCH 020/538] Add in more processes --- main.nf | 165 +++++++++----------------------------------------------- 1 file changed, 24 insertions(+), 141 deletions(-) diff --git a/main.nf b/main.nf index 2ccfeea21..45cada21a 100755 --- a/main.nf +++ b/main.nf @@ -148,12 +148,13 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" /* * Include local pipeline modules */ -include { CHECK_SAMPLESHEET - get_samplesheet_paths +include { CHECK_SAMPLESHEET; + get_samplesheet_paths; get_samplesheet_design } from './modules/local/check_samplesheet' params(params) include { GTF2BED } from './modules/local/gtf2bed' params(params) include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' params(params) include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' params(params) +include { FILTER_BAM } from './modules/local/filter_bam' params(params) include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) @@ -166,7 +167,11 @@ include { TRIMGALORE } from './modules/nf-core/trimgalore' params(params) include { BWA_MEM } from './modules/nf-core/bwa_mem' params(params) include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' params(params) include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' params(params) -include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' params(params) +include { SAMTOOLS_STATS as SAMTOOLS_STATS_MAP; + SAMTOOLS_STATS as SAMTOOLS_STATS_MARKDUPLICATES } from './modules/nf-core/samtools_stats' params(params) +include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' params(params) +include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' params(params) +//include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' params(params) include { MULTIQC } from './modules/nf-core/multiqc' params(params) /* @@ -216,7 +221,22 @@ workflow { */ BWA_MEM(ch_trimmed_reads, ch_bwa_index.collect()) SAMTOOLS_SORT(BWA_MEM.out) | SAMTOOLS_INDEX - SAMTOOLS_STATS(SAMTOOLS_SORT.out) + SAMTOOLS_STATS_MAP(SAMTOOLS_SORT.out) + + /* + * MERGE RESEQUENCED BAM FILES + */ + SAMTOOLS_SORT + .out + .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } + .groupTuple(by: [0, 1]) + .map { it -> [ it[0], it[1], it[2].flatten() ] } + .set { ch_sort_bam } + PICARD_MERGESAMFILES(ch_sort_bam) + PICARD_MARKDUPLICATES(PICARD_MERGESAMFILES.out).bam | SAMTOOLS_STATS_MARKDUPLICATES + FILTER_BAM(PICARD_MARKDUPLICATES.out.bam, + MAKE_GENOME_FILTER.out.collect(), + ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE /* * PIPELINE REPORTING @@ -252,143 +272,6 @@ workflow.onComplete { // /////////////////////////////////////////////////////////////////////////////// // // /* -// * STEP 4.1: Merge BAM files for all libraries from same sample replicate -// */ -// ch_sort_bam_merge -// .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1] ] } -// .groupTuple(by: [0]) -// .map { it -> [ it[0], it[1].flatten() ] } -// .set { ch_sort_bam_merge } -// -// process MERGED_BAM { -// tag "$name" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" -// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" -// else if (filename.endsWith('.stats')) "samtools_stats/$filename" -// else if (filename.endsWith('.metrics.txt')) "picard_metrics/$filename" -// else params.save_align_intermeds ? filename : null -// } -// -// input: -// tuple val(name), path(bams) from ch_sort_bam_merge -// -// output: -// tuple val(name), path("*${prefix}.sorted.{bam,bam.bai}") into ch_merge_bam_filter, -// ch_merge_bam_preseq -// path '*.{flagstat,idxstats,stats}' into ch_merge_bam_stats_mqc -// path '*.txt' into ch_merge_bam_metrics_mqc -// -// script: -// prefix = "${name}.mLb.mkD" -// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() -// def avail_mem = 3 -// if (!task.memory) { -// log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' -// } else { -// avail_mem = task.memory.toGiga() -// } -// if (bam_files.size() > 1) { -// """ -// picard -Xmx${avail_mem}g MergeSamFiles \\ -// ${'INPUT='+bam_files.join(' INPUT=')} \\ -// OUTPUT=${name}.sorted.bam \\ -// SORT_ORDER=coordinate \\ -// VALIDATION_STRINGENCY=LENIENT \\ -// TMP_DIR=tmp -// samtools index ${name}.sorted.bam -// -// picard -Xmx${avail_mem}g MarkDuplicates \\ -// INPUT=${name}.sorted.bam \\ -// OUTPUT=${prefix}.sorted.bam \\ -// ASSUME_SORTED=true \\ -// REMOVE_DUPLICATES=false \\ -// METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ -// VALIDATION_STRINGENCY=LENIENT \\ -// TMP_DIR=tmp -// -// samtools index ${prefix}.sorted.bam -// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats -// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat -// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats -// """ -// } else { -// """ -// picard -Xmx${avail_mem}g MarkDuplicates \\ -// INPUT=${bam_files[0]} \\ -// OUTPUT=${prefix}.sorted.bam \\ -// ASSUME_SORTED=true \\ -// REMOVE_DUPLICATES=false \\ -// METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ -// VALIDATION_STRINGENCY=LENIENT \\ -// TMP_DIR=tmp -// -// samtools index ${prefix}.sorted.bam -// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats -// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat -// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats -// """ -// } -// } -// -// /* -// * STEP 4.2: Filter BAM file at merged library-level -// */ -// process MERGED_BAM_FILTER { -// tag "$name" -// label 'process_medium' -// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (params.single_end || params.save_align_intermeds) { -// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" -// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" -// else if (filename.endsWith('.stats')) "samtools_stats/$filename" -// else if (filename.endsWith('.sorted.bam')) filename -// else if (filename.endsWith('.sorted.bam.bai')) filename -// else null -// } -// } -// -// input: -// tuple val(name), path(bam) from ch_merge_bam_filter -// path bed from ch_genome_filter_regions.collect() -// path bamtools_filter_config from ch_bamtools_filter_config -// -// output: -// tuple val(name), path('*.{bam,bam.bai}') into ch_filter_bam -// tuple val(name), path('*.flagstat') into ch_filter_bam_flagstat -// path '*.{idxstats,stats}' into ch_filter_bam_stats_mqc -// -// script: -// prefix = params.single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" -// filter_params = params.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' -// dup_params = params.keep_dups ? '' : '-F 0x0400' -// multimap_params = params.keep_multi_map ? '' : '-q 1' -// blacklist_params = params.blacklist ? "-L $bed" : '' -// name_sort_bam = params.single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" -// """ -// samtools view \\ -// $filter_params \\ -// $dup_params \\ -// $multimap_params \\ -// $blacklist_params \\ -// -b ${bam[0]} \\ -// | bamtools filter \\ -// -out ${prefix}.sorted.bam \\ -// -script $bamtools_filter_config -// -// samtools index ${prefix}.sorted.bam -// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat -// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats -// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats -// -// $name_sort_bam -// """ -// } -// -// /* // * STEP 4.3: Remove orphan reads from paired-end BAM file // */ // if (params.single_end) { From 8942bb95a7db58f75385523cf2e3a74988c43339 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 21:33:18 +0100 Subject: [PATCH 021/538] Add in more local processes --- modules/local/filter_bam.nf | 55 +++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 modules/local/filter_bam.nf diff --git a/modules/local/filter_bam.nf b/modules/local/filter_bam.nf new file mode 100644 index 000000000..17549eb32 --- /dev/null +++ b/modules/local/filter_bam.nf @@ -0,0 +1,55 @@ +/* + * Filter BAM file + */ +process FILTER_BAM { + tag "$name" + label 'process_medium' + publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, + saveAs: { filename -> + if (single_end || params.save_align_intermeds) { + if (filename.endsWith('.flagstat')) "samtools_stats/$filename" + else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" + else if (filename.endsWith('.stats')) "samtools_stats/$filename" + else if (filename.endsWith('.sorted.bam')) filename + else if (filename.endsWith('.sorted.bam.bai')) filename + else null + } + } + + input: + tuple val(name), val(single_end), path(bam) + path bed + path filter_config + + output: + tuple val(name), val(single_end), path('*.bam'), emit: bam + tuple val(name), val(single_end), path('*.bai'), emit: bai + tuple val(name), val(single_end), path('*.stats'), emit: stats + tuple val(name), val(single_end), path('*.flagstat'), emit: flagstat + tuple val(name), val(single_end), path('*.idxstats'), emit: idxstats + + script: + prefix = single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" + filter_params = single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' + dup_params = params.keep_dups ? '' : '-F 0x0400' + multimap_params = params.keep_multi_map ? '' : '-q 1' + blacklist_params = params.blacklist ? "-L $bed" : '' + name_sort_bam = single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" + """ + samtools view \\ + $filter_params \\ + $dup_params \\ + $multimap_params \\ + $blacklist_params \\ + -b ${bam[0]} \\ + | bamtools filter \\ + -out ${prefix}.sorted.bam \\ + -script $filter_config + samtools index ${prefix}.sorted.bam + samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat + samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats + samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats + + $name_sort_bam + """ +} From b61f3cdbeb124cca70318c62715b1d91e3848377 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 14 Jul 2020 21:33:28 +0100 Subject: [PATCH 022/538] Add picard modules --- .../nf-core/picard_collectmultiplemetrics.nf | 0 modules/nf-core/picard_markduplicates.nf | 34 +++++++++++++++++ modules/nf-core/picard_mergesamfiles.nf | 38 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 modules/nf-core/picard_collectmultiplemetrics.nf create mode 100644 modules/nf-core/picard_markduplicates.nf create mode 100644 modules/nf-core/picard_mergesamfiles.nf diff --git a/modules/nf-core/picard_collectmultiplemetrics.nf b/modules/nf-core/picard_collectmultiplemetrics.nf new file mode 100644 index 000000000..e69de29bb diff --git a/modules/nf-core/picard_markduplicates.nf b/modules/nf-core/picard_markduplicates.nf new file mode 100644 index 000000000..45e5c116b --- /dev/null +++ b/modules/nf-core/picard_markduplicates.nf @@ -0,0 +1,34 @@ +/* + * Picard MarkDuplicates + */ +process PICARD_MARKDUPLICATES { + tag "$name" + label 'process_medium' + publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode + + input: + tuple val(name), val(single_end), path(bam) + + output: + tuple val(name), val(single_end), path("*.bam"), emit: bam + tuple val(name), val(single_end), path("*.txt"), emit: metrics + + script: + prefix = "${name}.mLb.mkD" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + picard -Xmx${avail_mem}g MarkDuplicates \\ + INPUT=$bam \\ + OUTPUT=${prefix}.sorted.bam \\ + ASSUME_SORTED=true \\ + REMOVE_DUPLICATES=false \\ + METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ + VALIDATION_STRINGENCY=LENIENT \\ + TMP_DIR=tmp + """ +} diff --git a/modules/nf-core/picard_mergesamfiles.nf b/modules/nf-core/picard_mergesamfiles.nf new file mode 100644 index 000000000..785512d38 --- /dev/null +++ b/modules/nf-core/picard_mergesamfiles.nf @@ -0,0 +1,38 @@ +/* + * Picard MergeSamFiles + */ +process PICARD_MERGESAMFILES { + tag "$name" + label 'process_medium' + publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode + + input: + tuple val(name), val(single_end), path(bams) + + output: + tuple val(name), val(single_end), path("*.bam") + + script: + prefix = "${name}.mLb.mkD" + bam_files = bams.sort() + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + if (bam_files.size() > 1) { + """ + picard -Xmx${avail_mem}g MergeSamFiles \\ + ${'INPUT='+bam_files.join(' INPUT=')} \\ + OUTPUT=${name}.sorted.bam \\ + SORT_ORDER=coordinate \\ + VALIDATION_STRINGENCY=LENIENT \\ + TMP_DIR=tmp + """ + } else { + """ + ln -s ${bam_files[0]} ${name}.sorted.bam + """ + } +} From 7961437a5053ca04b5680e6b78b126dc4dcd71bd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 15 Jul 2020 14:48:06 +0100 Subject: [PATCH 023/538] Add subworkflows --- main.nf | 153 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 108 insertions(+), 45 deletions(-) diff --git a/main.nf b/main.nf index 45cada21a..4c1c0f5a5 100755 --- a/main.nf +++ b/main.nf @@ -71,7 +71,7 @@ if (params.bwa_index) { params.bwa_base = params.bwa_index.substring(lastPath+1) Channel .fromPath(bwa_dir, checkIfExists: true) - .set { ch_bwa_index } + .set { ch_index } } // Save AWS IGenomes file containing annotation version @@ -82,12 +82,12 @@ if (params.anno_readme && file(params.anno_readme).exists()) { // If --gtf is supplied along with --genome // Make gene bed from supplied --gtf instead of using iGenomes one automatically -def MAKE_BED = false +def MakeBED = false if (!params.gene_bed) { - MAKE_BED = true + MakeBED = true } else if (params.genome && params.gtf) { if (params.genomes[ params.genome ].gtf != params.gtf) { - MAKE_BED = true + MakeBED = true } } @@ -167,26 +167,27 @@ include { TRIMGALORE } from './modules/nf-core/trimgalore' params(params) include { BWA_MEM } from './modules/nf-core/bwa_mem' params(params) include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' params(params) include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' params(params) -include { SAMTOOLS_STATS as SAMTOOLS_STATS_MAP; - SAMTOOLS_STATS as SAMTOOLS_STATS_MARKDUPLICATES } from './modules/nf-core/samtools_stats' params(params) +// include { SAMTOOLS_STATS as SAMTOOLS_STATS_MAP; +// SAMTOOLS_STATS as SAMTOOLS_STATS_MARKDUPLICATES } from './modules/nf-core/samtools_stats' params(params) +include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' params(params) include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' params(params) include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' params(params) //include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' params(params) include { MULTIQC } from './modules/nf-core/multiqc' params(params) /* - * Run the workflow + * Check input samplesheet and get read channels */ -workflow { +workflow CHECK_INPUTS { + take: + ch_input // /path/to/samplesheet.csv - /* - * READ IN SAMPLESHEET - */ + main: CHECK_SAMPLESHEET(ch_input) .reads .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, params.single_end) } - .set { ch_raw_reads } + .set { ch_reads } CHECK_SAMPLESHEET .out @@ -195,48 +196,110 @@ workflow { .map { get_samplesheet_design(it) } .set { ch_design } - /* - * PREPARE GENOME FILES - */ - if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_bwa_index } } - if (MAKE_BED) { GTF2BED(ch_gtf).set { ch_gene_bed } } - MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) + emit: + reads = ch_reads + design = ch_design +} - /* - * READ QC & TRIMMING - */ - FASTQC(ch_raw_reads) - if (params.skip_trimming) { - ch_trimmed_reads = ch_raw_reads - ch_trimgalore_log_mqc = Channel.empty() - ch_trimgalore_fastqc_mqc = Channel.empty() - } else { - TRIMGALORE(ch_raw_reads).reads.set { ch_trimmed_reads } - ch_trimgalore_log_mqc = TRIMGALORE.out.log - ch_trimgalore_fastqc_mqc = TRIMGALORE.out.fastqc +/* + * Read QC and trimming + */ +workflow QC_TRIM_READS { + take: + ch_reads // [ val(name), val(single_end), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + + main: + fastqc = Channel.empty() + if (!skip_fastqc) { + fastqc = FASTQC(ch_reads) } - /* - * MAP READS & BAM QC - */ - BWA_MEM(ch_trimmed_reads, ch_bwa_index.collect()) - SAMTOOLS_SORT(BWA_MEM.out) | SAMTOOLS_INDEX - SAMTOOLS_STATS_MAP(SAMTOOLS_SORT.out) + ch_trimmed_reads = ch_reads + trim_log = Channel.empty() + trim_fastqc = Channel.empty() + if (!skip_trimming) { + TRIMGALORE(ch_reads).reads.set { ch_trimmed_reads } + trim_log = TRIMGALORE.out.log + trim_fastqc = TRIMGALORE.out.fastqc + } - /* - * MERGE RESEQUENCED BAM FILES - */ - SAMTOOLS_SORT + emit: + fastqc = fastqc + reads = ch_trimmed_reads + trim_log = trim_log + trim_fastqc = trim_fastqc +} + +/* + * Sort, index BAM file and run samtools stats, flagstat and idxstats + */ +workflow SORT_BAM { + take: + ch_bam // [ val(name), val(single_end), bam ] + + main: + SAMTOOLS_SORT(ch_bam) | SAMTOOLS_INDEX + SAMTOOLS_STATS(SAMTOOLS_SORT.out, SAMTOOLS_INDEX.out) + + emit: + bam = SAMTOOLS_SORT.out + bai = SAMTOOLS_INDEX.out + stats = SAMTOOLS_STATS.out.stats + flagstat = SAMTOOLS_STATS.out.flagstat + idxstats = SAMTOOLS_STATS.out.idxstats +} + +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ +workflow MAP_READS { + take: + ch_reads // [ val(name), val(single_end), [ reads ] ] + ch_index // [ /path/to/index ] + + main: + BWA_MEM(ch_reads, ch_index.collect()) + SORT_BAM(BWA_MEM.out) + + emit: + bam = SORT_BAM.out.bam + bai = SORT_BAM.out.bai + stats = SORT_BAM.out.stats + flagstat = SORT_BAM.out.flagstat + idxstats = SORT_BAM.out.idxstats +} + +workflow { + + // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES + CHECK_INPUTS(ch_input) + + // PREPARE GENOME FILES + if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } + if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } + MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) + + // READ QC & TRIMMING + QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming) + + // MAP READS & BAM QC + MAP_READS(QC_TRIM_READS.out.reads, ch_index.collect()) + + // MERGE RESEQUENCED BAM FILES + MAP_READS .out + .bam .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } .groupTuple(by: [0, 1]) .map { it -> [ it[0], it[1], it[2].flatten() ] } .set { ch_sort_bam } - PICARD_MERGESAMFILES(ch_sort_bam) - PICARD_MARKDUPLICATES(PICARD_MERGESAMFILES.out).bam | SAMTOOLS_STATS_MARKDUPLICATES - FILTER_BAM(PICARD_MARKDUPLICATES.out.bam, - MAKE_GENOME_FILTER.out.collect(), - ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE + //PICARD_MERGESAMFILES(ch_sort_bam) + // PICARD_MARKDUPLICATES(PICARD_MERGESAMFILES.out).bam | SAMTOOLS_STATS_MARKDUPLICATES + // FILTER_BAM(PICARD_MARKDUPLICATES.out.bam, + // MAKE_GENOME_FILTER.out.collect(), + // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE /* * PIPELINE REPORTING From 1f30058063f4e9389c7186f5f9b57179ae16af83 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 15 Jul 2020 14:48:20 +0100 Subject: [PATCH 024/538] Stage index files --- modules/nf-core/samtools_stats.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nf-core/samtools_stats.nf b/modules/nf-core/samtools_stats.nf index c470ee0fd..309c78199 100644 --- a/modules/nf-core/samtools_stats.nf +++ b/modules/nf-core/samtools_stats.nf @@ -8,6 +8,7 @@ process SAMTOOLS_STATS { input: tuple val(name), val(single_end), path(bam) + tuple val(name), val(single_end), path(bai) output: tuple val(name), val(single_end), path('*.stats'), emit: stats From 7563b22e83567de4d96a8b9a42331531e6c17bef Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 15 Jul 2020 15:00:25 +0100 Subject: [PATCH 025/538] Join BAM and BAI to fix resume bug --- main.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 4c1c0f5a5..5db74137d 100755 --- a/main.nf +++ b/main.nf @@ -167,8 +167,6 @@ include { TRIMGALORE } from './modules/nf-core/trimgalore' params(params) include { BWA_MEM } from './modules/nf-core/bwa_mem' params(params) include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' params(params) include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' params(params) -// include { SAMTOOLS_STATS as SAMTOOLS_STATS_MAP; -// SAMTOOLS_STATS as SAMTOOLS_STATS_MARKDUPLICATES } from './modules/nf-core/samtools_stats' params(params) include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' params(params) include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' params(params) include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' params(params) @@ -241,7 +239,7 @@ workflow SORT_BAM { main: SAMTOOLS_SORT(ch_bam) | SAMTOOLS_INDEX - SAMTOOLS_STATS(SAMTOOLS_SORT.out, SAMTOOLS_INDEX.out) + SAMTOOLS_STATS(SAMTOOLS_SORT.out.join(SAMTOOLS_INDEX.out, by: [0,1])) emit: bam = SAMTOOLS_SORT.out @@ -308,6 +306,7 @@ workflow { ch_output_docs, ch_output_docs_images) + OUTPUT_DOCUMENTATION.dump() GET_SOFTWARE_VERSIONS() // MULTIQC( From 2dcc8b2f6b296b85d505edba60a3fbad9423483b Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 15 Jul 2020 15:00:43 +0100 Subject: [PATCH 026/538] Stage BAI too --- modules/nf-core/samtools_stats.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/samtools_stats.nf b/modules/nf-core/samtools_stats.nf index 309c78199..1621bd141 100644 --- a/modules/nf-core/samtools_stats.nf +++ b/modules/nf-core/samtools_stats.nf @@ -7,9 +7,8 @@ process SAMTOOLS_STATS { publishDir path: "${params.outdir}", mode: params.publish_dir_mode input: - tuple val(name), val(single_end), path(bam) - tuple val(name), val(single_end), path(bai) - + tuple val(name), val(single_end), path(bam), path(bai) + output: tuple val(name), val(single_end), path('*.stats'), emit: stats tuple val(name), val(single_end), path('*.flagstat'), emit: flagstat From 083415a9bb25efd4a60eb5828df70e6d386acacf Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 15 Jul 2020 15:41:05 +0100 Subject: [PATCH 027/538] Get params into FastQC --- main.nf | 33 ++++++++++++++++++++------------- modules/nf-core/fastqc.nf | 31 ++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/main.nf b/main.nf index 5db74137d..6523fbe45 100755 --- a/main.nf +++ b/main.nf @@ -178,7 +178,7 @@ include { MULTIQC } from './modules/nf-core/multiqc' params(params) */ workflow CHECK_INPUTS { take: - ch_input // /path/to/samplesheet.csv + ch_input // file: /path/to/samplesheet.csv main: CHECK_SAMPLESHEET(ch_input) @@ -204,28 +204,35 @@ workflow CHECK_INPUTS { */ workflow QC_TRIM_READS { take: - ch_reads // [ val(name), val(single_end), [ reads ] ] + ch_reads // channel: [ val(name), val(single_end), [ reads ] ] skip_fastqc // boolean: true/false skip_trimming // boolean: true/false + fastqc_args // string: valid arguments accepted by FastQC main: - fastqc = Channel.empty() + fastqc_html = Channel.empty() + fastqc_zip = Channel.empty() + fastqc_version = Channel.empty() if (!skip_fastqc) { - fastqc = FASTQC(ch_reads) + FASTQC(ch_reads, fastqc_args).html.set { fastqc_html } + fastqc_zip = FASTQC.out.zip + fastqc_version = FASTQC.out.version } - ch_trimmed_reads = ch_reads + ch_trim_reads = ch_reads trim_log = Channel.empty() trim_fastqc = Channel.empty() if (!skip_trimming) { - TRIMGALORE(ch_reads).reads.set { ch_trimmed_reads } + TRIMGALORE(ch_reads).reads.set { ch_trim_reads } trim_log = TRIMGALORE.out.log trim_fastqc = TRIMGALORE.out.fastqc } emit: - fastqc = fastqc - reads = ch_trimmed_reads + fastqc_html = fastqc_html + fastqc_zip = fastqc_zip + fastqc_version = fastqc_version + reads = ch_trim_reads trim_log = trim_log trim_fastqc = trim_fastqc } @@ -235,7 +242,7 @@ workflow QC_TRIM_READS { */ workflow SORT_BAM { take: - ch_bam // [ val(name), val(single_end), bam ] + ch_bam // channel: [ val(name), val(single_end), bam ] main: SAMTOOLS_SORT(ch_bam) | SAMTOOLS_INDEX @@ -254,8 +261,8 @@ workflow SORT_BAM { */ workflow MAP_READS { take: - ch_reads // [ val(name), val(single_end), [ reads ] ] - ch_index // [ /path/to/index ] + ch_reads // channel: [ val(name), val(single_end), [ reads ] ] + ch_index // channel: [ /path/to/index ] main: BWA_MEM(ch_reads, ch_index.collect()) @@ -280,7 +287,8 @@ workflow { MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) // READ QC & TRIMMING - QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming) + params.fastqc_args = "--quiet" + QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming, params.fastqc_args) // MAP READS & BAM QC MAP_READS(QC_TRIM_READS.out.reads, ch_index.collect()) @@ -306,7 +314,6 @@ workflow { ch_output_docs, ch_output_docs_images) - OUTPUT_DOCUMENTATION.dump() GET_SOFTWARE_VERSIONS() // MULTIQC( diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf index 5129ab488..5ba3e503a 100755 --- a/modules/nf-core/fastqc.nf +++ b/modules/nf-core/fastqc.nf @@ -1,32 +1,41 @@ -/* - * FastQC - */ +def MODULE = "fastqc" +params.publish_dir = MODULE +params.publish_results = "default" + process FASTQC { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, + publishDir "${params.outdir}/${params.publish_dir}", + mode: params.publish_dir_mode, saveAs: { filename -> - filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" - } + if (params.publish_results == "none") null + else filename } + + //container "docker.pkg.github.com/nf-core/$MODULE" + + //conda "${moduleDir}/environment.yml" input: tuple val(name), val(single_end), path(reads) + val (fastqc_args) output: - path "*.{zip,html}" + tuple val(name), val(single_end), path("*.html"), emit: html + tuple val(name), val(single_end), path("*.zip"), emit: zip + path "*.version.txt", emit: version script: // Add soft-links to original FastQs for consistent naming in pipeline if (single_end) { """ [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - fastqc --quiet --threads $task.cpus ${name}.fastq.gz + fastqc $fastqc_args --threads $task.cpus ${name}.fastq.gz + fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } else { """ [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - fastqc --quiet --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz + fastqc $fastqc_args --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz + fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } } From 6debaf137f5ac7bf9c6bd5e71194f7f920ff1b0c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 10:18:16 +0100 Subject: [PATCH 028/538] Store changes from last week --- main.nf | 121 ++++++++++++++++++++---------- modules/local/filter_bam.nf | 41 ++++------ modules/nf-core/fastqc.nf | 8 +- modules/nf-core/samtools_index.nf | 5 +- modules/nf-core/samtools_sort.nf | 27 +++++-- 5 files changed, 124 insertions(+), 78 deletions(-) diff --git a/main.nf b/main.nf index 6523fbe45..37fc7a6e3 100755 --- a/main.nf +++ b/main.nf @@ -150,33 +150,33 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" */ include { CHECK_SAMPLESHEET; get_samplesheet_paths; - get_samplesheet_design } from './modules/local/check_samplesheet' params(params) -include { GTF2BED } from './modules/local/gtf2bed' params(params) -include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' params(params) -include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' params(params) -include { FILTER_BAM } from './modules/local/filter_bam' params(params) -include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' params(params) -include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' params(params) + get_samplesheet_design } from './modules/local/check_samplesheet' +include { GTF2BED } from './modules/local/gtf2bed' +include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' +include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' +include { FILTER_BAM } from './modules/local/filter_bam' +include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' +include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' /* * Include nf-core modules */ -include { FASTQC } from './modules/nf-core/fastqc' params(params) -include { BWA_INDEX } from './modules/nf-core/bwa_index' params(params) -include { TRIMGALORE } from './modules/nf-core/trimgalore' params(params) -include { BWA_MEM } from './modules/nf-core/bwa_mem' params(params) -include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' params(params) -include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' params(params) -include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' params(params) -include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' params(params) -include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' params(params) -//include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' params(params) -include { MULTIQC } from './modules/nf-core/multiqc' params(params) +include { FASTQC } from './modules/nf-core/fastqc' addParams(fastqc_args : "--quiet") +include { BWA_INDEX } from './modules/nf-core/bwa_index' +include { TRIMGALORE } from './modules/nf-core/trimgalore' +include { BWA_MEM } from './modules/nf-core/bwa_mem' +include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' +include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' +include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' +include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' +include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' +//include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' +include { MULTIQC } from './modules/nf-core/multiqc' /* * Check input samplesheet and get read channels */ -workflow CHECK_INPUTS { +workflow CHECK_INPUT { take: ch_input // file: /path/to/samplesheet.csv @@ -202,19 +202,20 @@ workflow CHECK_INPUTS { /* * Read QC and trimming */ -workflow QC_TRIM_READS { +workflow QC_TRIM { take: ch_reads // channel: [ val(name), val(single_end), [ reads ] ] skip_fastqc // boolean: true/false skip_trimming // boolean: true/false - fastqc_args // string: valid arguments accepted by FastQC + //fastqc_args // string: valid arguments accepted by FastQC main: fastqc_html = Channel.empty() fastqc_zip = Channel.empty() fastqc_version = Channel.empty() if (!skip_fastqc) { - FASTQC(ch_reads, fastqc_args).html.set { fastqc_html } + //FASTQC(ch_reads, fastqc_args).html.set { fastqc_html } + FASTQC(ch_reads).html.set { fastqc_html } fastqc_zip = FASTQC.out.zip fastqc_version = FASTQC.out.version } @@ -259,7 +260,7 @@ workflow SORT_BAM { /* * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -workflow MAP_READS { +workflow ALIGN { take: ch_reads // channel: [ val(name), val(single_end), [ reads ] ] ch_index // channel: [ /path/to/index ] @@ -276,10 +277,57 @@ workflow MAP_READS { idxstats = SORT_BAM.out.idxstats } +/* + * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats + */ +workflow MARKDUP { + take: + ch_bam // channel: [ val(name), val(single_end), bam ] + + main: + PICARD_MARKDUPLICATES(ch_bam) + SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam) + SAMTOOLS_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out, by: [0,1])) + + emit: + bam = PICARD_MARKDUPLICATES.out.bam + metrics = PICARD_MARKDUPLICATES.out.metrics + bai = SAMTOOLS_INDEX.out + stats = SAMTOOLS_STATS.out.stats + flagstat = SAMTOOLS_STATS.out.flagstat + idxstats = SAMTOOLS_STATS.out.idxstats +} + +/* + * Filter BAM file + */ +workflow FILTER_BAM { + take: + ch_bam // channel: [ val(name), val(single_end), bam ] + ch_bai // channel: [ val(name), val(single_end), bai ] + ch_bed // channel: [ bed ] + config // file: BAMtools filter JSON config file + + main: + FILTER_BAM(ch_bam, + ch_bai, + ch_bed, + config) // Fix getting name sorted BAM here for PE/SE + SAMTOOLS_INDEX(FILTER_BAM.out.bam) + SAMTOOLS_STATS(FILTER_BAM.out.bam.join(SAMTOOLS_INDEX.out, by: [0,1])) + + emit: + bam = FILTER_BAM.out.bam + bai = SAMTOOLS_INDEX.out + stats = SAMTOOLS_STATS.out.stats + flagstat = SAMTOOLS_STATS.out.flagstat + idxstats = SAMTOOLS_STATS.out.idxstats +} + workflow { // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES - CHECK_INPUTS(ch_input) + CHECK_INPUT(ch_input) // PREPARE GENOME FILES if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } @@ -287,34 +335,31 @@ workflow { MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) // READ QC & TRIMMING - params.fastqc_args = "--quiet" - QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming, params.fastqc_args) + //params.fastqc_args = "--quiet" + //QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming, params.fastqc_args) + QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming) // MAP READS & BAM QC - MAP_READS(QC_TRIM_READS.out.reads, ch_index.collect()) + ALIGN(QC_TRIM.out.reads, ch_index.collect()) // MERGE RESEQUENCED BAM FILES - MAP_READS + ALIGN .out .bam .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } .groupTuple(by: [0, 1]) .map { it -> [ it[0], it[1], it[2].flatten() ] } .set { ch_sort_bam } - //PICARD_MERGESAMFILES(ch_sort_bam) - // PICARD_MARKDUPLICATES(PICARD_MERGESAMFILES.out).bam | SAMTOOLS_STATS_MARKDUPLICATES - // FILTER_BAM(PICARD_MARKDUPLICATES.out.bam, + PICARD_MERGESAMFILES(ch_sort_bam) | MARKDUP + + // FILTER BAM FILES + // FILTER_BAM(MARK_DUPS.out.bam, // MAKE_GENOME_FILTER.out.collect(), // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE - /* - * PIPELINE REPORTING - */ - OUTPUT_DOCUMENTATION( - ch_output_docs, - ch_output_docs_images) - + // PIPELINE TEMPLATE REPORTING GET_SOFTWARE_VERSIONS() + OUTPUT_DOCUMENTATION(ch_output_docs,ch_output_docs_images) // MULTIQC( // summary, diff --git a/modules/local/filter_bam.nf b/modules/local/filter_bam.nf index 17549eb32..22b14cd12 100644 --- a/modules/local/filter_bam.nf +++ b/modules/local/filter_bam.nf @@ -4,52 +4,41 @@ process FILTER_BAM { tag "$name" label 'process_medium' - publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, - saveAs: { filename -> - if (single_end || params.save_align_intermeds) { - if (filename.endsWith('.flagstat')) "samtools_stats/$filename" - else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" - else if (filename.endsWith('.stats')) "samtools_stats/$filename" - else if (filename.endsWith('.sorted.bam')) filename - else if (filename.endsWith('.sorted.bam.bai')) filename - else null - } - } + publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode + // saveAs: { filename -> + // if (single_end || params.save_align_intermeds) { + // else if (filename.endsWith('.sorted.bam')) filename + // else if (filename.endsWith('.sorted.bam.bai')) filename + // else null + // } + // } input: tuple val(name), val(single_end), path(bam) + tuple val(name), val(single_end), path(bai) path bed - path filter_config + path config output: tuple val(name), val(single_end), path('*.bam'), emit: bam - tuple val(name), val(single_end), path('*.bai'), emit: bai - tuple val(name), val(single_end), path('*.stats'), emit: stats - tuple val(name), val(single_end), path('*.flagstat'), emit: flagstat - tuple val(name), val(single_end), path('*.idxstats'), emit: idxstats - + script: prefix = single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" filter_params = single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' dup_params = params.keep_dups ? '' : '-F 0x0400' multimap_params = params.keep_multi_map ? '' : '-q 1' blacklist_params = params.blacklist ? "-L $bed" : '' - name_sort_bam = single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" + //name_sort_bam = single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" """ samtools view \\ $filter_params \\ $dup_params \\ $multimap_params \\ $blacklist_params \\ - -b ${bam[0]} \\ + -b $bam \\ | bamtools filter \\ -out ${prefix}.sorted.bam \\ - -script $filter_config - samtools index ${prefix}.sorted.bam - samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat - samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats - samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats - - $name_sort_bam + -script $config """ } +//$name_sort_bam diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf index 5ba3e503a..8aa52929f 100755 --- a/modules/nf-core/fastqc.nf +++ b/modules/nf-core/fastqc.nf @@ -1,8 +1,10 @@ def MODULE = "fastqc" params.publish_dir = MODULE params.publish_results = "default" +//params.fastqc_args = '' process FASTQC { + tag "$name" publishDir "${params.outdir}/${params.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> @@ -15,7 +17,7 @@ process FASTQC { input: tuple val(name), val(single_end), path(reads) - val (fastqc_args) + //val (fastqc_args) output: tuple val(name), val(single_end), path("*.html"), emit: html @@ -27,14 +29,14 @@ process FASTQC { if (single_end) { """ [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - fastqc $fastqc_args --threads $task.cpus ${name}.fastq.gz + fastqc $params.fastqc_args --threads $task.cpus ${name}.fastq.gz fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } else { """ [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - fastqc $fastqc_args --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz + fastqc $params.fastqc_args --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } diff --git a/modules/nf-core/samtools_index.nf b/modules/nf-core/samtools_index.nf index 007b0b978..a09bae039 100644 --- a/modules/nf-core/samtools_index.nf +++ b/modules/nf-core/samtools_index.nf @@ -5,7 +5,7 @@ process SAMTOOLS_INDEX { tag "$name" label 'process_medium' publishDir path: "${params.outdir}", mode: params.publish_dir_mode - + input: tuple val(name), val(single_end), path(bam) @@ -13,8 +13,7 @@ process SAMTOOLS_INDEX { tuple val(name), val(single_end), path('*.bai') script: - prefix = "${name}.Lb" """ - samtools index ${prefix}.sorted.bam + samtools index $bam """ } diff --git a/modules/nf-core/samtools_sort.nf b/modules/nf-core/samtools_sort.nf index 2192ec88f..e61390762 100644 --- a/modules/nf-core/samtools_sort.nf +++ b/modules/nf-core/samtools_sort.nf @@ -1,20 +1,31 @@ -/* - * Sort BAM file - */ +def MODULE = "samtools_sort" +params.publish_dir = MODULE +params.publish_results = "default" +params.suffix = '' +//params.samtools_sort_args = '' + process SAMTOOLS_SORT { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}", mode: params.publish_dir_mode + publishDir "${params.outdir}/${params.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (params.publish_results == "none") null + else filename } + + container "docker.pkg.github.com/nf-core/$MODULE" + conda "${moduleDir}/environment.yml" input: tuple val(name), val(single_end), path(bam) - + //val (samtools_sort_args) + output: tuple val(name), val(single_end), path('*.bam') + path "*.version.txt", emit: version script: - prefix = "${name}.Lb" + prefix = "${name}.${suffix}" """ samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam + samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt """ } From 28ad670ad2509436d28a2bb1cf465cbdf08e813e Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 13:31:32 +0100 Subject: [PATCH 029/538] Provide module options via map --- main.nf | 112 +++++++++++++++-------------- modules/local/check_samplesheet.nf | 25 ++++--- modules/nf-core/fastqc.nf | 34 +++++---- 3 files changed, 91 insertions(+), 80 deletions(-) diff --git a/main.nf b/main.nf index 37fc7a6e3..ba00e7c7a 100755 --- a/main.nf +++ b/main.nf @@ -191,7 +191,7 @@ workflow CHECK_INPUT { .out .controls .splitCsv(header:true, sep:',') - .map { get_samplesheet_design(it) } + .map { get_samplesheet_design(it, params.single_end) } .set { ch_design } emit: @@ -204,38 +204,38 @@ workflow CHECK_INPUT { */ workflow QC_TRIM { take: - ch_reads // channel: [ val(name), val(single_end), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - //fastqc_args // string: valid arguments accepted by FastQC + ch_reads // channel: [ val(metadata), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + fastqc_opts // map: options for FastQC module + trimgalore_opts // map: options for TrimGalore! module main: fastqc_html = Channel.empty() fastqc_zip = Channel.empty() fastqc_version = Channel.empty() if (!skip_fastqc) { - //FASTQC(ch_reads, fastqc_args).html.set { fastqc_html } - FASTQC(ch_reads).html.set { fastqc_html } + FASTQC(ch_reads, fastqc_opts).html.set { fastqc_html } fastqc_zip = FASTQC.out.zip fastqc_version = FASTQC.out.version } - ch_trim_reads = ch_reads - trim_log = Channel.empty() - trim_fastqc = Channel.empty() - if (!skip_trimming) { - TRIMGALORE(ch_reads).reads.set { ch_trim_reads } - trim_log = TRIMGALORE.out.log - trim_fastqc = TRIMGALORE.out.fastqc - } + // ch_trim_reads = ch_reads + // trim_log = Channel.empty() + // trim_fastqc = Channel.empty() + // if (!skip_trimming) { + // TRIMGALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } + // trim_log = TRIMGALORE.out.log + // trim_fastqc = TRIMGALORE.out.fastqc + // } emit: fastqc_html = fastqc_html fastqc_zip = fastqc_zip fastqc_version = fastqc_version - reads = ch_trim_reads - trim_log = trim_log - trim_fastqc = trim_fastqc + // reads = ch_trim_reads + // trim_log = trim_log + // trim_fastqc = trim_fastqc } /* @@ -329,43 +329,47 @@ workflow { // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES CHECK_INPUT(ch_input) - // PREPARE GENOME FILES - if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } - if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } - MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) - + // // PREPARE GENOME FILES + // if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } + // if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } + // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) + // // READ QC & TRIMMING - //params.fastqc_args = "--quiet" - //QC_TRIM_READS(CHECK_INPUTS.out.reads, params.skip_fastqc, params.skip_trimming, params.fastqc_args) - QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming) - - // MAP READS & BAM QC - ALIGN(QC_TRIM.out.reads, ch_index.collect()) - - // MERGE RESEQUENCED BAM FILES - ALIGN - .out - .bam - .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } - .groupTuple(by: [0, 1]) - .map { it -> [ it[0], it[1], it[2].flatten() ] } - .set { ch_sort_bam } - PICARD_MERGESAMFILES(ch_sort_bam) | MARKDUP - - // FILTER BAM FILES - // FILTER_BAM(MARK_DUPS.out.bam, - // MAKE_GENOME_FILTER.out.collect(), - // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE - - // PIPELINE TEMPLATE REPORTING - GET_SOFTWARE_VERSIONS() - OUTPUT_DOCUMENTATION(ch_output_docs,ch_output_docs_images) - - // MULTIQC( - // summary, - // FASTQC.out, - // ch_multiqc_config - // ) + def fastqc_opts = [:] + fastqc_opts.args = "--quiet" + fastqc_opts.suffix = "test" + fastqc_opts.publish_dir = "fastqc_test" + fastqc_opts.publish_results = "all" + def trimgalore_opts = [:] + QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, fastqc_opts, trimgalore_opts) + // + // // MAP READS & BAM QC + // ALIGN(QC_TRIM.out.reads, ch_index.collect()) + // + // // MERGE RESEQUENCED BAM FILES + // ALIGN + // .out + // .bam + // .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } + // .groupTuple(by: [0, 1]) + // .map { it -> [ it[0], it[1], it[2].flatten() ] } + // .set { ch_sort_bam } + // PICARD_MERGESAMFILES(ch_sort_bam) | MARKDUP + // + // // FILTER BAM FILES + // // FILTER_BAM(MARK_DUPS.out.bam, + // // MAKE_GENOME_FILTER.out.collect(), + // // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE + // + // // PIPELINE TEMPLATE REPORTING + // GET_SOFTWARE_VERSIONS() + // OUTPUT_DOCUMENTATION(ch_output_docs,ch_output_docs_images) + // + // // MULTIQC( + // // summary, + // // FASTQC.out, + // // ch_multiqc_config + // // ) } /* diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf index a8c011a8c..97ceae3bb 100755 --- a/modules/local/check_samplesheet.nf +++ b/modules/local/check_samplesheet.nf @@ -18,22 +18,31 @@ process CHECK_SAMPLESHEET { """ } -// Function to get list of [ sample, single_end?, [ fastq_1, fastq_2 ] ] +// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] def get_samplesheet_paths(LinkedHashMap row, boolean single_end) { - def sample = row.sample_id - def fastq_1 = row.fastq_1 - def fastq_2 = row.fastq_2 + def meta = [:] + meta.id = row.sample_id + meta.single_end = single_end def array = [] if (single_end) { - array = [ sample, single_end, [ file(fastq_1, checkIfExists: true) ] ] + array = [ meta, [ file(row.fastq_1, checkIfExists: true) ] ] } else { - array = [ sample, single_end, [ file(fastq_1, checkIfExists: true), file(fastq_2, checkIfExists: true) ] ] + array = [ meta, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] } return array } // Function to get list of [sample, control, antibody, replicatesExist?, multipleGroups?] -def get_samplesheet_design(LinkedHashMap row) { - return [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] +def get_samplesheet_design(LinkedHashMap row, boolean single_end) { + def meta = [:] + meta.id = row.sample_id + meta.single_end = single_end + meta.antibody = row.antibody + meta.control_id = row.control_id + meta.reps_exist = row.replicatesExist.toBoolean() + meta.groups_exist = row.multipleGroups.toBoolean() + + //return [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] + return meta } diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf index 8aa52929f..8d293adbe 100755 --- a/modules/nf-core/fastqc.nf +++ b/modules/nf-core/fastqc.nf @@ -1,42 +1,40 @@ def MODULE = "fastqc" -params.publish_dir = MODULE -params.publish_results = "default" -//params.fastqc_args = '' process FASTQC { - tag "$name" - publishDir "${params.outdir}/${params.publish_dir}", + tag "$meta.id" + publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (params.publish_results == "none") null + if (opts.publish_results == "none") null else filename } - //container "docker.pkg.github.com/nf-core/$MODULE" + container = "quay.io/biocontainers/fastqc:0.11.9--0" - //conda "${moduleDir}/environment.yml" + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(reads) - //val (fastqc_args) + tuple val(meta), path(reads) + val opts output: - tuple val(name), val(single_end), path("*.html"), emit: html - tuple val(name), val(single_end), path("*.zip"), emit: zip + tuple val(meta), path("*.html"), emit: html + tuple val(meta), path("*.zip"), emit: zip path "*.version.txt", emit: version script: // Add soft-links to original FastQs for consistent naming in pipeline - if (single_end) { + prefix = opts.suffix ? "${meta.id}.${opts.suffix}" : "${meta.id}" + if (meta.single_end) { """ - [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - fastqc $params.fastqc_args --threads $task.cpus ${name}.fastq.gz + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + fastqc $opts.args --threads $task.cpus ${prefix}.fastq.gz fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } else { """ - [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz - [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - fastqc $params.fastqc_args --threads $task.cpus ${name}_1.fastq.gz ${name}_2.fastq.gz + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + fastqc $opts.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt """ } From 61a18faff01259c19d3b5fa06923d8cd34134661 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 14:17:23 +0100 Subject: [PATCH 030/538] Put module settings in a central config --- conf/modules.config | 15 +++++++++++++++ main.nf | 7 +------ nextflow.config | 3 +++ 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 conf/modules.config diff --git a/conf/modules.config b/conf/modules.config new file mode 100644 index 000000000..5938f6a41 --- /dev/null +++ b/conf/modules.config @@ -0,0 +1,15 @@ +/* + * ------------------------------------------------- + * Nextflow config file for module specific-options + * ------------------------------------------------- + */ +params { + modules { + 'fastqc' { + args = "--quiet" + suffix = "" + publish_dir = "fastqc" + publish_results = "all" + } + } +} diff --git a/main.nf b/main.nf index ba00e7c7a..fd8d285b3 100755 --- a/main.nf +++ b/main.nf @@ -335,13 +335,8 @@ workflow { // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) // // READ QC & TRIMMING - def fastqc_opts = [:] - fastqc_opts.args = "--quiet" - fastqc_opts.suffix = "test" - fastqc_opts.publish_dir = "fastqc_test" - fastqc_opts.publish_results = "all" def trimgalore_opts = [:] - QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, fastqc_opts, trimgalore_opts) + QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], trimgalore_opts) // // // MAP READS & BAM QC // ALIGN(QC_TRIM.out.reads, ch_index.collect()) diff --git a/nextflow.config b/nextflow.config index 23d6bc75c..7ff44b819 100644 --- a/nextflow.config +++ b/nextflow.config @@ -101,6 +101,9 @@ process.container = 'nfcore/chipseq:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' +// Load modules.config by default for all pipelines +includeConfig 'conf/modules.config' + // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" From 73dc5a635bc35707006b31137da08df2f286d550 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 18:28:32 +0100 Subject: [PATCH 031/538] Add in TrimGalore --- conf/modules.config | 6 +++ main.nf | 45 ++++++++++++-------- modules/nf-core/fastqc.nf | 4 +- modules/nf-core/trim_galore.nf | 78 ++++++++++++++++++++++++++++++++++ modules/nf-core/trimgalore.nf | 54 ----------------------- 5 files changed, 114 insertions(+), 73 deletions(-) create mode 100644 modules/nf-core/trim_galore.nf delete mode 100644 modules/nf-core/trimgalore.nf diff --git a/conf/modules.config b/conf/modules.config index 5938f6a41..3846281ce 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -11,5 +11,11 @@ params { publish_dir = "fastqc" publish_results = "all" } + 'trim_galore' { + args = "--fastqc" + suffix = "" + publish_dir = "trim_galore" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index fd8d285b3..41e134a5e 100755 --- a/main.nf +++ b/main.nf @@ -161,9 +161,9 @@ include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' /* * Include nf-core modules */ -include { FASTQC } from './modules/nf-core/fastqc' addParams(fastqc_args : "--quiet") +include { FASTQC } from './modules/nf-core/fastqc' +include { TRIM_GALORE } from './modules/nf-core/trim_galore' include { BWA_INDEX } from './modules/nf-core/bwa_index' -include { TRIMGALORE } from './modules/nf-core/trimgalore' include { BWA_MEM } from './modules/nf-core/bwa_mem' include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' @@ -220,22 +220,29 @@ workflow QC_TRIM { fastqc_version = FASTQC.out.version } - // ch_trim_reads = ch_reads - // trim_log = Channel.empty() - // trim_fastqc = Channel.empty() - // if (!skip_trimming) { - // TRIMGALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } - // trim_log = TRIMGALORE.out.log - // trim_fastqc = TRIMGALORE.out.fastqc - // } + ch_trim_reads = ch_reads + trim_html = Channel.empty() + trim_zip = Channel.empty() + trim_log = Channel.empty() + trim_version = Channel.empty() + if (!skip_trimming) { + TRIM_GALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } + trim_html = TRIM_GALORE.out.html + trim_zip = TRIM_GALORE.out.zip + trim_log = TRIM_GALORE.out.log + trim_version = TRIM_GALORE.out.version + } emit: - fastqc_html = fastqc_html - fastqc_zip = fastqc_zip - fastqc_version = fastqc_version - // reads = ch_trim_reads - // trim_log = trim_log - // trim_fastqc = trim_fastqc + fastqc_html + fastqc_zip + fastqc_version + + reads = ch_trim_reads + trim_html + trim_zip + trim_log + trim_version } /* @@ -335,8 +342,10 @@ workflow { // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) // // READ QC & TRIMMING - def trimgalore_opts = [:] - QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], trimgalore_opts) + nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' + params.modules['trim_galore'].args += nextseq + QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], params.modules['trim_galore']) + // // // MAP READS & BAM QC // ALIGN(QC_TRIM.out.reads, ch_index.collect()) diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf index 8d293adbe..46b5cff9e 100755 --- a/modules/nf-core/fastqc.nf +++ b/modules/nf-core/fastqc.nf @@ -2,13 +2,15 @@ def MODULE = "fastqc" process FASTQC { tag "$meta.id" + label 'process_medium' publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> if (opts.publish_results == "none") null else filename } - container = "quay.io/biocontainers/fastqc:0.11.9--0" + container "quay.io/biocontainers/fastqc:0.11.9--0" + //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" conda (params.conda ? "${moduleDir}/environment.yml" : null) diff --git a/modules/nf-core/trim_galore.nf b/modules/nf-core/trim_galore.nf new file mode 100644 index 000000000..f8adc913c --- /dev/null +++ b/modules/nf-core/trim_galore.nf @@ -0,0 +1,78 @@ +def MODULE = "trim_galore" + +process TRIM_GALORE { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + container "quay.io/biocontainers/trim-galore:0.6.5--0" + //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(reads) + val opts + + output: + tuple val(meta), path("*.fq.gz"), emit: reads + tuple val(meta), path("*.html"), emit: html optional true + tuple val(meta), path("*.zip"), emit: zip optional true + tuple val(meta), path("*.txt"), emit: log + path "*.version.txt", emit: version + + script: + // Calculate number of --cores for TrimGalore based on value of task.cpus + // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 + // See: https://github.com/nf-core/atacseq/pull/65 + def cores = 1 + if (task.cpus) { + cores = (task.cpus as int) - 4 + if (meta.single_end) cores = (task.cpus as int) - 3 + if (cores < 1) cores = 1 + if (cores > 4) cores = 4 + } + + // Clipping presets have to be evaluated in the context of SE/PE + c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' + c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' + tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' + tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' + + // Added soft-links to original fastqs for consistent naming in MultiQC + prefix = opts.suffix ? "${meta.id}.${opts.suffix}" : "${meta.id}" + if (meta.single_end) { + """ + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + trim_galore \\ + $opts.args \\ + --cores $cores \\ + --gzip \\ + $c_r1 \\ + $tpc_r1 \\ + ${prefix}.fastq.gz + trim_galore --version > trim_galore.version.txt + """ + } else { + """ + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + trim_galore \\ + $opts.args \\ + --cores $cores \\ + --paired \\ + --gzip \\ + $c_r1 \\ + $c_r2 \\ + $tpc_r1 \\ + $tpc_r2 \\ + ${prefix}_1.fastq.gz \\ + ${prefix}_2.fastq.gz + trim_galore --version > trim_galore.version.txt + """ + } +} diff --git a/modules/nf-core/trimgalore.nf b/modules/nf-core/trimgalore.nf deleted file mode 100644 index 08cb5c0df..000000000 --- a/modules/nf-core/trimgalore.nf +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Trim Galore! - */ -process TRIMGALORE { - tag "$name" - label 'process_high' - publishDir "${params.outdir}/trim_galore", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.endsWith('.html')) "fastqc/$filename" - else if (filename.endsWith('.zip')) "fastqc/zips/$filename" - else if (filename.endsWith('trimming_report.txt')) "logs/$filename" - else params.save_trimmed ? filename : null - } - - input: - tuple val(name), val(single_end), path(reads) - - output: - tuple val(name), val(single_end), path('*.fq.gz'), emit: reads - path '*.txt', emit: log - path '*.{zip,html}', emit: fastqc - - script: - // Calculate number of --cores for TrimGalore based on value of task.cpus - // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 - // See: https://github.com/nf-core/atacseq/pull/65 - def cores = 1 - if (task.cpus) { - cores = (task.cpus as int) - 4 - if (single_end) cores = (task.cpus as int) - 3 - if (cores < 1) cores = 1 - if (cores > 4) cores = 4 - } - - c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' - c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' - tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' - tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' - nextseq = params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' - - // Added soft-links to original fastqs for consistent naming in MultiQC - if (single_end) { - """ - [ ! -f ${name}.fastq.gz ] && ln -s $reads ${name}.fastq.gz - trim_galore --cores $cores --fastqc --gzip $c_r1 $tpc_r1 $nextseq ${name}.fastq.gz - """ - } else { - """ - [ ! -f ${name}_1.fastq.gz ] && ln -s ${reads[0]} ${name}_1.fastq.gz - [ ! -f ${name}_2.fastq.gz ] && ln -s ${reads[1]} ${name}_2.fastq.gz - trim_galore --cores $cores --paired --fastqc --gzip $c_r1 $c_r2 $tpc_r1 $tpc_r2 $nextseq ${name}_1.fastq.gz ${name}_2.fastq.gz - """ - } -} From 208f0f2092580491fb6e0dcd96603722ed32bc36 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 18:35:35 +0100 Subject: [PATCH 032/538] Add in file annotation --- main.nf | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/main.nf b/main.nf index 41e134a5e..e2ba7bd51 100755 --- a/main.nf +++ b/main.nf @@ -204,7 +204,7 @@ workflow CHECK_INPUT { */ workflow QC_TRIM { take: - ch_reads // channel: [ val(metadata), [ reads ] ] + ch_reads // channel: [ val(meta), [ reads ] ] skip_fastqc // boolean: true/false skip_trimming // boolean: true/false fastqc_opts // map: options for FastQC module @@ -234,15 +234,15 @@ workflow QC_TRIM { } emit: - fastqc_html - fastqc_zip - fastqc_version + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] + fastqc_version // path: *.version.txt - reads = ch_trim_reads - trim_html - trim_zip - trim_log - trim_version + reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] + trim_version // path: *.version.txt } /* @@ -337,16 +337,14 @@ workflow { CHECK_INPUT(ch_input) // // PREPARE GENOME FILES - // if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } + //if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } // if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) - // + // READ QC & TRIMMING nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' params.modules['trim_galore'].args += nextseq QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], params.modules['trim_galore']) - - // // // MAP READS & BAM QC // ALIGN(QC_TRIM.out.reads, ch_index.collect()) // From b66ffb56bd22525c26d6170ae4a785dc9019a05c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 20 Jul 2020 18:55:15 +0100 Subject: [PATCH 033/538] Add in bwa index --- conf/modules.config | 6 ++++++ main.nf | 2 +- modules/nf-core/bwa_index.nf | 25 +++++++++++++++++-------- modules/nf-core/fastqc.nf | 3 +-- modules/nf-core/trim_galore.nf | 3 +-- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3846281ce..78e9de36f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,5 +17,11 @@ params { publish_dir = "trim_galore" publish_results = "all" } + 'bwa_index' { + args = "" + suffix = "" + publish_dir = "genome/bwa_index" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index e2ba7bd51..0a1081441 100755 --- a/main.nf +++ b/main.nf @@ -337,7 +337,7 @@ workflow { CHECK_INPUT(ch_input) // // PREPARE GENOME FILES - //if (!params.bwa_index) { BWA_INDEX(ch_fasta).set { ch_index } } + if (!params.bwa_index) { BWA_INDEX(ch_fasta, params.modules['bwa_index']).set { ch_index } } // if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) diff --git a/modules/nf-core/bwa_index.nf b/modules/nf-core/bwa_index.nf index 8f6e5f52e..ba8ecafe7 100644 --- a/modules/nf-core/bwa_index.nf +++ b/modules/nf-core/bwa_index.nf @@ -1,21 +1,30 @@ -/* - * Build BWA index - */ process BWA_INDEX { tag "$fasta" - //label 'process_high' - // publishDir path: { params.save_reference ? "${params.outdir}/genome" : params.outdir }, - // saveAs: { params.save_reference ? it : null }, mode: params.publish_dir_mode + label 'process_high' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "biocontainers/bwa:v0.7.17_cv1" + //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: path fasta + val opts output: - path 'BWAIndex' + path 'BWAIndex', emit: index + path "*.version.txt", emit: version script: """ - bwa index -a bwtsw $fasta + bwa index $opts.args -a bwtsw $fasta mkdir BWAIndex && mv ${fasta}* BWAIndex + echo \$(bwa 2>&1) | sed -n "s/.*\\(v.*\$\\)/\\1/p" > bwa.version.txt """ } diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/fastqc.nf index 46b5cff9e..7c8967e7f 100755 --- a/modules/nf-core/fastqc.nf +++ b/modules/nf-core/fastqc.nf @@ -1,5 +1,3 @@ -def MODULE = "fastqc" - process FASTQC { tag "$meta.id" label 'process_medium' @@ -7,6 +5,7 @@ process FASTQC { mode: params.publish_dir_mode, saveAs: { filename -> if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null else filename } container "quay.io/biocontainers/fastqc:0.11.9--0" diff --git a/modules/nf-core/trim_galore.nf b/modules/nf-core/trim_galore.nf index f8adc913c..4532d50bf 100644 --- a/modules/nf-core/trim_galore.nf +++ b/modules/nf-core/trim_galore.nf @@ -1,5 +1,3 @@ -def MODULE = "trim_galore" - process TRIM_GALORE { tag "$meta.id" label 'process_high' @@ -7,6 +5,7 @@ process TRIM_GALORE { mode: params.publish_dir_mode, saveAs: { filename -> if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null else filename } container "quay.io/biocontainers/trim-galore:0.6.5--0" From 99f53f4a2b067ada3a46bf447a27f23f173e7a9f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 21 Jul 2020 09:54:33 +0100 Subject: [PATCH 034/538] Add gtf2bed --- bin/gtf2bed | 6 +++--- conf/modules.config | 6 ++++++ main.nf | 8 ++++---- modules/local/gtf2bed.nf | 17 ++++++++++++----- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/bin/gtf2bed b/bin/gtf2bed index c2a8bbeee..e6904926d 100755 --- a/bin/gtf2bed +++ b/bin/gtf2bed @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # Copyright (c) 2011 Erik Aronesty (erik@q32.com) # @@ -87,7 +87,7 @@ for $id ( my $beg = $ex[0][3]; my $end = $ex[-1][4]; - + if ($dir eq '-') { # swap $tmp=$cds; @@ -103,7 +103,7 @@ for $id ( # adjust start for bed --$beg; --$cds; - + my $exn = @ex; # exon count my $exst = join ",", map {$_->[3]-$beg-1} @ex; # exon start my $exsz = join ",", map {$_->[4]-$_->[3]+1} @ex; # exon size diff --git a/conf/modules.config b/conf/modules.config index 78e9de36f..1bb57c53b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -23,5 +23,11 @@ params { publish_dir = "genome/bwa_index" publish_results = "all" } + 'gtf2bed' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index 0a1081441..3b2eb889a 100755 --- a/main.nf +++ b/main.nf @@ -82,12 +82,12 @@ if (params.anno_readme && file(params.anno_readme).exists()) { // If --gtf is supplied along with --genome // Make gene bed from supplied --gtf instead of using iGenomes one automatically -def MakeBED = false +def makeBED = false if (!params.gene_bed) { - MakeBED = true + makeBED = true } else if (params.genome && params.gtf) { if (params.genomes[ params.genome ].gtf != params.gtf) { - MakeBED = true + makeBED = true } } @@ -338,7 +338,7 @@ workflow { // // PREPARE GENOME FILES if (!params.bwa_index) { BWA_INDEX(ch_fasta, params.modules['bwa_index']).set { ch_index } } - // if (MakeBED) { GTF2BED(ch_gtf).set { ch_gene_bed } } + if (makeBED) { GTF2BED(ch_gtf, params.modules['gtf2bed']).set { ch_gene_bed } } // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) // READ QC & TRIMMING diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index 304eb6b03..5a2426870 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -1,13 +1,20 @@ -/* - * Convert GTF to BED file - */ process GTF2BED { tag "$gtf" - //label 'process_low' - publishDir "${params.outdir}/genome", mode: params.publish_dir_mode + label 'process_low' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + container "quay.io/biocontainers/perl:5.26.2" + //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" + + //conda (params.conda ? "${moduleDir}/environment.yml" : null) input: path gtf + val opts output: path '*.bed' From 025375d4755566b09de587921b01188d0f403dcb Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 21 Jul 2020 10:21:00 +0100 Subject: [PATCH 035/538] Add genome filter processes --- conf/modules.config | 12 +++++++++ main.nf | 4 ++- modules/local/get_chrom_sizes.nf | 38 ++++++++++++++++++----------- modules/local/gtf2bed.nf | 3 +++ modules/local/make_genome_filter.nf | 15 +++++++++--- 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1bb57c53b..e57bbf946 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -29,5 +29,17 @@ params { publish_dir = "genome" publish_results = "all" } + 'make_genome_filter' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } + 'get_chrom_sizes' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index 3b2eb889a..1c91e7cf2 100755 --- a/main.nf +++ b/main.nf @@ -339,7 +339,9 @@ workflow { // // PREPARE GENOME FILES if (!params.bwa_index) { BWA_INDEX(ch_fasta, params.modules['bwa_index']).set { ch_index } } if (makeBED) { GTF2BED(ch_gtf, params.modules['gtf2bed']).set { ch_gene_bed } } - // MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta).sizes, ch_blacklist.ifEmpty([])) + MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta, params.modules['get_chrom_sizes']).sizes, + ch_blacklist.ifEmpty([]), + params.modules['make_genome_filter']) // READ QC & TRIMMING nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 9c9a35f86..79f6fa533 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,20 +1,30 @@ /* * Get chromosome sizes from a fasta file */ - process GET_CHROM_SIZES { - tag "$fasta" - publishDir "${params.outdir}/genome", mode: params.publish_dir_mode +process GET_CHROM_SIZES { + tag "$fasta" + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } - input: - path fasta + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - output: - path '*.sizes', emit: sizes - path '*.fai', emit: fai + //conda (params.conda ? "${moduleDir}/environment.yml" : null) - script: - """ - samtools faidx $fasta - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - """ - } + input: + path fasta + val opts + + output: + path '*.sizes', emit: sizes + path '*.fai', emit: fai + + script: + """ + samtools faidx $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + """ +} diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index 5a2426870..44ee3b098 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -1,3 +1,6 @@ +/* + * Convert GTF file to BED format + */ process GTF2BED { tag "$gtf" label 'process_low' diff --git a/modules/local/make_genome_filter.nf b/modules/local/make_genome_filter.nf index 5e91d61ce..8b2943c75 100644 --- a/modules/local/make_genome_filter.nf +++ b/modules/local/make_genome_filter.nf @@ -1,14 +1,23 @@ /* - * Prepare genome intervals for filtering - * by removing regions in blacklist file + * Prepare genome intervals for filtering by removing regions in blacklist file */ process MAKE_GENOME_FILTER { tag "$sizes" - publishDir "${params.outdir}/genome", mode: params.publish_dir_mode + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + //conda (params.conda ? "${moduleDir}/environment.yml" : null) input: path sizes path blacklist + val opts output: path '*.bed' From f727441a425b9866b1418260eea1486ed29bb1ad Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 21 Jul 2020 12:09:22 +0100 Subject: [PATCH 036/538] Refactor mapping with bash expanded indices --- conf/modules.config | 9 +++- main.nf | 70 +++++++++++++++--------------- modules/local/check_samplesheet.nf | 8 +++- modules/nf-core/bwa_index.nf | 5 +-- modules/nf-core/bwa_mem.nf | 41 +++++++++-------- modules/nf-core/trim_galore.nf | 2 +- nextflow.config | 2 +- 7 files changed, 79 insertions(+), 58 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e57bbf946..6262587ac 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,7 +18,7 @@ params { publish_results = "all" } 'bwa_index' { - args = "" + args = "-a bwtsw" suffix = "" publish_dir = "genome/bwa_index" publish_results = "all" @@ -41,5 +41,12 @@ params { publish_dir = "genome" publish_results = "all" } + 'bwa_mem' { + args = "-M" + args2 = "-h -F 0x0100 -O BAM" + suffix = ".Lb" + publish_dir = "bwa" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index 1c91e7cf2..8b2293a7b 100755 --- a/main.nf +++ b/main.nf @@ -58,22 +58,11 @@ if (params.gene_bed) { ch_gene_bed = file(params.gene_bed, checkIfExists: true) if (params.blacklist) { ch_blacklist = Channel.fromPath(params.blacklist, checkIfExists: true) } else { ch_blacklist = Channel.empty() } if (params.fasta) { - lastPath = params.fasta.lastIndexOf(File.separator) - params.bwa_base = params.fasta.substring(lastPath+1) ch_fasta = file(params.fasta, checkIfExists: true) } else { exit 1, 'Fasta file not specified!' } -if (params.bwa_index) { - lastPath = params.bwa_index.lastIndexOf(File.separator) - bwa_dir = params.bwa_index.substring(0,lastPath+1) - params.bwa_base = params.bwa_index.substring(lastPath+1) - Channel - .fromPath(bwa_dir, checkIfExists: true) - .set { ch_index } -} - // Save AWS IGenomes file containing annotation version if (params.anno_readme && file(params.anno_readme).exists()) { file("${params.outdir}/genome/").mkdirs() @@ -178,13 +167,14 @@ include { MULTIQC } from './modules/nf-core/multiqc' */ workflow CHECK_INPUT { take: - ch_input // file: /path/to/samplesheet.csv + ch_input // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group main: CHECK_SAMPLESHEET(ch_input) .reads .splitCsv(header:true, sep:',') - .map { get_samplesheet_paths(it, params.single_end) } + .map { get_samplesheet_paths(it, params.single_end, seq_center) } .set { ch_reads } CHECK_SAMPLESHEET @@ -204,11 +194,11 @@ workflow CHECK_INPUT { */ workflow QC_TRIM { take: - ch_reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - fastqc_opts // map: options for FastQC module - trimgalore_opts // map: options for TrimGalore! module + ch_reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + fastqc_opts // map: options for FastQC module + trim_galore_opts // map: options for TrimGalore! module main: fastqc_html = Channel.empty() @@ -226,7 +216,7 @@ workflow QC_TRIM { trim_log = Channel.empty() trim_version = Channel.empty() if (!skip_trimming) { - TRIM_GALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } + TRIM_GALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } trim_html = TRIM_GALORE.out.html trim_zip = TRIM_GALORE.out.zip trim_log = TRIM_GALORE.out.log @@ -269,19 +259,23 @@ workflow SORT_BAM { */ workflow ALIGN { take: - ch_reads // channel: [ val(name), val(single_end), [ reads ] ] - ch_index // channel: [ /path/to/index ] + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_opts // map: options for BWA MEM module main: - BWA_MEM(ch_reads, ch_index.collect()) - SORT_BAM(BWA_MEM.out) + BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) + //SORT_BAM(BWA_MEM.out) emit: - bam = SORT_BAM.out.bam - bai = SORT_BAM.out.bai - stats = SORT_BAM.out.stats - flagstat = SORT_BAM.out.flagstat - idxstats = SORT_BAM.out.idxstats + bam = BWA_MEM.out.bam + // bam = SORT_BAM.out.bam + // bai = SORT_BAM.out.bai + // stats = SORT_BAM.out.stats + // flagstat = SORT_BAM.out.flagstat + // idxstats = SORT_BAM.out.idxstats + bwa_version = BWA_MEM.out.version } /* @@ -334,10 +328,10 @@ workflow FILTER_BAM { workflow { // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES - CHECK_INPUT(ch_input) + CHECK_INPUT(ch_input, params.seq_center) - // // PREPARE GENOME FILES - if (!params.bwa_index) { BWA_INDEX(ch_fasta, params.modules['bwa_index']).set { ch_index } } + // PREPARE GENOME FILES + ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX(ch_fasta, params.modules['bwa_index']).index if (makeBED) { GTF2BED(ch_gtf, params.modules['gtf2bed']).set { ch_gene_bed } } MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta, params.modules['get_chrom_sizes']).sizes, ch_blacklist.ifEmpty([]), @@ -346,9 +340,17 @@ workflow { // READ QC & TRIMMING nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' params.modules['trim_galore'].args += nextseq - QC_TRIM(CHECK_INPUT.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], params.modules['trim_galore']) - // // MAP READS & BAM QC - // ALIGN(QC_TRIM.out.reads, ch_index.collect()) + QC_TRIM(CHECK_INPUT.out.reads, + params.skip_fastqc, + params.skip_trimming, + params.modules['fastqc'], + params.modules['trim_galore']) + + // MAP READS & BAM QC + score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + params.modules['bwa_mem'].args += score + ALIGN(QC_TRIM.out.reads, ch_index, ch_fasta, params.modules['bwa_mem']) + // // // MERGE RESEQUENCED BAM FILES // ALIGN diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf index 97ceae3bb..24b08c2d8 100755 --- a/modules/local/check_samplesheet.nf +++ b/modules/local/check_samplesheet.nf @@ -19,11 +19,17 @@ process CHECK_SAMPLESHEET { } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def get_samplesheet_paths(LinkedHashMap row, boolean single_end) { +def get_samplesheet_paths(LinkedHashMap row, boolean single_end, String seq_center) { def meta = [:] meta.id = row.sample_id meta.single_end = single_end + def rg = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" + if (seq_center) { + rg = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\\tCN:${seq_center}\'" + } + meta.read_group = rg + def array = [] if (single_end) { array = [ meta, [ file(row.fastq_1, checkIfExists: true) ] ] diff --git a/modules/nf-core/bwa_index.nf b/modules/nf-core/bwa_index.nf index ba8ecafe7..545748120 100644 --- a/modules/nf-core/bwa_index.nf +++ b/modules/nf-core/bwa_index.nf @@ -18,13 +18,12 @@ process BWA_INDEX { val opts output: - path 'BWAIndex', emit: index + path "${fasta}.*", emit: index path "*.version.txt", emit: version script: """ - bwa index $opts.args -a bwtsw $fasta - mkdir BWAIndex && mv ${fasta}* BWAIndex + bwa index $opts.args $fasta echo \$(bwa 2>&1) | sed -n "s/.*\\(v.*\$\\)/\\1/p" > bwa.version.txt """ } diff --git a/modules/nf-core/bwa_mem.nf b/modules/nf-core/bwa_mem.nf index a0c72a81d..cc751edd9 100644 --- a/modules/nf-core/bwa_mem.nf +++ b/modules/nf-core/bwa_mem.nf @@ -1,32 +1,39 @@ -/* - * Map read(s) with bwa mem - */ process BWA_MEM { - tag "$name" + tag "$meta.id" label 'process_high' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(reads) + tuple val(meta), path(reads) path index + path fasta + val opts output: - tuple val(name), val(single_end), path('*.bam') + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version script: - prefix = "${name}.Lb" - rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\'" - if (params.seq_center) { - rg = "\'@RG\\tID:${name}\\tSM:${name.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${name}\\tPU:1\\tCN:${params.seq_center}\'" - } - score = params.bwa_min_score ? "-T ${params.bwa_min_score}" : '' + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + rg = meta.read_group ? "-R ${meta.read_group}" : "" """ bwa mem \\ + $opts.args \\ + $rg \\ -t $task.cpus \\ - -M \\ - -R $rg \\ - $score \\ - ${index}/${params.bwa_base} \\ + $fasta \\ $reads \\ - | samtools view -@ $task.cpus -b -h -F 0x0100 -O BAM -o ${prefix}.bam - + | samtools view $opts.args2 -@ $task.cpus -bS -o ${prefix}.bam - + echo \$(bwa 2>&1) | sed -n "s/.*\\(v.*\$\\)/\\1/p" > bwa.version.txt """ } diff --git a/modules/nf-core/trim_galore.nf b/modules/nf-core/trim_galore.nf index 4532d50bf..a0fd544f7 100644 --- a/modules/nf-core/trim_galore.nf +++ b/modules/nf-core/trim_galore.nf @@ -43,7 +43,7 @@ process TRIM_GALORE { tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - prefix = opts.suffix ? "${meta.id}.${opts.suffix}" : "${meta.id}" + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/nextflow.config b/nextflow.config index 7ff44b819..28e37f721 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,7 @@ params { // Options: Generic input = './design.csv' single_end = false - seq_center = false + seq_center = '' fragment_size = 200 fingerprint_bins = 500000 From a036cb028bb4315589fa8528e0937ec9c568276b Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 21 Jul 2020 15:15:56 +0100 Subject: [PATCH 037/538] Finesse mapping and sorting steps --- conf/modules.config | 6 ++ main.nf | 82 ++++++++++++++++++--------- modules/nf-core/samtools_flagstat.nf | 28 +++++++++ modules/nf-core/samtools_flagstats.nf | 0 modules/nf-core/samtools_idxstats.nf | 28 +++++++++ modules/nf-core/samtools_index.nf | 25 +++++--- modules/nf-core/samtools_sort.nf | 29 +++++----- modules/nf-core/samtools_stats.nf | 32 ++++++----- 8 files changed, 165 insertions(+), 65 deletions(-) create mode 100644 modules/nf-core/samtools_flagstat.nf delete mode 100644 modules/nf-core/samtools_flagstats.nf diff --git a/conf/modules.config b/conf/modules.config index 6262587ac..dd225a141 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -48,5 +48,11 @@ params { publish_dir = "bwa" publish_results = "all" } + 'samtools_sort_lib' { + args = "" + suffix = ".Lb.sorted" + publish_dir = "bwa" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index 8b2293a7b..6f6808ea8 100755 --- a/main.nf +++ b/main.nf @@ -157,6 +157,8 @@ include { BWA_MEM } from './modules/nf-core/bwa_mem' include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' +include { SAMTOOLS_IDXSTATS } from './modules/nf-core/samtools_idxstats' +include { SAMTOOLS_FLAGSTAT } from './modules/nf-core/samtools_flagstat' include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' //include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' @@ -185,8 +187,8 @@ workflow CHECK_INPUT { .set { ch_design } emit: - reads = ch_reads - design = ch_design + reads = ch_reads // channel: [ val(meta), [ reads ] ] + design = ch_design // channel: [ val(meta), [ reads ] ] } /* @@ -214,13 +216,13 @@ workflow QC_TRIM { trim_html = Channel.empty() trim_zip = Channel.empty() trim_log = Channel.empty() - trim_version = Channel.empty() + trim_galore_version = Channel.empty() if (!skip_trimming) { TRIM_GALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } trim_html = TRIM_GALORE.out.html trim_zip = TRIM_GALORE.out.zip trim_log = TRIM_GALORE.out.log - trim_version = TRIM_GALORE.out.version + trim_galore_version = TRIM_GALORE.out.version } emit: @@ -232,7 +234,27 @@ workflow QC_TRIM { trim_html // channel: [ val(meta), [ html ] ] trim_zip // channel: [ val(meta), [ zip ] ] trim_log // channel: [ val(meta), [ txt ] ] - trim_version // path: *.version.txt + trim_galore_version // path: *.version.txt +} + +/* + * Run SAMtools stats, flagstat and idxstats + */ +workflow BAM_STATS { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + samtools_opts // map: options for SAMTools modules + + main: + SAMTOOLS_STATS(ch_bam_bai, samtools_opts) + SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_opts) + SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_opts) + + emit: + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_STATS.out.version // path: *.version.txt } /* @@ -240,18 +262,21 @@ workflow QC_TRIM { */ workflow SORT_BAM { take: - ch_bam // channel: [ val(name), val(single_end), bam ] + ch_bam // channel: [ val(meta), [ bam ] ] + samtools_opts // map: options for SAMTools modules main: - SAMTOOLS_SORT(ch_bam) | SAMTOOLS_INDEX - SAMTOOLS_STATS(SAMTOOLS_SORT.out.join(SAMTOOLS_INDEX.out, by: [0,1])) + SAMTOOLS_SORT(ch_bam, samtools_opts) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_opts) + BAM_STATS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) emit: - bam = SAMTOOLS_SORT.out - bai = SAMTOOLS_INDEX.out - stats = SAMTOOLS_STATS.out.stats - flagstat = SAMTOOLS_STATS.out.flagstat - idxstats = SAMTOOLS_STATS.out.idxstats + bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt } /* @@ -259,29 +284,30 @@ workflow SORT_BAM { */ workflow ALIGN { take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index - ch_fasta // path: /path/to/genome.fasta - bwa_mem_opts // map: options for BWA MEM module + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_opts // map: options for BWA MEM module + samtools_opts // map: options for SAMTools modules main: BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) - //SORT_BAM(BWA_MEM.out) + SORT_BAM(BWA_MEM.out.bam, samtools_opts) emit: - bam = BWA_MEM.out.bam - // bam = SORT_BAM.out.bam - // bai = SORT_BAM.out.bai - // stats = SORT_BAM.out.stats - // flagstat = SORT_BAM.out.flagstat - // idxstats = SORT_BAM.out.idxstats - bwa_version = BWA_MEM.out.version + bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] + bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] + stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bwa_version = BWA_MEM.out.version // path: *.version.txt + samtools_version = SORT_BAM.out.samtools_version // path: *.version.txt } /* * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats */ -workflow MARKDUP { +workflow MARKDUPLICATES { take: ch_bam // channel: [ val(name), val(single_end), bam ] @@ -349,7 +375,7 @@ workflow { // MAP READS & BAM QC score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' params.modules['bwa_mem'].args += score - ALIGN(QC_TRIM.out.reads, ch_index, ch_fasta, params.modules['bwa_mem']) + ALIGN(QC_TRIM.out.reads, ch_index, ch_fasta, params.modules['bwa_mem'], params.modules['samtools_sort_lib']) // // // MERGE RESEQUENCED BAM FILES @@ -363,7 +389,7 @@ workflow { // PICARD_MERGESAMFILES(ch_sort_bam) | MARKDUP // // // FILTER BAM FILES - // // FILTER_BAM(MARK_DUPS.out.bam, + // // FILTER_BAM(MARKDUPLICATES.out.bam, // // MAKE_GENOME_FILTER.out.collect(), // // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE // diff --git a/modules/nf-core/samtools_flagstat.nf b/modules/nf-core/samtools_flagstat.nf new file mode 100644 index 000000000..eb5b910dc --- /dev/null +++ b/modules/nf-core/samtools_flagstat.nf @@ -0,0 +1,28 @@ +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(bai) + val opts + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "*.version.txt", emit: version + + script: + """ + samtools flagstat $bam > ${bam}.flagstat + samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + """ +} diff --git a/modules/nf-core/samtools_flagstats.nf b/modules/nf-core/samtools_flagstats.nf deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/nf-core/samtools_idxstats.nf b/modules/nf-core/samtools_idxstats.nf index e69de29bb..fd1eac27b 100644 --- a/modules/nf-core/samtools_idxstats.nf +++ b/modules/nf-core/samtools_idxstats.nf @@ -0,0 +1,28 @@ +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(bai) + val opts + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "*.version.txt", emit: version + + script: + """ + samtools idxstats $bam > ${bam}.idxstats + samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + """ +} diff --git a/modules/nf-core/samtools_index.nf b/modules/nf-core/samtools_index.nf index a09bae039..204289fa8 100644 --- a/modules/nf-core/samtools_index.nf +++ b/modules/nf-core/samtools_index.nf @@ -1,19 +1,28 @@ -/* - * Index BAM file - */ process SAMTOOLS_INDEX { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}", mode: params.publish_dir_mode + tag "$meta.id" + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(bam) + tuple val(meta), path(bam) + val opts output: - tuple val(name), val(single_end), path('*.bai') + tuple val(meta), path("*.bai"), emit: bai + path "*.version.txt", emit: version script: """ samtools index $bam + samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt """ } diff --git a/modules/nf-core/samtools_sort.nf b/modules/nf-core/samtools_sort.nf index e61390762..c309a2af7 100644 --- a/modules/nf-core/samtools_sort.nf +++ b/modules/nf-core/samtools_sort.nf @@ -1,31 +1,30 @@ -def MODULE = "samtools_sort" -params.publish_dir = MODULE -params.publish_results = "default" -params.suffix = '' -//params.samtools_sort_args = '' - process SAMTOOLS_SORT { - publishDir "${params.outdir}/${params.publish_dir}", + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (params.publish_results == "none") null + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null else filename } - container "docker.pkg.github.com/nf-core/$MODULE" - conda "${moduleDir}/environment.yml" + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(bam) - //val (samtools_sort_args) + tuple val(meta), path(bam) + val opts output: - tuple val(name), val(single_end), path('*.bam') + tuple val(meta), path("*.bam"), emit: bam path "*.version.txt", emit: version script: - prefix = "${name}.${suffix}" + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ - samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $name $bam + samtools sort $opts.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt """ } diff --git a/modules/nf-core/samtools_stats.nf b/modules/nf-core/samtools_stats.nf index 1621bd141..c568740df 100644 --- a/modules/nf-core/samtools_stats.nf +++ b/modules/nf-core/samtools_stats.nf @@ -1,24 +1,28 @@ -/* - * Index BAM file - */ process SAMTOOLS_STATS { - tag "$name" - label 'process_medium' - publishDir path: "${params.outdir}", mode: params.publish_dir_mode + tag "$meta.id" + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(bam), path(bai) - + tuple val(meta), path(bam), path(bai) + val opts + output: - tuple val(name), val(single_end), path('*.stats'), emit: stats - tuple val(name), val(single_end), path('*.flagstat'), emit: flagstat - tuple val(name), val(single_end), path('*.idxstats'), emit: idxstats + tuple val(meta), path("*.stats"), emit: stats + path "*.version.txt", emit: version script: - prefix = "${name}.Lb" """ samtools stats $bam > ${bam}.stats - samtools flagstat $bam > ${bam}.flagstat - samtools idxstats $bam > ${bam}.idxstats + samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt """ } From a9c391813fd7522faae6259d858e2abca1f15086 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 00:16:50 +0100 Subject: [PATCH 038/538] Add in Picard MarkDuplicates --- conf/modules.config | 124 ++++++++++++++--------- main.nf | 50 +++++---- modules/nf-core/picard_markduplicates.nf | 41 +++++--- modules/nf-core/picard_mergesamfiles.nf | 39 ++++--- 4 files changed, 153 insertions(+), 101 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index dd225a141..01faeb553 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -4,55 +4,79 @@ * ------------------------------------------------- */ params { - modules { - 'fastqc' { - args = "--quiet" - suffix = "" - publish_dir = "fastqc" - publish_results = "all" + modules { + 'fastqc' { + args = "--quiet" + suffix = "" + publish_dir = "fastqc" + publish_results = "all" + } + 'trim_galore' { + args = "--fastqc" + suffix = "" + publish_dir = "trim_galore" + publish_results = "all" + } + 'bwa_index' { + args = "-a bwtsw" + suffix = "" + publish_dir = "genome/bwa_index" + publish_results = "all" + } + 'gtf2bed' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } + 'make_genome_filter' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } + 'get_chrom_sizes' { + args = "" + suffix = "" + publish_dir = "genome" + publish_results = "all" + } + 'bwa_mem' { + args = "-M" + args2 = "-h -F 0x0100 -O BAM" + suffix = ".Lb" + publish_dir = "bwa/library" + publish_results = "all" + } + 'samtools_sort_lib' { + args = "" + suffix = ".Lb.sorted" + publish_dir = "bwa/library" + publish_results = "all" + } + 'picard_mergesamfiles' { + args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + suffix = ".mLb.sorted" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } + 'picard_markduplicates' { + args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } + 'samtools_sort_merged_lib' { + args = "" + suffix = ".mLb.mkD.sorted" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } + 'picard_collectmultiplemetrics' { + args = "" + suffix = ".mLb.sorted" + publish_dir = "bwa/mergedLibrary/picard_metrics" + publish_results = "all" + } } - 'trim_galore' { - args = "--fastqc" - suffix = "" - publish_dir = "trim_galore" - publish_results = "all" - } - 'bwa_index' { - args = "-a bwtsw" - suffix = "" - publish_dir = "genome/bwa_index" - publish_results = "all" - } - 'gtf2bed' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - } - 'make_genome_filter' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - } - 'get_chrom_sizes' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - } - 'bwa_mem' { - args = "-M" - args2 = "-h -F 0x0100 -O BAM" - suffix = ".Lb" - publish_dir = "bwa" - publish_results = "all" - } - 'samtools_sort_lib' { - args = "" - suffix = ".Lb.sorted" - publish_dir = "bwa" - publish_results = "all" - } - } } diff --git a/main.nf b/main.nf index 6f6808ea8..ef72b1a1e 100755 --- a/main.nf +++ b/main.nf @@ -309,20 +309,24 @@ workflow ALIGN { */ workflow MARKDUPLICATES { take: - ch_bam // channel: [ val(name), val(single_end), bam ] + ch_bam // channel: [ val(meta), [ bam ] ] + markduplicates_opts // map: options for picard MarkDuplicates module + samtools_opts // map: options for SAMTools modules main: - PICARD_MARKDUPLICATES(ch_bam) - SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam) - SAMTOOLS_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out, by: [0,1])) + PICARD_MARKDUPLICATES(ch_bam, markduplicates_opts) + SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_opts) + BAM_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) emit: - bam = PICARD_MARKDUPLICATES.out.bam - metrics = PICARD_MARKDUPLICATES.out.metrics - bai = SAMTOOLS_INDEX.out - stats = SAMTOOLS_STATS.out.stats - flagstat = SAMTOOLS_STATS.out.flagstat - idxstats = SAMTOOLS_STATS.out.idxstats + bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] + metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt + samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt } /* @@ -377,17 +381,21 @@ workflow { params.modules['bwa_mem'].args += score ALIGN(QC_TRIM.out.reads, ch_index, ch_fasta, params.modules['bwa_mem'], params.modules['samtools_sort_lib']) - // - // // MERGE RESEQUENCED BAM FILES - // ALIGN - // .out - // .bam - // .map { it -> [ it[0].split('_')[0..-2].join('_'), it[1], it[2] ] } - // .groupTuple(by: [0, 1]) - // .map { it -> [ it[0], it[1], it[2].flatten() ] } - // .set { ch_sort_bam } - // PICARD_MERGESAMFILES(ch_sort_bam) | MARKDUP - // + // MERGE RESEQUENCED BAM FILES + ALIGN + .out + .bam + .map { meta, bam -> + fmeta = meta.findAll { it.key != 'read_group' } + fmeta.id = fmeta.id.split('_')[0..-2].join('_') + [ fmeta, bam ] } + .groupTuple(by: [0]) + .map { it -> [ it[0], it[1].flatten() ] } + .set { ch_sort_bam } + + PICARD_MERGESAMFILES(ch_sort_bam, params.modules['picard_mergesamfiles']) + MARKDUPLICATES(PICARD_MERGESAMFILES.out.bam, params.modules['picard_markduplicates'], params.modules['samtools_sort_merged_lib']) + // // FILTER BAM FILES // // FILTER_BAM(MARKDUPLICATES.out.bam, // // MAKE_GENOME_FILTER.out.collect(), diff --git a/modules/nf-core/picard_markduplicates.nf b/modules/nf-core/picard_markduplicates.nf index 45e5c116b..785e4f769 100644 --- a/modules/nf-core/picard_markduplicates.nf +++ b/modules/nf-core/picard_markduplicates.nf @@ -1,20 +1,29 @@ -/* - * Picard MarkDuplicates - */ process PICARD_MARKDUPLICATES { - tag "$name" + tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(bam) + tuple val(meta), path(bam) + val opts output: - tuple val(name), val(single_end), path("*.bam"), emit: bam - tuple val(name), val(single_end), path("*.txt"), emit: metrics + tuple val(meta), path("*.bam"), emit: bam + path "*.metrics.txt", emit: metrics + path "*.version.txt", emit: version script: - prefix = "${name}.mLb.mkD" + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -22,13 +31,13 @@ process PICARD_MARKDUPLICATES { avail_mem = task.memory.toGiga() } """ - picard -Xmx${avail_mem}g MarkDuplicates \\ + picard \\ + -Xmx${avail_mem}g \\ + MarkDuplicates \\ + $opts.args \\ INPUT=$bam \\ - OUTPUT=${prefix}.sorted.bam \\ - ASSUME_SORTED=true \\ - REMOVE_DUPLICATES=false \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp + OUTPUT=${prefix}.bam \\ + METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt + picard MarkDuplicates --version &> picard.version.txt || true """ } diff --git a/modules/nf-core/picard_mergesamfiles.nf b/modules/nf-core/picard_mergesamfiles.nf index 785512d38..b732f7f6b 100644 --- a/modules/nf-core/picard_mergesamfiles.nf +++ b/modules/nf-core/picard_mergesamfiles.nf @@ -1,19 +1,28 @@ -/* - * Picard MergeSamFiles - */ process PICARD_MERGESAMFILES { - tag "$name" + tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) input: - tuple val(name), val(single_end), path(bams) + tuple val(meta), path(bams) + val opts output: - tuple val(name), val(single_end), path("*.bam") + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version script: - prefix = "${name}.mLb.mkD" + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" bam_files = bams.sort() def avail_mem = 3 if (!task.memory) { @@ -23,16 +32,18 @@ process PICARD_MERGESAMFILES { } if (bam_files.size() > 1) { """ - picard -Xmx${avail_mem}g MergeSamFiles \\ + picard \\ + -Xmx${avail_mem}g \\ + MergeSamFiles \\ + $opts.args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ - OUTPUT=${name}.sorted.bam \\ - SORT_ORDER=coordinate \\ - VALIDATION_STRINGENCY=LENIENT \\ - TMP_DIR=tmp + OUTPUT=${prefix}.bam + picard MergeSamFiles --version &> picard.version.txt || true """ } else { """ - ln -s ${bam_files[0]} ${name}.sorted.bam + ln -s ${bam_files[0]} ${prefix}.bam + picard MergeSamFiles --version &> picard.version.txt || true """ } } From 14d2bee6a1ddbe551bf94e8601fcded7e2ad2390 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 01:06:29 +0100 Subject: [PATCH 039/538] Add in filter BAM steps --- conf/modules.config | 34 +++++- main.nf | 107 ++++++------------ modules/local/check_samplesheet.nf | 7 +- modules/local/filter_bam.nf | 33 +++--- modules/local/get_software_versions.nf | 12 +- modules/local/output_documentation.nf | 7 +- .../nf-core/picard_collectmultiplemetrics.nf | 44 +++++++ 7 files changed, 148 insertions(+), 96 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 01faeb553..2f21fabc3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -5,6 +5,12 @@ */ params { modules { + 'check_samplesheet' { + args = "" + suffix = "" + publish_dir = "pipeline_info" + publish_results = "all" + } 'fastqc' { args = "--quiet" suffix = "" @@ -72,11 +78,35 @@ params { publish_dir = "bwa/mergedLibrary" publish_results = "all" } - 'picard_collectmultiplemetrics' { + 'filter_bam' { args = "" - suffix = ".mLb.sorted" + suffix = ".mLb.flT.sorted" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } + 'samtools_sort_filter' { + args = "" + suffix = ".mLb.flT.sorted" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } + 'picard_collectmultiplemetrics' { + args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + suffix = ".mLb.mkD.sorted" publish_dir = "bwa/mergedLibrary/picard_metrics" publish_results = "all" } + 'get_software_versions' { + args = "" + suffix = "" + publish_dir = "pipeline_info" + publish_results = "all" + } + 'output_documentation' { + args = "" + suffix = "" + publish_dir = "pipeline_info" + publish_results = "all" + } } } diff --git a/main.nf b/main.nf index ef72b1a1e..a10f4baaa 100755 --- a/main.nf +++ b/main.nf @@ -161,7 +161,7 @@ include { SAMTOOLS_IDXSTATS } from './modules/nf-core/samtools_idxstats' include { SAMTOOLS_FLAGSTAT } from './modules/nf-core/samtools_flagstat' include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' -//include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' +include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' include { MULTIQC } from './modules/nf-core/multiqc' /* @@ -169,11 +169,12 @@ include { MULTIQC } from './modules/nf-core/multiqc' */ workflow CHECK_INPUT { take: - ch_input // file: /path/to/samplesheet.csv - seq_center // string: sequencing center for read group + ch_input // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group + check_samplesheet_opts // map: options for TrimGalore! module main: - CHECK_SAMPLESHEET(ch_input) + CHECK_SAMPLESHEET(ch_input, check_samplesheet_opts) .reads .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, params.single_end, seq_center) } @@ -332,33 +333,32 @@ workflow MARKDUPLICATES { /* * Filter BAM file */ -workflow FILTER_BAM { +workflow CLEAN_BAM { take: - ch_bam // channel: [ val(name), val(single_end), bam ] - ch_bai // channel: [ val(name), val(single_end), bai ] - ch_bed // channel: [ bed ] - config // file: BAMtools filter JSON config file + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + config // file: BAMtools filter JSON config file + filter_bam_opts // map: options for filter_bam module + samtools_opts // map: options for SAMTools modules main: - FILTER_BAM(ch_bam, - ch_bai, - ch_bed, - config) // Fix getting name sorted BAM here for PE/SE - SAMTOOLS_INDEX(FILTER_BAM.out.bam) - SAMTOOLS_STATS(FILTER_BAM.out.bam.join(SAMTOOLS_INDEX.out, by: [0,1])) + FILTER_BAM(ch_bam_bai, ch_bed, config, filter_bam_opts) + SAMTOOLS_INDEX(FILTER_BAM.out.bam, samtools_opts) + BAM_STATS(FILTER_BAM.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) emit: - bam = FILTER_BAM.out.bam - bai = SAMTOOLS_INDEX.out - stats = SAMTOOLS_STATS.out.stats - flagstat = SAMTOOLS_STATS.out.flagstat - idxstats = SAMTOOLS_STATS.out.idxstats + bam = FILTER_BAM.out.bam // channel: [ val(meta), [ bam ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bamtools_version = FILTER_BAM.out.version // path: *.version.txt } workflow { // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES - CHECK_INPUT(ch_input, params.seq_center) + CHECK_INPUT(ch_input, params.seq_center, params.modules['check_samplesheet']) // PREPARE GENOME FILES ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX(ch_fasta, params.modules['bwa_index']).index @@ -396,15 +396,20 @@ workflow { PICARD_MERGESAMFILES(ch_sort_bam, params.modules['picard_mergesamfiles']) MARKDUPLICATES(PICARD_MERGESAMFILES.out.bam, params.modules['picard_markduplicates'], params.modules['samtools_sort_merged_lib']) - // // FILTER BAM FILES - // // FILTER_BAM(MARKDUPLICATES.out.bam, - // // MAKE_GENOME_FILTER.out.collect(), - // // ch_bamtools_filter_config) // Fix getting name sorted BAM here for PE/SE - // - // // PIPELINE TEMPLATE REPORTING - // GET_SOFTWARE_VERSIONS() - // OUTPUT_DOCUMENTATION(ch_output_docs,ch_output_docs_images) - // + // FILTER BAM FILES + // Fix getting name sorted BAM here for PE/SE + CLEAN_BAM(MARKDUPLICATES.out.bam.join(MARKDUPLICATES.out.bai, by: [0]), + MAKE_GENOME_FILTER.out.collect(), + ch_bamtools_filter_config, + params.modules['filter_bam'], + params.modules['samtools_sort_filter']) + + //PICARD_COLLECTMULTIPLEMETRICS(MARKDUPLICATES.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) + + // PIPELINE TEMPLATE REPORTING + //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) + //OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) + // // MULTIQC( // // summary, // // FASTQC.out, @@ -533,48 +538,6 @@ workflow.onComplete { // } // // /* -// * STEP 5.2: Picard CollectMultipleMetrics after merging libraries and filtering -// */ -// process PICARD_METRICS { -// tag "$name" -// label 'process_medium' -// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('_metrics')) "picard_metrics/$filename" -// else if (filename.endsWith('.pdf')) "picard_metrics/pdf/$filename" -// else null -// } -// -// when: -// !params.skip_picard_metrics -// -// input: -// tuple val(name), path(bam) from ch_rm_orphan_bam_metrics -// path fasta from ch_fasta -// -// output: -// path '*_metrics' into ch_collectmetrics_mqc -// path '*.pdf' -// -// script: -// prefix = "${name}.mLb.clN" -// def avail_mem = 3 -// if (!task.memory) { -// log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' -// } else { -// avail_mem = task.memory.toGiga() -// } -// """ -// picard -Xmx${avail_mem}g CollectMultipleMetrics \\ -// INPUT=${bam[0]} \\ -// OUTPUT=${prefix}.CollectMultipleMetrics \\ -// REFERENCE_SEQUENCE=$fasta \\ -// VALIDATION_STRINGENCY=LENIENT \\ -// TMP_DIR=tmp -// """ -// } -// -// /* // * STEP 5.3: Read depth normalised bigWig // */ // process BIGWIG { diff --git a/modules/local/check_samplesheet.nf b/modules/local/check_samplesheet.nf index 24b08c2d8..00184902a 100755 --- a/modules/local/check_samplesheet.nf +++ b/modules/local/check_samplesheet.nf @@ -3,10 +3,15 @@ */ process CHECK_SAMPLESHEET { tag "$samplesheet" - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } input: path samplesheet + val opts output: path 'samplesheet_reads.csv', emit: reads diff --git a/modules/local/filter_bam.nf b/modules/local/filter_bam.nf index 22b14cd12..330ee9c0e 100644 --- a/modules/local/filter_bam.nf +++ b/modules/local/filter_bam.nf @@ -2,33 +2,31 @@ * Filter BAM file */ process FILTER_BAM { - tag "$name" + tag "$meta.id" label 'process_medium' - publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode - // saveAs: { filename -> - // if (single_end || params.save_align_intermeds) { - // else if (filename.endsWith('.sorted.bam')) filename - // else if (filename.endsWith('.sorted.bam.bai')) filename - // else null - // } - // } + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } input: - tuple val(name), val(single_end), path(bam) - tuple val(name), val(single_end), path(bai) + tuple val(meta), path(bam), path(bai) path bed path config + val opts output: - tuple val(name), val(single_end), path('*.bam'), emit: bam - + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + script: - prefix = single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" - filter_params = single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' dup_params = params.keep_dups ? '' : '-F 0x0400' multimap_params = params.keep_multi_map ? '' : '-q 1' blacklist_params = params.blacklist ? "-L $bed" : '' - //name_sort_bam = single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" """ samtools view \\ $filter_params \\ @@ -39,6 +37,9 @@ process FILTER_BAM { | bamtools filter \\ -out ${prefix}.sorted.bam \\ -script $config + echo \$(bamtools --version 2>&1) > bamtools.version.txt """ } +//prefix = meta.single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" +//name_sort_bam = meta.single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" //$name_sort_bam diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf index 9d19a8758..0a90a0c62 100755 --- a/modules/local/get_software_versions.nf +++ b/modules/local/get_software_versions.nf @@ -2,11 +2,15 @@ * Parse software version numbers */ process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, saveAs: { filename -> - if (filename.indexOf(".csv") > 0) filename - else null - } + if (opts.publish_results == "none") null + else if (filename.endsWith('.yaml')) null + else filename } + + input: + val opts output: path 'software_versions_mqc.yaml' diff --git a/modules/local/output_documentation.nf b/modules/local/output_documentation.nf index b6d24b0f5..e3201527a 100755 --- a/modules/local/output_documentation.nf +++ b/modules/local/output_documentation.nf @@ -2,11 +2,16 @@ * Output Markdown documentation to HTML */ process OUTPUT_DOCUMENTATION { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } input: path output_docs path images + val opts output: path "results_description.html" diff --git a/modules/nf-core/picard_collectmultiplemetrics.nf b/modules/nf-core/picard_collectmultiplemetrics.nf index e69de29bb..fa3304f7c 100644 --- a/modules/nf-core/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/picard_collectmultiplemetrics.nf @@ -0,0 +1,44 @@ +process PICARD_COLLECTMULTIPLEMETRICS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam) + path fasta + val opts + + output: + tuple val(meta), path("*_metrics"), emit: metrics + tuple val(meta), path("*.pdf"), emit: pdf + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.toGiga() + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectMultipleMetrics \\ + $opts.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.CollectMultipleMetrics \\ + REFERENCE_SEQUENCE=$fasta + picard CollectMultipleMetrics --version &> picard.version.txt || true + """ +} From 58bfb9db00889736684e148372b11e2d40401509 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 12:18:07 +0100 Subject: [PATCH 040/538] Add in remove bam process --- conf/modules.config | 8 ++- main.nf | 102 +++++----------------------- modules/local/filter_bam.nf | 5 +- modules/local/remove_bam_orphans.nf | 32 +++++++++ 4 files changed, 58 insertions(+), 89 deletions(-) create mode 100644 modules/local/remove_bam_orphans.nf diff --git a/conf/modules.config b/conf/modules.config index 2f21fabc3..300da9b53 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -84,9 +84,15 @@ params { publish_dir = "bwa/mergedLibrary" publish_results = "all" } + 'remove_bam_orphans' { + args = "--only_fr_pairs" + suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary" + publish_results = "all" + } 'samtools_sort_filter' { args = "" - suffix = ".mLb.flT.sorted" + suffix = ".mLb.clN.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" } diff --git a/main.nf b/main.nf index a10f4baaa..564ebe66d 100755 --- a/main.nf +++ b/main.nf @@ -144,6 +144,7 @@ include { GTF2BED } from './modules/local/gtf2bed' include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' include { FILTER_BAM } from './modules/local/filter_bam' +include { REMOVE_BAM_ORPHANS } from './modules/local/remove_bam_orphans' include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' @@ -174,7 +175,7 @@ workflow CHECK_INPUT { check_samplesheet_opts // map: options for TrimGalore! module main: - CHECK_SAMPLESHEET(ch_input, check_samplesheet_opts) + CHECK_SAMPLESHEET (ch_input, check_samplesheet_opts) .reads .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, params.single_end, seq_center) } @@ -335,23 +336,25 @@ workflow MARKDUPLICATES { */ workflow CLEAN_BAM { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - config // file: BAMtools filter JSON config file - filter_bam_opts // map: options for filter_bam module - samtools_opts // map: options for SAMTools modules + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + config // file: BAMtools filter JSON config file + filter_bam_opts // map: options for filter_bam module + rm_bam_orphans_opts // map: options for remove_bam_orphans module + samtools_opts // map: options for SAMTools modules main: FILTER_BAM(ch_bam_bai, ch_bed, config, filter_bam_opts) - SAMTOOLS_INDEX(FILTER_BAM.out.bam, samtools_opts) - BAM_STATS(FILTER_BAM.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + REMOVE_BAM_ORPHANS(FILTER_BAM.out.bam, rm_bam_orphans_opts) + SORT_BAM(REMOVE_BAM_ORPHANS.out.bam, samtools_opts) emit: - bam = FILTER_BAM.out.bam // channel: [ val(meta), [ bam ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + name_bam = REMOVE_BAM_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] + bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] + bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] + stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] bamtools_version = FILTER_BAM.out.version // path: *.version.txt } @@ -402,9 +405,10 @@ workflow { MAKE_GENOME_FILTER.out.collect(), ch_bamtools_filter_config, params.modules['filter_bam'], + params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter']) - //PICARD_COLLECTMULTIPLEMETRICS(MARKDUPLICATES.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) + //PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) @@ -426,76 +430,6 @@ workflow.onComplete { Completion.summary(workflow, params, log) } -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- MERGE LIBRARY BAM -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * STEP 4.3: Remove orphan reads from paired-end BAM file -// */ -// if (params.single_end) { -// ch_filter_bam -// .into { ch_rm_orphan_bam_metrics; -// ch_rm_orphan_bam_bigwig; -// ch_rm_orphan_bam_macs_1; -// ch_rm_orphan_bam_macs_2; -// ch_rm_orphan_bam_phantompeakqualtools; -// ch_rm_orphan_name_bam_counts } -// -// ch_filter_bam_flagstat -// .into { ch_rm_orphan_flagstat_bigwig; -// ch_rm_orphan_flagstat_macs; -// ch_rm_orphan_flagstat_mqc } -// -// ch_filter_bam_stats_mqc -// .set { ch_rm_orphan_stats_mqc } -// } else { -// process MERGED_BAM_REMOVE_ORPHAN { -// tag "$name" -// label 'process_medium' -// publishDir path: "${params.outdir}/bwa/mergedLibrary", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.flagstat')) "samtools_stats/$filename" -// else if (filename.endsWith('.idxstats')) "samtools_stats/$filename" -// else if (filename.endsWith('.stats')) "samtools_stats/$filename" -// else if (filename.endsWith('.sorted.bam')) filename -// else if (filename.endsWith('.sorted.bam.bai')) filename -// else null -// } -// -// input: -// tuple val(name), path(bam) from ch_filter_bam -// -// output: -// tuple val(name), path('*.sorted.{bam,bam.bai}') into ch_rm_orphan_bam_metrics, -// ch_rm_orphan_bam_bigwig, -// ch_rm_orphan_bam_macs_1, -// ch_rm_orphan_bam_macs_2, -// ch_rm_orphan_bam_phantompeakqualtools -// tuple val(name), path("${prefix}.bam") into ch_rm_orphan_name_bam_counts -// tuple val(name), path('*.flagstat') into ch_rm_orphan_flagstat_bigwig, -// ch_rm_orphan_flagstat_macs, -// ch_rm_orphan_flagstat_mqc -// path '*.{idxstats,stats}' into ch_rm_orphan_stats_mqc -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// prefix = "${name}.mLb.clN" -// """ -// bampe_rm_orphan.py ${bam[0]} ${prefix}.bam --only_fr_pairs -// -// samtools sort -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix ${prefix}.bam -// samtools index ${prefix}.sorted.bam -// samtools flagstat ${prefix}.sorted.bam > ${prefix}.sorted.bam.flagstat -// samtools idxstats ${prefix}.sorted.bam > ${prefix}.sorted.bam.idxstats -// samtools stats ${prefix}.sorted.bam > ${prefix}.sorted.bam.stats -// """ -// } -// } -// // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ diff --git a/modules/local/filter_bam.nf b/modules/local/filter_bam.nf index 330ee9c0e..32c9f8f02 100644 --- a/modules/local/filter_bam.nf +++ b/modules/local/filter_bam.nf @@ -35,11 +35,8 @@ process FILTER_BAM { $blacklist_params \\ -b $bam \\ | bamtools filter \\ - -out ${prefix}.sorted.bam \\ + -out ${prefix}.bam \\ -script $config echo \$(bamtools --version 2>&1) > bamtools.version.txt """ } -//prefix = meta.single_end ? "${name}.mLb.clN" : "${name}.mLb.flT" -//name_sort_bam = meta.single_end ? '' : "samtools sort -n -@ $task.cpus -o ${prefix}.bam -T $prefix ${prefix}.sorted.bam" -//$name_sort_bam diff --git a/modules/local/remove_bam_orphans.nf b/modules/local/remove_bam_orphans.nf new file mode 100644 index 000000000..46fbc30c9 --- /dev/null +++ b/modules/local/remove_bam_orphans.nf @@ -0,0 +1,32 @@ +/* + * Remove orphan reads from paired-end BAM file + */ +process REMOVE_BAM_ORPHANS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + input: + tuple val(meta), path(bam) + val opts + + output: + tuple val(meta), path("${prefix}.bam"), emit: bam + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + if (!meta.single_end) { + """ + samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam + bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $opts.args + """ + } else { + """ + ln -s $bam ${prefix}.bam + """ + } +} From 55350953fb13072483c18d5df03c87cd15f5cf4a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 13:20:30 +0100 Subject: [PATCH 041/538] Add in preseq --- conf/modules.config | 12 ++++++++ main.nf | 47 ++++++++--------------------- modules/nf-core/multiqc.nf | 5 +++ modules/nf-core/preseq_lc_extrap.nf | 39 ++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 34 deletions(-) create mode 100644 modules/nf-core/preseq_lc_extrap.nf diff --git a/conf/modules.config b/conf/modules.config index 300da9b53..db28c4b7f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -102,6 +102,18 @@ params { publish_dir = "bwa/mergedLibrary/picard_metrics" publish_results = "all" } + 'preseq_lc_extrap' { + args = "-verbose -bam -seed 1" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/preseq" + publish_results = "all" + } + 'bedtools_genomecov' { + args = "" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/bigwig" + publish_results = "all" + } 'get_software_versions' { args = "" suffix = "" diff --git a/main.nf b/main.nf index 564ebe66d..bee390941 100755 --- a/main.nf +++ b/main.nf @@ -145,6 +145,7 @@ include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' include { FILTER_BAM } from './modules/local/filter_bam' include { REMOVE_BAM_ORPHANS } from './modules/local/remove_bam_orphans' +include { BEDTOOLS_GENOMECOV } from './modules/local/bedtools_genomecov' include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' @@ -163,6 +164,16 @@ include { SAMTOOLS_FLAGSTAT } from './modules/nf-core/samtools_flagstat' include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' +include { PRESEQ_LC_EXTRAP } from './modules/nf-core/preseq_lc_extrap' +//include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/ucsc_bedgraphtobigwig' +//include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' +//include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' +//include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' +//include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computematrix' +//include { MACSC2_CALLPEAK } from './modules/nf-core/macs2_callpeak' +//include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/homer_annotatepeaks' +//include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' +//include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/subread_featurecounts' include { MULTIQC } from './modules/nf-core/multiqc' /* @@ -408,7 +419,8 @@ workflow { params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter']) - //PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) + PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) + PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) @@ -439,39 +451,6 @@ workflow.onComplete { // /////////////////////////////////////////////////////////////////////////////// // // /* -// * STEP 5.1: Preseq analysis after merging libraries and before filtering -// */ -// process PRESEQ { -// tag "$name" -// label 'process_medium' -// label 'error_ignore' -// publishDir "${params.outdir}/bwa/mergedLibrary/preseq", mode: params.publish_dir_mode -// -// when: -// !params.skip_preseq -// -// input: -// tuple val(name), path(bam) from ch_merge_bam_preseq -// -// output: -// path '*.ccurve.txt' into ch_preseq_mqc -// path '*.log' -// -// script: -// pe = params.single_end ? '' : '-pe' -// """ -// preseq lc_extrap \\ -// -output ${name}.ccurve.txt \\ -// -verbose \\ -// -bam \\ -// $pe \\ -// -seed 1 \\ -// ${bam[0]} -// cp .command.err ${name}.command.log -// """ -// } -// -// /* // * STEP 5.3: Read depth normalised bigWig // */ // process BIGWIG { diff --git a/modules/nf-core/multiqc.nf b/modules/nf-core/multiqc.nf index 5efb77a52..9181580d1 100755 --- a/modules/nf-core/multiqc.nf +++ b/modules/nf-core/multiqc.nf @@ -27,6 +27,11 @@ if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { process MULTIQC { publishDir "${params.outdir}/multiqc", mode: params.publish_dir_mode + container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" + //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + input: path (multiqc_config) from ch_multiqc_config path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) diff --git a/modules/nf-core/preseq_lc_extrap.nf b/modules/nf-core/preseq_lc_extrap.nf new file mode 100644 index 000000000..b87a038be --- /dev/null +++ b/modules/nf-core/preseq_lc_extrap.nf @@ -0,0 +1,39 @@ +process PRESEQ_LC_EXTRAP { + tag "$meta.id" + label 'process_medium' + label 'error_ignore' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" + //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam) + val opts + + output: + tuple val(meta), path("*.ccurve.txt"), emit: ccurve + tuple val(meta), path("*.log"), emit: log + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + pe = meta.single_end ? '' : '-pe' + """ + preseq \\ + lc_extrap \\ + $opts.args \\ + $pe \\ + -output ${prefix}.ccurve.txt \\ + $bam + cp .command.err ${prefix}.command.log + preseq &> preseq.version.txt + """ +} From 2e296db5a58c48f427d8e14126ee81e021d79423 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 13:34:12 +0100 Subject: [PATCH 042/538] Add in BigWig generation --- conf/modules.config | 6 +++ main.nf | 46 +---------------------- modules/local/bedtools_genomecov.nf | 48 ++++++++++++++++++++++++ modules/nf-core/ucsc_bedgraphtobigwig.nf | 31 +++++++++++++++ 4 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 modules/local/bedtools_genomecov.nf create mode 100644 modules/nf-core/ucsc_bedgraphtobigwig.nf diff --git a/conf/modules.config b/conf/modules.config index db28c4b7f..5cb9b2c36 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -114,6 +114,12 @@ params { publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" } + 'ucsc_bedgraphtobigwig' { + args = "" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/bigwig" + publish_results = "all" + } 'get_software_versions' { args = "" suffix = "" diff --git a/main.nf b/main.nf index bee390941..90bf7dccb 100755 --- a/main.nf +++ b/main.nf @@ -421,6 +421,8 @@ workflow { PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) + BEDTOOLS_GENOMECOV(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), params.modules['bedtools_genomecov']) + UCSC_BEDRAPHTOBIGWIG(BEDTOOLS_GENOMECOV.out.bedgraph, GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig']) // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) @@ -442,50 +444,6 @@ workflow.onComplete { Completion.summary(workflow, params, log) } -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- MERGE LIBRARY BAM POST-ANALYSIS -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// /* -// * STEP 5.3: Read depth normalised bigWig -// */ -// process BIGWIG { -// tag "$name" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/bigwig", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('scale_factor.txt')) "scale/$filename" -// else if (filename.endsWith('.bigWig')) filename -// else null -// } -// -// input: -// tuple val(name), path(bam), path(flagstat) from ch_rm_orphan_bam_bigwig.join(ch_rm_orphan_flagstat_bigwig, by: [0]) -// path sizes from ch_genome_sizes_bigwig.collect() -// -// output: -// tuple val(name), path('*.bigWig') into ch_bigwig_plotprofile -// path '*igv.txt' into ch_bigwig_igv -// path '*scale_factor.txt' -// -// script: -// pe_fragment = params.single_end ? '' : '-pc' -// extend = (params.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' -// """ -// SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') -// echo \$SCALE_FACTOR > ${name}.scale_factor.txt -// genomeCoverageBed -ibam ${bam[0]} -bg -scale \$SCALE_FACTOR $pe_fragment $extend | sort -T '.' -k1,1 -k2,2n > ${name}.bedGraph -// -// bedGraphToBigWig ${name}.bedGraph $sizes ${name}.bigWig -// -// find * -type f -name "*.bigWig" -exec echo -e "bwa/mergedLibrary/bigwig/"{}"\\t0,0,178" \\; > ${name}.bigWig.igv.txt -// """ -// } -// // /* // * STEP 5.4: Generate gene body coverage plot with deepTools plotProfile and plotHeatmap // */ diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf new file mode 100644 index 000000000..0a6dd7f99 --- /dev/null +++ b/modules/local/bedtools_genomecov.nf @@ -0,0 +1,48 @@ +process BEDTOOLS_GENOMECOV { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(flagstat) + val opts + + output: + tuple val(meta), path("*.bigWig"), emit: bigwig + tuple val(meta), path("*.txt"), emit: scale_factor + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + pe = meta.single_end ? '' : '-pc' + extend = (params.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' + """ + SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') + echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt + + bedtools \\ + genomecov \\ + -ibam $bam \\ + -bg \\ + -scale \$SCALE_FACTOR \\ + $pe \\ + $extend \\ + | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph + + bedtools --version > bedtools.version.txt + """ +} +// tuple val(name), path(bam), path(flagstat) from ch_rm_orphan_bam_bigwig.join(ch_rm_orphan_flagstat_bigwig, by: [0]) +// path sizes from ch_genome_sizes_bigwig.collect() +// bedGraphToBigWig ${prefix}.bedGraph $sizes ${prefix}.bigWig +//find * -type f -name "*.bigWig" -exec echo -e "bwa/mergedLibrary/bigwig/"{}"\\t0,0,178" \\; > ${name}.bigWig.igv.txt diff --git a/modules/nf-core/ucsc_bedgraphtobigwig.nf b/modules/nf-core/ucsc_bedgraphtobigwig.nf new file mode 100644 index 000000000..b9b2a20d9 --- /dev/null +++ b/modules/nf-core/ucsc_bedgraphtobigwig.nf @@ -0,0 +1,31 @@ +process UCSC_BEDRAPHTOBIGWIG { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" + //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bedgraph) + path sizes + val opts + + output: + tuple val(meta), path("*.bigWig"), emit: bigwig + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + """ + bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig + bedGraphToBigWig > ucsc.version.txt + """ +} From 82a1e3e2c8e81696845f03bbe26b3f9e620739e1 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 14:31:31 +0100 Subject: [PATCH 043/538] Fix bigwig generation --- conf/modules.config | 18 ++++++++++++++++++ main.nf | 10 ++++++++-- modules/local/bedtools_genomecov.nf | 8 ++------ modules/nf-core/ucsc_bedgraphtobigwig.nf | 2 -- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5cb9b2c36..6ed67a1be 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -120,6 +120,24 @@ params { publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" } + 'deeptools_computematrix' { + args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/deeptools" + publish_results = "all" + } + 'deeptools_plotprofile' { + args = "" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/deeptools" + publish_results = "all" + } + 'deeptools_plotheatmap' { + args = "" + suffix = ".mLb.mkD" + publish_dir = "bwa/mergedLibrary/deeptools" + publish_results = "all" + } 'get_software_versions' { args = "" suffix = "" diff --git a/main.nf b/main.nf index 90bf7dccb..79098924d 100755 --- a/main.nf +++ b/main.nf @@ -165,11 +165,11 @@ include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' include { PRESEQ_LC_EXTRAP } from './modules/nf-core/preseq_lc_extrap' -//include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/ucsc_bedgraphtobigwig' +include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/ucsc_bedgraphtobigwig' +include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computematrix' //include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' //include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' //include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' -//include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computematrix' //include { MACSC2_CALLPEAK } from './modules/nf-core/macs2_callpeak' //include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/homer_annotatepeaks' //include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' @@ -419,11 +419,17 @@ workflow { params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter']) + // POST ALIGNMENT QC PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) + + // COVERAGE TRACKS BEDTOOLS_GENOMECOV(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), params.modules['bedtools_genomecov']) UCSC_BEDRAPHTOBIGWIG(BEDTOOLS_GENOMECOV.out.bedgraph, GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig']) + // COVERATE PLOTS + //DEEPTOOLS_COMPUTEMATRIX(UCSC_BEDRAPHTOBIGWIG.out.bigwig, ch_gene_bed, params.modules['deeptools_computematrix']) + // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) //OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 0a6dd7f99..05611f55e 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -18,7 +18,7 @@ process BEDTOOLS_GENOMECOV { val opts output: - tuple val(meta), path("*.bigWig"), emit: bigwig + tuple val(meta), path("*.bedGraph"), emit: bedgraph tuple val(meta), path("*.txt"), emit: scale_factor path "*.version.txt", emit: version @@ -37,12 +37,8 @@ process BEDTOOLS_GENOMECOV { -scale \$SCALE_FACTOR \\ $pe \\ $extend \\ - | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph + | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph bedtools --version > bedtools.version.txt """ } -// tuple val(name), path(bam), path(flagstat) from ch_rm_orphan_bam_bigwig.join(ch_rm_orphan_flagstat_bigwig, by: [0]) -// path sizes from ch_genome_sizes_bigwig.collect() -// bedGraphToBigWig ${prefix}.bedGraph $sizes ${prefix}.bigWig -//find * -type f -name "*.bigWig" -exec echo -e "bwa/mergedLibrary/bigwig/"{}"\\t0,0,178" \\; > ${name}.bigWig.igv.txt diff --git a/modules/nf-core/ucsc_bedgraphtobigwig.nf b/modules/nf-core/ucsc_bedgraphtobigwig.nf index b9b2a20d9..7e93d36cc 100644 --- a/modules/nf-core/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/ucsc_bedgraphtobigwig.nf @@ -20,12 +20,10 @@ process UCSC_BEDRAPHTOBIGWIG { output: tuple val(meta), path("*.bigWig"), emit: bigwig - path "*.version.txt", emit: version script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig - bedGraphToBigWig > ucsc.version.txt """ } From 9432b6654a0ee9e89497b41d7e9dbdf023a236bf Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 15:06:36 +0100 Subject: [PATCH 044/538] Add all deepTools processes --- conf/modules.config | 20 +++-- main.nf | 94 +++----------------- modules/nf-core/deeptools_computematrix.nf | 39 ++++++++ modules/nf-core/deeptools_plotfingerprint.nf | 41 +++++++++ modules/nf-core/deeptools_plotheatmap.nf | 36 ++++++++ modules/nf-core/deeptools_plotprofile.nf | 36 ++++++++ 6 files changed, 176 insertions(+), 90 deletions(-) create mode 100644 modules/nf-core/deeptools_computematrix.nf create mode 100644 modules/nf-core/deeptools_plotfingerprint.nf create mode 100644 modules/nf-core/deeptools_plotheatmap.nf create mode 100644 modules/nf-core/deeptools_plotprofile.nf diff --git a/conf/modules.config b/conf/modules.config index 6ed67a1be..195c2d964 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -98,43 +98,49 @@ params { } 'picard_collectmultiplemetrics' { args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - suffix = ".mLb.mkD.sorted" + suffix = ".mLb.clN.sorted" publish_dir = "bwa/mergedLibrary/picard_metrics" publish_results = "all" } 'preseq_lc_extrap' { args = "-verbose -bam -seed 1" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/preseq" publish_results = "all" } 'bedtools_genomecov' { args = "" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" } 'ucsc_bedgraphtobigwig' { args = "" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" } 'deeptools_computematrix' { args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" } 'deeptools_plotprofile' { args = "" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" } 'deeptools_plotheatmap' { args = "" - suffix = ".mLb.mkD" + suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/deeptools" + publish_results = "all" + } + 'deeptools_plotfingerprint' { + args = "--skipZeros" + suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" } diff --git a/main.nf b/main.nf index 79098924d..4d08988fd 100755 --- a/main.nf +++ b/main.nf @@ -167,9 +167,9 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collect include { PRESEQ_LC_EXTRAP } from './modules/nf-core/preseq_lc_extrap' include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/ucsc_bedgraphtobigwig' include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computematrix' -//include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' -//include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' -//include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' +include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' +include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' +include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' //include { MACSC2_CALLPEAK } from './modules/nf-core/macs2_callpeak' //include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/homer_annotatepeaks' //include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' @@ -421,14 +421,20 @@ workflow { // POST ALIGNMENT QC PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) - PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) + //PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) // COVERAGE TRACKS BEDTOOLS_GENOMECOV(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), params.modules['bedtools_genomecov']) UCSC_BEDRAPHTOBIGWIG(BEDTOOLS_GENOMECOV.out.bedgraph, GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig']) // COVERATE PLOTS - //DEEPTOOLS_COMPUTEMATRIX(UCSC_BEDRAPHTOBIGWIG.out.bigwig, ch_gene_bed, params.modules['deeptools_computematrix']) + DEEPTOOLS_COMPUTEMATRIX(UCSC_BEDRAPHTOBIGWIG.out.bigwig, ch_gene_bed, params.modules['deeptools_computematrix']) + DEEPTOOLS_PLOTPROFILE(DEEPTOOLS_COMPUTEMATRIX.out.matrix, params.modules['deeptools_plotprofile']) + DEEPTOOLS_PLOTHEATMAP(DEEPTOOLS_COMPUTEMATRIX.out.matrix, params.modules['deeptools_plotheatmap']) + + // Join control BAM here too to generate plots with IP and CONTROL together + params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" + DEEPTOOLS_PLOTFINGERPRINT(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), params.modules['deeptools_plotfingerprint']) // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) @@ -449,49 +455,6 @@ workflow.onComplete { Completion.email(workflow, params, summary, run_name, baseDir, multiqc_report, log) Completion.summary(workflow, params, log) } - -// /* -// * STEP 5.4: Generate gene body coverage plot with deepTools plotProfile and plotHeatmap -// */ -// process PLOTPROFILE { -// tag "$name" -// label 'process_high' -// publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotProfile", mode: params.publish_dir_mode -// -// when: -// !params.skip_plot_profile -// -// input: -// tuple val(name), path(bigwig) from ch_bigwig_plotprofile -// path bed from ch_gene_bed -// -// output: -// path '*.plotProfile.tab' into ch_plotprofile_mqc -// path '*.{gz,pdf,mat.tab}' -// -// script: -// """ -// computeMatrix scale-regions \\ -// --regionsFileName $bed \\ -// --scoreFileName $bigwig \\ -// --outFileName ${name}.computeMatrix.mat.gz \\ -// --outFileNameMatrix ${name}.computeMatrix.vals.mat.tab \\ -// --regionBodyLength 1000 \\ -// --beforeRegionStartLength 3000 \\ -// --afterRegionStartLength 3000 \\ -// --skipZeros \\ -// --smartLabels \\ -// --numberOfProcessors $task.cpus -// -// plotProfile --matrixFile ${name}.computeMatrix.mat.gz \\ -// --outFileName ${name}.plotProfile.pdf \\ -// --outFileNameData ${name}.plotProfile.tab -// -// plotHeatmap --matrixFile ${name}.computeMatrix.mat.gz \\ -// --outFileName ${name}.plotHeatmap.pdf \\ -// --outFileNameMatrix ${name}.plotHeatmap.mat.tab -// """ -// } // // /* // * STEP 5.5: Phantompeakqualtools @@ -550,41 +513,6 @@ workflow.onComplete { // ch_group_bam_counts } // // /* -// * STEP 6.1: deepTools plotFingerprint -// */ -// process PLOTFINGERPRINT { -// tag "${ip} vs ${control}" -// label 'process_high' -// publishDir "${params.outdir}/bwa/mergedLibrary/deepTools/plotFingerprint", mode: params.publish_dir_mode -// -// when: -// !params.skip_plot_fingerprint -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_plotfingerprint -// -// output: -// path '*.raw.txt' into ch_plotfingerprint_mqc -// path '*.{txt,pdf}' -// -// script: -// extend = (params.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' -// """ -// plotFingerprint \\ -// --bamfiles ${ipbam[0]} ${controlbam[0]} \\ -// --plotFile ${ip}.plotFingerprint.pdf \\ -// $extend \\ -// --labels $ip $control \\ -// --outRawCounts ${ip}.plotFingerprint.raw.txt \\ -// --outQualityMetrics ${ip}.plotFingerprint.qcmetrics.txt \\ -// --skipZeros \\ -// --JSDsample ${controlbam[0]} \\ -// --numberOfProcessors $task.cpus \\ -// --numberOfSamples $params.fingerprint_bins -// """ -// } -// -// /* // * STEP 6.2: Call peaks with MACS2 and calculate FRiP score // */ // process MACS2 { diff --git a/modules/nf-core/deeptools_computematrix.nf b/modules/nf-core/deeptools_computematrix.nf new file mode 100644 index 000000000..949c590f5 --- /dev/null +++ b/modules/nf-core/deeptools_computematrix.nf @@ -0,0 +1,39 @@ +process DEEPTOOLS_COMPUTEMATRIX { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bigwig) + path bed + val opts + + output: + tuple val(meta), path("*.mat.gz"), emit: matrix + tuple val(meta), path("*.mat.tab"), emit: table + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + """ + computeMatrix \\ + $opts.args \\ + --regionsFileName $bed \\ + --scoreFileName $bigwig \\ + --outFileName ${prefix}.computeMatrix.mat.gz \\ + --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ + --numberOfProcessors $task.cpus + + echo \$(computeMatrix --version 2>&1) > deeptools.version.txt || true + """ +} diff --git a/modules/nf-core/deeptools_plotfingerprint.nf b/modules/nf-core/deeptools_plotfingerprint.nf new file mode 100644 index 000000000..99dbe26b9 --- /dev/null +++ b/modules/nf-core/deeptools_plotfingerprint.nf @@ -0,0 +1,41 @@ +process DEEPTOOLS_PLOTFINGERPRINT { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bams), path(bais) + val opts + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.raw.txt"), emit: matrix + tuple val(meta), path("*.qcmetrics.txt"), emit: metrics + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' + """ + plotFingerprint \\ + $opts.args \\ + $extend \\ + --bamfiles ${bams.join(' ')} \\ + --plotFile ${prefix}.plotFingerprint.pdf \\ + --outRawCounts ${prefix}.plotFingerprint.raw.txt \\ + --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ + --numberOfProcessors $task.cpus + + echo \$(plotFingerprint --version 2>&1) > deeptools.version.txt || true + """ +} diff --git a/modules/nf-core/deeptools_plotheatmap.nf b/modules/nf-core/deeptools_plotheatmap.nf new file mode 100644 index 000000000..bdc3f500c --- /dev/null +++ b/modules/nf-core/deeptools_plotheatmap.nf @@ -0,0 +1,36 @@ +process DEEPTOOLS_PLOTHEATMAP { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(matrix) + val opts + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.tab"), emit: table + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + """ + plotHeatmap \\ + $opts.args \\ + --matrixFile $matrix \\ + --outFileName ${prefix}.plotHeatmap.pdf \\ + --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab + + echo \$(plotHeatmap --version 2>&1) > deeptools.version.txt || true + """ +} diff --git a/modules/nf-core/deeptools_plotprofile.nf b/modules/nf-core/deeptools_plotprofile.nf new file mode 100644 index 000000000..96db40318 --- /dev/null +++ b/modules/nf-core/deeptools_plotprofile.nf @@ -0,0 +1,36 @@ +process DEEPTOOLS_PLOTPROFILE { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(matrix) + val opts + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.tab"), emit: table + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + """ + plotProfile \\ + $opts.args \\ + --matrixFile $matrix \\ + --outFileName ${prefix}.plotProfile.pdf \\ + --outFileNameData ${prefix}.plotProfile.tab + + echo \$(plotProfile --version 2>&1) > deeptools.version.txt || true + """ +} From fd1c762b12b947653d5b4c6253af03b1fb7d3e9c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 15:45:10 +0100 Subject: [PATCH 045/538] Update modules config --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 195c2d964..edc7ae554 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -144,6 +144,12 @@ params { publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" } + 'homer_annotatepeaks_macs2' { + args = "-gid" + suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/homer" + publish_results = "all" + } 'get_software_versions' { args = "" suffix = "" From 7ffcd1c4984544f836d9ac7bf5afe0da5cbbdc64 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 16:17:43 +0100 Subject: [PATCH 046/538] Add phantompeakqualtools --- conf/modules.config | 6 ++++ main.nf | 41 +++---------------------- modules/nf-core/phantompeakqualtools.nf | 34 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 modules/nf-core/phantompeakqualtools.nf diff --git a/conf/modules.config b/conf/modules.config index edc7ae554..fcb8eae3d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -108,6 +108,12 @@ params { publish_dir = "bwa/mergedLibrary/preseq" publish_results = "all" } + 'phantompeakqualtools' { + args = "" + suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/phantompeakqualtools" + publish_results = "all" + } 'bedtools_genomecov' { args = "" suffix = ".mLb.clN" diff --git a/main.nf b/main.nf index 4d08988fd..653a00cd7 100755 --- a/main.nf +++ b/main.nf @@ -170,9 +170,9 @@ include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computemat include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' +include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' //include { MACSC2_CALLPEAK } from './modules/nf-core/macs2_callpeak' //include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/homer_annotatepeaks' -//include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' //include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/subread_featurecounts' include { MULTIQC } from './modules/nf-core/multiqc' @@ -422,6 +422,7 @@ workflow { // POST ALIGNMENT QC PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) //PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) + PHANTOMPEAKQUALTOOLS(CLEAN_BAM.out.bam, params.modules['phantompeakqualtools']) // COVERAGE TRACKS BEDTOOLS_GENOMECOV(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), params.modules['bedtools_genomecov']) @@ -436,6 +437,8 @@ workflow { params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" DEEPTOOLS_PLOTFINGERPRINT(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), params.modules['deeptools_plotfingerprint']) + + // PIPELINE TEMPLATE REPORTING //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) //OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) @@ -455,41 +458,7 @@ workflow.onComplete { Completion.email(workflow, params, summary, run_name, baseDir, multiqc_report, log) Completion.summary(workflow, params, log) } -// -// /* -// * STEP 5.5: Phantompeakqualtools -// */ -// process PHANTOMPEAKQUALTOOLS { -// tag "$name" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/phantompeakqualtools", mode: params.publish_dir_mode -// -// when: -// !params.skip_spp -// -// input: -// tuple val(name), path(bam) from ch_rm_orphan_bam_phantompeakqualtools -// path spp_correlation_header from ch_spp_correlation_header -// path spp_nsc_header from ch_spp_nsc_header -// path spp_rsc_header from ch_spp_rsc_header -// -// output: -// path '*.spp.out' into ch_spp_out_mqc -// path '*_mqc.tsv' into ch_spp_csv_mqc -// path '*.pdf' -// -// script: -// """ -// RUN_SPP=`which run_spp.R` -// Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="${bam[0]}" -savp="${name}.spp.pdf" -savd="${name}.spp.Rdata" -out="${name}.spp.out" -p=$task.cpus -// cp $spp_correlation_header ${name}_spp_correlation_mqc.tsv -// Rscript -e "load('${name}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${name}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" -// -// awk -v OFS='\t' '{print "${name}", \$9}' ${name}.spp.out | cat $spp_nsc_header - > ${name}_spp_nsc_mqc.tsv -// awk -v OFS='\t' '{print "${name}", \$10}' ${name}.spp.out | cat $spp_rsc_header - > ${name}_spp_rsc_mqc.tsv -// """ -// } -// + // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ diff --git a/modules/nf-core/phantompeakqualtools.nf b/modules/nf-core/phantompeakqualtools.nf new file mode 100644 index 000000000..95b95ea97 --- /dev/null +++ b/modules/nf-core/phantompeakqualtools.nf @@ -0,0 +1,34 @@ +process PHANTOMPEAKQUALTOOLS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" + //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam) + val opts + + output: + tuple val(meta), path("*.out"), emit: spp + tuple val(meta), path("*.pdf"), emit: pdf + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + """ + RUN_SPP=`which run_spp.R` + Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript -e "load('${prefix}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" + + touch phantompeakqualtools.version.txt + """ +} From 7385cc73042723d07126fb9aef84d60b1e6d4130 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 22 Jul 2020 16:26:18 +0100 Subject: [PATCH 047/538] Add last few nf-core/modules --- main.nf | 20 ++++++------ modules/nf-core/homer_annotatepeaks.nf | 40 ++++++++++++++++++++++++ modules/nf-core/macs2_callpeak.nf | 3 ++ modules/nf-core/multiqc.nf | 1 + modules/nf-core/subread_featurecounts.nf | 3 ++ 5 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 modules/nf-core/homer_annotatepeaks.nf create mode 100644 modules/nf-core/macs2_callpeak.nf create mode 100644 modules/nf-core/subread_featurecounts.nf diff --git a/main.nf b/main.nf index 653a00cd7..f2e3d0b0a 100755 --- a/main.nf +++ b/main.nf @@ -437,17 +437,15 @@ workflow { params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" DEEPTOOLS_PLOTFINGERPRINT(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), params.modules['deeptools_plotfingerprint']) - - - // PIPELINE TEMPLATE REPORTING - //GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) - //OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) - - // // MULTIQC( - // // summary, - // // FASTQC.out, - // // ch_multiqc_config - // // ) + // PIPELINE REPORTING + GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) + OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) + + // MULTIQC( + // summary, + // FASTQC.out, + // ch_multiqc_config + // ) } /* diff --git a/modules/nf-core/homer_annotatepeaks.nf b/modules/nf-core/homer_annotatepeaks.nf new file mode 100644 index 000000000..56189da48 --- /dev/null +++ b/modules/nf-core/homer_annotatepeaks.nf @@ -0,0 +1,40 @@ +process HOMER_ANNOTATEPEAKS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" + //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" + + conda (params.conda ? "${moduleDir}/environment.yml" : null) + + input: + tuple val(meta), path(bed) + path fasta + path gtf + val opts + + output: + tuple val(meta), path("*.txt"), emit: txt + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + + """ + annotatePeaks.pl \\ + $opts.args \\ + $bed \\ + $fasta \\ + -gtf $gtf \\ + -cpu $task.cpus \\ + > ${prefix}.annotatePeaks.txt + + touch homer.version.txt + """ +} diff --git a/modules/nf-core/macs2_callpeak.nf b/modules/nf-core/macs2_callpeak.nf new file mode 100644 index 000000000..f65147b6f --- /dev/null +++ b/modules/nf-core/macs2_callpeak.nf @@ -0,0 +1,3 @@ +container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" +//container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" +//echo \$(macs2 --version 2>&1) > macs2.version.txt diff --git a/modules/nf-core/multiqc.nf b/modules/nf-core/multiqc.nf index 9181580d1..08da39c29 100755 --- a/modules/nf-core/multiqc.nf +++ b/modules/nf-core/multiqc.nf @@ -52,5 +52,6 @@ process MULTIQC { // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time """ multiqc -f $rtitle $rfilename $custom_config_file . + multiqc --version > multiqc.version.txt """ } diff --git a/modules/nf-core/subread_featurecounts.nf b/modules/nf-core/subread_featurecounts.nf new file mode 100644 index 000000000..a27725fa1 --- /dev/null +++ b/modules/nf-core/subread_featurecounts.nf @@ -0,0 +1,3 @@ +container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" +//container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" +//echo \$(featureCounts -v 2>&1) > featurecounts.version.txt From 47d7ceabb29e7df0d41fa6caeba06833d767c852 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 23 Jul 2020 11:58:11 +0100 Subject: [PATCH 048/538] Restructure modules --- modules/nf-core/macs2_callpeak.nf | 3 - modules/nf-core/{ => software}/bwa_index.nf | 0 modules/nf-core/{ => software}/bwa_mem.nf | 0 .../{ => software}/deeptools_computematrix.nf | 0 .../deeptools_plotfingerprint.nf | 0 .../{ => software}/deeptools_plotheatmap.nf | 0 .../{ => software}/deeptools_plotprofile.nf | 0 modules/nf-core/{ => software}/fastqc.nf | 0 .../{ => software}/homer_annotatepeaks.nf | 0 modules/nf-core/software/macs2_callpeak.nf | 61 +++++++++++++++++++ modules/nf-core/{ => software}/multiqc.nf | 0 .../{ => software}/phantompeakqualtools.nf | 0 .../picard_collectmultiplemetrics.nf | 0 .../{ => software}/picard_markduplicates.nf | 0 .../{ => software}/picard_mergesamfiles.nf | 0 .../{ => software}/preseq_lc_extrap.nf | 0 .../{ => software}/samtools_flagstat.nf | 0 .../{ => software}/samtools_idxstats.nf | 0 .../nf-core/{ => software}/samtools_index.nf | 0 .../nf-core/{ => software}/samtools_sort.nf | 0 .../nf-core/{ => software}/samtools_stats.nf | 0 .../nf-core/software/subread_featurecounts.nf | 38 ++++++++++++ modules/nf-core/{ => software}/trim_galore.nf | 0 .../{ => software}/ucsc_bedgraphtobigwig.nf | 0 modules/nf-core/subread_featurecounts.nf | 3 - 25 files changed, 99 insertions(+), 6 deletions(-) delete mode 100644 modules/nf-core/macs2_callpeak.nf rename modules/nf-core/{ => software}/bwa_index.nf (100%) rename modules/nf-core/{ => software}/bwa_mem.nf (100%) rename modules/nf-core/{ => software}/deeptools_computematrix.nf (100%) rename modules/nf-core/{ => software}/deeptools_plotfingerprint.nf (100%) rename modules/nf-core/{ => software}/deeptools_plotheatmap.nf (100%) rename modules/nf-core/{ => software}/deeptools_plotprofile.nf (100%) rename modules/nf-core/{ => software}/fastqc.nf (100%) rename modules/nf-core/{ => software}/homer_annotatepeaks.nf (100%) create mode 100644 modules/nf-core/software/macs2_callpeak.nf rename modules/nf-core/{ => software}/multiqc.nf (100%) rename modules/nf-core/{ => software}/phantompeakqualtools.nf (100%) rename modules/nf-core/{ => software}/picard_collectmultiplemetrics.nf (100%) rename modules/nf-core/{ => software}/picard_markduplicates.nf (100%) rename modules/nf-core/{ => software}/picard_mergesamfiles.nf (100%) rename modules/nf-core/{ => software}/preseq_lc_extrap.nf (100%) rename modules/nf-core/{ => software}/samtools_flagstat.nf (100%) rename modules/nf-core/{ => software}/samtools_idxstats.nf (100%) rename modules/nf-core/{ => software}/samtools_index.nf (100%) rename modules/nf-core/{ => software}/samtools_sort.nf (100%) rename modules/nf-core/{ => software}/samtools_stats.nf (100%) create mode 100644 modules/nf-core/software/subread_featurecounts.nf rename modules/nf-core/{ => software}/trim_galore.nf (100%) rename modules/nf-core/{ => software}/ucsc_bedgraphtobigwig.nf (100%) delete mode 100644 modules/nf-core/subread_featurecounts.nf diff --git a/modules/nf-core/macs2_callpeak.nf b/modules/nf-core/macs2_callpeak.nf deleted file mode 100644 index f65147b6f..000000000 --- a/modules/nf-core/macs2_callpeak.nf +++ /dev/null @@ -1,3 +0,0 @@ -container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" -//container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" -//echo \$(macs2 --version 2>&1) > macs2.version.txt diff --git a/modules/nf-core/bwa_index.nf b/modules/nf-core/software/bwa_index.nf similarity index 100% rename from modules/nf-core/bwa_index.nf rename to modules/nf-core/software/bwa_index.nf diff --git a/modules/nf-core/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf similarity index 100% rename from modules/nf-core/bwa_mem.nf rename to modules/nf-core/software/bwa_mem.nf diff --git a/modules/nf-core/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf similarity index 100% rename from modules/nf-core/deeptools_computematrix.nf rename to modules/nf-core/software/deeptools_computematrix.nf diff --git a/modules/nf-core/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf similarity index 100% rename from modules/nf-core/deeptools_plotfingerprint.nf rename to modules/nf-core/software/deeptools_plotfingerprint.nf diff --git a/modules/nf-core/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf similarity index 100% rename from modules/nf-core/deeptools_plotheatmap.nf rename to modules/nf-core/software/deeptools_plotheatmap.nf diff --git a/modules/nf-core/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf similarity index 100% rename from modules/nf-core/deeptools_plotprofile.nf rename to modules/nf-core/software/deeptools_plotprofile.nf diff --git a/modules/nf-core/fastqc.nf b/modules/nf-core/software/fastqc.nf similarity index 100% rename from modules/nf-core/fastqc.nf rename to modules/nf-core/software/fastqc.nf diff --git a/modules/nf-core/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf similarity index 100% rename from modules/nf-core/homer_annotatepeaks.nf rename to modules/nf-core/software/homer_annotatepeaks.nf diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf new file mode 100644 index 000000000..fa6e16d3e --- /dev/null +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -0,0 +1,61 @@ +container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" +//container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" +//echo \$(macs2 --version 2>&1) > macs2.version.txt + + +// /* +// * STEP 6.2: Call peaks with MACS2 and calculate FRiP score +// */ +// process MACS2 { +// tag "${ip} vs ${control}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.tsv')) "qc/$filename" +// else if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_macs +// path peak_count_header from ch_peak_count_header +// path frip_score_header from ch_frip_score_header +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path("*.$PEAK_TYPE") into ch_macs_homer, +// ch_macs_qc, +// ch_macs_consensus +// path '*igv.txt' into ch_macs_igv +// path '*_mqc.tsv' into ch_macs_mqc +// path '*.{bed,xls,gappedPeak,bdg}' +// +// script: +// broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" +// format = params.single_end ? 'BAM' : 'BAMPE' +// pileup = params.save_macs_pileup ? '-B --SPMR' : '' +// fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' +// pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' +// """ +// macs2 callpeak \\ +// -t ${ipbam[0]} \\ +// -c ${controlbam[0]} \\ +// $broad \\ +// -f $format \\ +// -g $params.macs_gsize \\ +// -n $ip \\ +// $pileup \\ +// $fdr \\ +// $pvalue \\ +// --keep-dup all +// +// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv +// +// READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') +// grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv +// +// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt +// """ +// } diff --git a/modules/nf-core/multiqc.nf b/modules/nf-core/software/multiqc.nf similarity index 100% rename from modules/nf-core/multiqc.nf rename to modules/nf-core/software/multiqc.nf diff --git a/modules/nf-core/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf similarity index 100% rename from modules/nf-core/phantompeakqualtools.nf rename to modules/nf-core/software/phantompeakqualtools.nf diff --git a/modules/nf-core/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf similarity index 100% rename from modules/nf-core/picard_collectmultiplemetrics.nf rename to modules/nf-core/software/picard_collectmultiplemetrics.nf diff --git a/modules/nf-core/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf similarity index 100% rename from modules/nf-core/picard_markduplicates.nf rename to modules/nf-core/software/picard_markduplicates.nf diff --git a/modules/nf-core/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf similarity index 100% rename from modules/nf-core/picard_mergesamfiles.nf rename to modules/nf-core/software/picard_mergesamfiles.nf diff --git a/modules/nf-core/preseq_lc_extrap.nf b/modules/nf-core/software/preseq_lc_extrap.nf similarity index 100% rename from modules/nf-core/preseq_lc_extrap.nf rename to modules/nf-core/software/preseq_lc_extrap.nf diff --git a/modules/nf-core/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf similarity index 100% rename from modules/nf-core/samtools_flagstat.nf rename to modules/nf-core/software/samtools_flagstat.nf diff --git a/modules/nf-core/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf similarity index 100% rename from modules/nf-core/samtools_idxstats.nf rename to modules/nf-core/software/samtools_idxstats.nf diff --git a/modules/nf-core/samtools_index.nf b/modules/nf-core/software/samtools_index.nf similarity index 100% rename from modules/nf-core/samtools_index.nf rename to modules/nf-core/software/samtools_index.nf diff --git a/modules/nf-core/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf similarity index 100% rename from modules/nf-core/samtools_sort.nf rename to modules/nf-core/software/samtools_sort.nf diff --git a/modules/nf-core/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf similarity index 100% rename from modules/nf-core/samtools_stats.nf rename to modules/nf-core/software/samtools_stats.nf diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf new file mode 100644 index 000000000..54771185a --- /dev/null +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -0,0 +1,38 @@ +container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" +//container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" +//echo \$(featureCounts -v 2>&1) > featurecounts.version.txt + +// /* +// * STEP 7.3: Count reads in consensus peaks with featureCounts +// */ +// process CONSENSUS_PEAKS_COUNTS { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bams), path(saf) from ch_group_bam_counts +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*featureCounts.txt') into ch_macs_consensus_counts +// path '*featureCounts.txt.summary' into ch_macs_consensus_counts_mqc +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() +// pe_params = params.single_end ? '' : '-p --donotsort' +// """ +// featureCounts \\ +// -F SAF \\ +// -O \\ +// --fracOverlap 0.2 \\ +// -T $task.cpus \\ +// $pe_params \\ +// -a $saf \\ +// -o ${prefix}.featureCounts.txt \\ +// ${bam_files.join(' ')} +// """ +// } diff --git a/modules/nf-core/trim_galore.nf b/modules/nf-core/software/trim_galore.nf similarity index 100% rename from modules/nf-core/trim_galore.nf rename to modules/nf-core/software/trim_galore.nf diff --git a/modules/nf-core/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf similarity index 100% rename from modules/nf-core/ucsc_bedgraphtobigwig.nf rename to modules/nf-core/software/ucsc_bedgraphtobigwig.nf diff --git a/modules/nf-core/subread_featurecounts.nf b/modules/nf-core/subread_featurecounts.nf deleted file mode 100644 index a27725fa1..000000000 --- a/modules/nf-core/subread_featurecounts.nf +++ /dev/null @@ -1,3 +0,0 @@ -container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" -//container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" -//echo \$(featureCounts -v 2>&1) > featurecounts.version.txt From 7e639f351aae4c616a5b292e20cb9025e48bd3da Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 23 Jul 2020 12:01:23 +0100 Subject: [PATCH 049/538] Restructure local modules --- .../local/{ => process}/bedtools_genomecov.nf | 0 modules/local/process/calc_frip.nf | 0 .../local/{ => process}/check_samplesheet.nf | 0 modules/local/process/featurecounts_deseq2.nf | 55 +++++++++++++++++++ modules/local/{ => process}/filter_bam.nf | 0 .../local/{ => process}/get_chrom_sizes.nf | 0 .../{ => process}/get_software_versions.nf | 0 modules/local/{ => process}/gtf2bed.nf | 0 modules/local/process/igv.nf | 25 +++++++++ modules/local/process/macs2_consensus.nf | 50 +++++++++++++++++ .../local/{ => process}/make_genome_filter.nf | 0 .../{ => process}/output_documentation.nf | 0 .../local/process/plot_homer_annotatepeaks.nf | 36 ++++++++++++ modules/local/process/plot_macs2_qc.nf | 36 ++++++++++++ .../local/{ => process}/remove_bam_orphans.nf | 0 15 files changed, 202 insertions(+) rename modules/local/{ => process}/bedtools_genomecov.nf (100%) create mode 100644 modules/local/process/calc_frip.nf rename modules/local/{ => process}/check_samplesheet.nf (100%) create mode 100644 modules/local/process/featurecounts_deseq2.nf rename modules/local/{ => process}/filter_bam.nf (100%) rename modules/local/{ => process}/get_chrom_sizes.nf (100%) rename modules/local/{ => process}/get_software_versions.nf (100%) rename modules/local/{ => process}/gtf2bed.nf (100%) create mode 100644 modules/local/process/igv.nf create mode 100644 modules/local/process/macs2_consensus.nf rename modules/local/{ => process}/make_genome_filter.nf (100%) rename modules/local/{ => process}/output_documentation.nf (100%) create mode 100644 modules/local/process/plot_homer_annotatepeaks.nf create mode 100644 modules/local/process/plot_macs2_qc.nf rename modules/local/{ => process}/remove_bam_orphans.nf (100%) diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf similarity index 100% rename from modules/local/bedtools_genomecov.nf rename to modules/local/process/bedtools_genomecov.nf diff --git a/modules/local/process/calc_frip.nf b/modules/local/process/calc_frip.nf new file mode 100644 index 000000000..e69de29bb diff --git a/modules/local/check_samplesheet.nf b/modules/local/process/check_samplesheet.nf similarity index 100% rename from modules/local/check_samplesheet.nf rename to modules/local/process/check_samplesheet.nf diff --git a/modules/local/process/featurecounts_deseq2.nf b/modules/local/process/featurecounts_deseq2.nf new file mode 100644 index 000000000..fb1e28240 --- /dev/null +++ b/modules/local/process/featurecounts_deseq2.nf @@ -0,0 +1,55 @@ + + +// /* +// * STEP 7.4: Differential analysis with DESeq2 +// */ +// process CONSENSUS_PEAKS_DESEQ2 { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts +// path deseq2_pca_header from ch_deseq2_pca_header +// path deseq2_clustering_header from ch_deseq2_clustering_header +// +// output: +// path '*.tsv' into ch_macs_consensus_deseq_mqc +// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv +// path '*.{RData,results.txt,pdf,log}' +// path 'sizeFactors' +// path '*vs*/*.{pdf,txt}' +// path '*vs*/*.bed' +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' +// vst = params.deseq2_vst ? '--vst TRUE' : '' +// """ +// featurecounts_deseq2.r \\ +// --featurecount_file $counts \\ +// --bam_suffix '$bam_ext' \\ +// --outdir ./ \\ +// --outprefix $prefix \\ +// --outsuffix '' \\ +// --cores $task.cpus \\ +// $vst +// +// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv +// +// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv +// +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt +// """ +// } diff --git a/modules/local/filter_bam.nf b/modules/local/process/filter_bam.nf similarity index 100% rename from modules/local/filter_bam.nf rename to modules/local/process/filter_bam.nf diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf similarity index 100% rename from modules/local/get_chrom_sizes.nf rename to modules/local/process/get_chrom_sizes.nf diff --git a/modules/local/get_software_versions.nf b/modules/local/process/get_software_versions.nf similarity index 100% rename from modules/local/get_software_versions.nf rename to modules/local/process/get_software_versions.nf diff --git a/modules/local/gtf2bed.nf b/modules/local/process/gtf2bed.nf similarity index 100% rename from modules/local/gtf2bed.nf rename to modules/local/process/gtf2bed.nf diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf new file mode 100644 index 000000000..cc7a9c228 --- /dev/null +++ b/modules/local/process/igv.nf @@ -0,0 +1,25 @@ +// /* +// * STEP 8: Create IGV session file +// */ +// process IGV { +// publishDir "${params.outdir}/igv/${PEAK_TYPE}", mode: params.publish_dir_mode +// +// when: +// !params.skip_igv +// +// input: +// path fasta from ch_fasta +// path bigwigs from ch_bigwig_igv.collect().ifEmpty([]) +// path peaks from ch_macs_igv.collect().ifEmpty([]) +// path consensus_peaks from ch_macs_consensus_igv.collect().ifEmpty([]) +// path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) +// +// output: +// path '*.{txt,xml}' +// +// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ +// """ +// cat *.txt > igv_files.txt +// igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' +// """ +// } diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf new file mode 100644 index 000000000..b36d6a197 --- /dev/null +++ b/modules/local/process/macs2_consensus.nf @@ -0,0 +1,50 @@ +// /* +// * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection +// */ +// process CONSENSUS_PEAKS { +// tag "${antibody}" +// label 'process_long' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(peaks) from ch_macs_consensus +// +// output: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*.bed') into ch_macs_consensus_bed +// tuple val(antibody), path('*.saf') into ch_macs_consensus_saf +// path '*.boolean.txt' into ch_macs_consensus_bool +// path '*igv.txt' into ch_macs_consensus_igv +// path '*.intersect.{txt,plot.pdf}' +// +// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ +// prefix = "${antibody}.consensus_peaks" +// mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') +// collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') +// expandparam = params.narrow_peak ? '--is_narrow_peak' : '' +// """ +// sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ +// | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt +// +// macs2_merged_expand.py ${prefix}.txt \\ +// ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ +// ${prefix}.boolean.txt \\ +// --min_replicates $params.min_reps_consensus \\ +// $expandparam +// +// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed +// +// echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf +// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf +// +// plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf +// +// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt +// """ +// } diff --git a/modules/local/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf similarity index 100% rename from modules/local/make_genome_filter.nf rename to modules/local/process/make_genome_filter.nf diff --git a/modules/local/output_documentation.nf b/modules/local/process/output_documentation.nf similarity index 100% rename from modules/local/output_documentation.nf rename to modules/local/process/output_documentation.nf diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf new file mode 100644 index 000000000..477c84845 --- /dev/null +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -0,0 +1,36 @@ +// /* +// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation +// */ +// process MACS2_QC { +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc +// +// input: +// path peaks from ch_macs_qc.collect{ it[-1] } +// path annos from ch_macs_annotate.collect() +// path peak_annotation_header from ch_peak_annotation_header +// +// output: +// path '*.tsv' into ch_macs_qc_mqc +// path '*.{txt,pdf}' +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// """ +// plot_macs_qc.r \\ +// -i ${peaks.join(',')} \\ +// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ +// -o ./ \\ +// -p macs_peak +// +// plot_homer_annotatepeaks.r \\ +// -i ${annos.join(',')} \\ +// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ +// -o ./ \\ +// -p macs_annotatePeaks +// +// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv +// """ +// } diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf new file mode 100644 index 000000000..477c84845 --- /dev/null +++ b/modules/local/process/plot_macs2_qc.nf @@ -0,0 +1,36 @@ +// /* +// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation +// */ +// process MACS2_QC { +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode +// +// when: +// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc +// +// input: +// path peaks from ch_macs_qc.collect{ it[-1] } +// path annos from ch_macs_annotate.collect() +// path peak_annotation_header from ch_peak_annotation_header +// +// output: +// path '*.tsv' into ch_macs_qc_mqc +// path '*.{txt,pdf}' +// +// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ +// """ +// plot_macs_qc.r \\ +// -i ${peaks.join(',')} \\ +// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ +// -o ./ \\ +// -p macs_peak +// +// plot_homer_annotatepeaks.r \\ +// -i ${annos.join(',')} \\ +// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ +// -o ./ \\ +// -p macs_annotatePeaks +// +// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv +// """ +// } diff --git a/modules/local/remove_bam_orphans.nf b/modules/local/process/remove_bam_orphans.nf similarity index 100% rename from modules/local/remove_bam_orphans.nf rename to modules/local/process/remove_bam_orphans.nf From 7bd0e6b0e619754845e2f65bb4641671bba42bdf Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 09:21:38 +0100 Subject: [PATCH 050/538] Add subworkflow dirs --- modules/local/subworkflow/check_input.nf | 0 modules/nf-core/subworkflow/preprocess.nf | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 modules/local/subworkflow/check_input.nf create mode 100644 modules/nf-core/subworkflow/preprocess.nf diff --git a/modules/local/subworkflow/check_input.nf b/modules/local/subworkflow/check_input.nf new file mode 100644 index 000000000..e69de29bb diff --git a/modules/nf-core/subworkflow/preprocess.nf b/modules/nf-core/subworkflow/preprocess.nf new file mode 100644 index 000000000..e69de29bb From 61cf6f5bfce3b3c7705572d742582adc04cde854 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 11:58:22 +0100 Subject: [PATCH 051/538] Reorganise everything --- conf/modules.config | 4 +- main.nf | 483 +++++++----------- modules/local/subworkflow/check_input.nf | 32 ++ modules/local/subworkflow/clean_bam.nf | 31 ++ ...preseq_lc_extrap.nf => preseq_lcextrap.nf} | 2 +- .../{trim_galore.nf => trimgalore.nf} | 2 +- modules/nf-core/subworkflow/bam_stats.nf | 24 + modules/nf-core/subworkflow/map_reads.nf | 28 + .../nf-core/subworkflow/mark_duplicates.nf | 29 ++ modules/nf-core/subworkflow/preprocess.nf | 0 modules/nf-core/subworkflow/qc_trim.nf | 49 ++ modules/nf-core/subworkflow/sort_bam.nf | 26 + 12 files changed, 417 insertions(+), 293 deletions(-) create mode 100644 modules/local/subworkflow/clean_bam.nf rename modules/nf-core/software/{preseq_lc_extrap.nf => preseq_lcextrap.nf} (94%) rename modules/nf-core/software/{trim_galore.nf => trimgalore.nf} (96%) create mode 100644 modules/nf-core/subworkflow/bam_stats.nf create mode 100644 modules/nf-core/subworkflow/map_reads.nf create mode 100644 modules/nf-core/subworkflow/mark_duplicates.nf delete mode 100644 modules/nf-core/subworkflow/preprocess.nf create mode 100644 modules/nf-core/subworkflow/qc_trim.nf create mode 100644 modules/nf-core/subworkflow/sort_bam.nf diff --git a/conf/modules.config b/conf/modules.config index fcb8eae3d..491aae56d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,7 +17,7 @@ params { publish_dir = "fastqc" publish_results = "all" } - 'trim_galore' { + 'trimgalore' { args = "--fastqc" suffix = "" publish_dir = "trim_galore" @@ -102,7 +102,7 @@ params { publish_dir = "bwa/mergedLibrary/picard_metrics" publish_results = "all" } - 'preseq_lc_extrap' { + 'preseq_lcextrap' { args = "-verbose -bam -seed 1" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/preseq" diff --git a/main.nf b/main.nf index f2e3d0b0a..bff23dbe9 100755 --- a/main.nf +++ b/main.nf @@ -134,312 +134,212 @@ log.info Headers.nf_core(workflow, params.monochrome_logs) log.info summary.collect { k,v -> "${k.padRight(22)}: $v" }.join("\n") log.info "-\033[2m----------------------------------------------------\033[0m-" -/* - * Include local pipeline modules - */ -include { CHECK_SAMPLESHEET; - get_samplesheet_paths; - get_samplesheet_design } from './modules/local/check_samplesheet' -include { GTF2BED } from './modules/local/gtf2bed' -include { GET_CHROM_SIZES } from './modules/local/get_chrom_sizes' -include { MAKE_GENOME_FILTER } from './modules/local/make_genome_filter' -include { FILTER_BAM } from './modules/local/filter_bam' -include { REMOVE_BAM_ORPHANS } from './modules/local/remove_bam_orphans' -include { BEDTOOLS_GENOMECOV } from './modules/local/bedtools_genomecov' -include { OUTPUT_DOCUMENTATION } from './modules/local/output_documentation' -include { GET_SOFTWARE_VERSIONS } from './modules/local/get_software_versions' - -/* - * Include nf-core modules - */ -include { FASTQC } from './modules/nf-core/fastqc' -include { TRIM_GALORE } from './modules/nf-core/trim_galore' -include { BWA_INDEX } from './modules/nf-core/bwa_index' -include { BWA_MEM } from './modules/nf-core/bwa_mem' -include { SAMTOOLS_SORT } from './modules/nf-core/samtools_sort' -include { SAMTOOLS_INDEX } from './modules/nf-core/samtools_index' -include { SAMTOOLS_STATS } from './modules/nf-core/samtools_stats' -include { SAMTOOLS_IDXSTATS } from './modules/nf-core/samtools_idxstats' -include { SAMTOOLS_FLAGSTAT } from './modules/nf-core/samtools_flagstat' -include { PICARD_MERGESAMFILES } from './modules/nf-core/picard_mergesamfiles' -include { PICARD_MARKDUPLICATES } from './modules/nf-core/picard_markduplicates' -include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/picard_collectmultiplemetrics' -include { PRESEQ_LC_EXTRAP } from './modules/nf-core/preseq_lc_extrap' -include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/ucsc_bedgraphtobigwig' -include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/deeptools_computematrix' -include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/deeptools_plotprofile' -include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/deeptools_plotheatmap' -include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/deeptools_plotfingerprint' -include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/phantompeakqualtools' -//include { MACSC2_CALLPEAK } from './modules/nf-core/macs2_callpeak' -//include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/homer_annotatepeaks' -//include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/subread_featurecounts' -include { MULTIQC } from './modules/nf-core/multiqc' - -/* - * Check input samplesheet and get read channels - */ -workflow CHECK_INPUT { - take: - ch_input // file: /path/to/samplesheet.csv - seq_center // string: sequencing center for read group - check_samplesheet_opts // map: options for TrimGalore! module - - main: - CHECK_SAMPLESHEET (ch_input, check_samplesheet_opts) - .reads - .splitCsv(header:true, sep:',') - .map { get_samplesheet_paths(it, params.single_end, seq_center) } - .set { ch_reads } - - CHECK_SAMPLESHEET - .out - .controls - .splitCsv(header:true, sep:',') - .map { get_samplesheet_design(it, params.single_end) } - .set { ch_design } - - emit: - reads = ch_reads // channel: [ val(meta), [ reads ] ] - design = ch_design // channel: [ val(meta), [ reads ] ] -} - -/* - * Read QC and trimming - */ -workflow QC_TRIM { - take: - ch_reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - fastqc_opts // map: options for FastQC module - trim_galore_opts // map: options for TrimGalore! module - - main: - fastqc_html = Channel.empty() - fastqc_zip = Channel.empty() - fastqc_version = Channel.empty() - if (!skip_fastqc) { - FASTQC(ch_reads, fastqc_opts).html.set { fastqc_html } - fastqc_zip = FASTQC.out.zip - fastqc_version = FASTQC.out.version - } - - ch_trim_reads = ch_reads - trim_html = Channel.empty() - trim_zip = Channel.empty() - trim_log = Channel.empty() - trim_galore_version = Channel.empty() - if (!skip_trimming) { - TRIM_GALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } - trim_html = TRIM_GALORE.out.html - trim_zip = TRIM_GALORE.out.zip - trim_log = TRIM_GALORE.out.log - trim_galore_version = TRIM_GALORE.out.version - } - - emit: - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] - fastqc_version // path: *.version.txt - - reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] - trim_galore_version // path: *.version.txt -} +//////////////////////////////////////////////////// +/* -- IMPORT LOCAL MODULES/SUBWORKFLOWS -- */ +//////////////////////////////////////////////////// -/* - * Run SAMtools stats, flagstat and idxstats - */ -workflow BAM_STATS { - take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - samtools_opts // map: options for SAMTools modules - - main: - SAMTOOLS_STATS(ch_bam_bai, samtools_opts) - SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_opts) - SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_opts) - - emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_version = SAMTOOLS_STATS.out.version // path: *.version.txt -} +include { GTF2BED } from './modules/local/process/gtf2bed' +include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' +include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' +include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' +include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' +include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' -/* - * Sort, index BAM file and run samtools stats, flagstat and idxstats - */ -workflow SORT_BAM { - take: - ch_bam // channel: [ val(meta), [ bam ] ] - samtools_opts // map: options for SAMTools modules - - main: - SAMTOOLS_SORT(ch_bam, samtools_opts) - SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_opts) - BAM_STATS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) - - emit: - bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt -} +include { CHECK_INPUT } from './modules/local/subworkflow/check_input' +include { CLEAN_BAM } from './modules/local/subworkflow/clean_bam' -/* - * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats - */ -workflow ALIGN { - take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index - ch_fasta // path: /path/to/genome.fasta - bwa_mem_opts // map: options for BWA MEM module - samtools_opts // map: options for SAMTools modules - - main: - BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) - SORT_BAM(BWA_MEM.out.bam, samtools_opts) - - emit: - bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] - bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] - stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bwa_version = BWA_MEM.out.version // path: *.version.txt - samtools_version = SORT_BAM.out.samtools_version // path: *.version.txt -} +//////////////////////////////////////////////////// +/* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ +//////////////////////////////////////////////////// -/* - * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats - */ -workflow MARKDUPLICATES { - take: - ch_bam // channel: [ val(meta), [ bam ] ] - markduplicates_opts // map: options for picard MarkDuplicates module - samtools_opts // map: options for SAMTools modules - - main: - PICARD_MARKDUPLICATES(ch_bam, markduplicates_opts) - SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_opts) - BAM_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) - - emit: - bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] - metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt - samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt -} +include { BWA_INDEX } from './modules/nf-core/software/bwa_index' +include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard_mergesamfiles' +include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard_collectmultiplemetrics' +include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq_lcextrap' +include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc_bedgraphtobigwig' +include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools_computematrix' +include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools_plotprofile' +include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools_plotheatmap' +include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools_plotfingerprint' +include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools' +//include { MACSC2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' +//include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/software/homer_annotatepeaks' +//include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' +include { MULTIQC } from './modules/nf-core/software/multiqc' + +include { QC_TRIM } from './modules/nf-core/subworkflow/qc_trim' +include { BAM_STATS } from './modules/nf-core/subworkflow/bam_stats' +include { SORT_BAM } from './modules/nf-core/subworkflow/sort_bam' +include { MAP_READS } from './modules/nf-core/subworkflow/map_reads' +include { MARK_DUPLICATES } from './modules/nf-core/subworkflow/mark_duplicates' -/* - * Filter BAM file - */ -workflow CLEAN_BAM { - take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - config // file: BAMtools filter JSON config file - filter_bam_opts // map: options for filter_bam module - rm_bam_orphans_opts // map: options for remove_bam_orphans module - samtools_opts // map: options for SAMTools modules - - main: - FILTER_BAM(ch_bam_bai, ch_bed, config, filter_bam_opts) - REMOVE_BAM_ORPHANS(FILTER_BAM.out.bam, rm_bam_orphans_opts) - SORT_BAM(REMOVE_BAM_ORPHANS.out.bam, samtools_opts) - - emit: - name_bam = REMOVE_BAM_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] - bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] - bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] - stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bamtools_version = FILTER_BAM.out.version // path: *.version.txt -} +//////////////////////////////////////////////////// +/* -- RUN MAIN WORKFLOW -- */ +//////////////////////////////////////////////////// workflow { - // READ IN SAMPLESHEET, VALIDATE AND STAGE INPUT FILES - CHECK_INPUT(ch_input, params.seq_center, params.modules['check_samplesheet']) - - // PREPARE GENOME FILES - ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX(ch_fasta, params.modules['bwa_index']).index - if (makeBED) { GTF2BED(ch_gtf, params.modules['gtf2bed']).set { ch_gene_bed } } - MAKE_GENOME_FILTER(GET_CHROM_SIZES(ch_fasta, params.modules['get_chrom_sizes']).sizes, - ch_blacklist.ifEmpty([]), - params.modules['make_genome_filter']) - - // READ QC & TRIMMING + /* + * Read in samplesheet, validate and stage input files + */ + CHECK_INPUT ( + ch_input, + params.seq_center, + params.modules['check_samplesheet'] + ) + + /* + * Prepare genome files + */ + ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index + + if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } + + MAKE_GENOME_FILTER ( + GET_CHROM_SIZES ( + ch_fasta, + params.modules['get_chrom_sizes'] + ).sizes, + ch_blacklist.ifEmpty([]), + params.modules['make_genome_filter'] + ) + + /* + * Read QC & trimming + */ nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - params.modules['trim_galore'].args += nextseq - QC_TRIM(CHECK_INPUT.out.reads, - params.skip_fastqc, - params.skip_trimming, - params.modules['fastqc'], - params.modules['trim_galore']) - - // MAP READS & BAM QC + params.modules['trimgalore'].args += nextseq + QC_TRIM ( + CHECK_INPUT.out.reads, + params.skip_fastqc, + params.skip_trimming, + params.modules['fastqc'], + params.modules['trimgalore'] + ) + + /* + * Map reads & BAM QC + */ score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' params.modules['bwa_mem'].args += score - ALIGN(QC_TRIM.out.reads, ch_index, ch_fasta, params.modules['bwa_mem'], params.modules['samtools_sort_lib']) - - // MERGE RESEQUENCED BAM FILES - ALIGN + MAP_READS ( + QC_TRIM.out.reads, + ch_index, + ch_fasta, + params.modules['bwa_mem'], + params.modules['samtools_sort_lib'] + ) + + /* + * Merge resequenced BAM files + */ + MAP_READS .out .bam - .map { meta, bam -> - fmeta = meta.findAll { it.key != 'read_group' } - fmeta.id = fmeta.id.split('_')[0..-2].join('_') - [ fmeta, bam ] } + .map { + meta, bam -> + fmeta = meta.findAll { it.key != 'read_group' } + fmeta.id = fmeta.id.split('_')[0..-2].join('_') + [ fmeta, bam ] } .groupTuple(by: [0]) .map { it -> [ it[0], it[1].flatten() ] } .set { ch_sort_bam } - PICARD_MERGESAMFILES(ch_sort_bam, params.modules['picard_mergesamfiles']) - MARKDUPLICATES(PICARD_MERGESAMFILES.out.bam, params.modules['picard_markduplicates'], params.modules['samtools_sort_merged_lib']) - - // FILTER BAM FILES - // Fix getting name sorted BAM here for PE/SE - CLEAN_BAM(MARKDUPLICATES.out.bam.join(MARKDUPLICATES.out.bai, by: [0]), - MAKE_GENOME_FILTER.out.collect(), - ch_bamtools_filter_config, - params.modules['filter_bam'], - params.modules['remove_bam_orphans'], - params.modules['samtools_sort_filter']) - - // POST ALIGNMENT QC - PICARD_COLLECTMULTIPLEMETRICS(CLEAN_BAM.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics']) - //PRESEQ_LC_EXTRAP(CLEAN_BAM.out.bam, params.modules['preseq_lc_extrap']) - PHANTOMPEAKQUALTOOLS(CLEAN_BAM.out.bam, params.modules['phantompeakqualtools']) - - // COVERAGE TRACKS - BEDTOOLS_GENOMECOV(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), params.modules['bedtools_genomecov']) - UCSC_BEDRAPHTOBIGWIG(BEDTOOLS_GENOMECOV.out.bedgraph, GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig']) - - // COVERATE PLOTS - DEEPTOOLS_COMPUTEMATRIX(UCSC_BEDRAPHTOBIGWIG.out.bigwig, ch_gene_bed, params.modules['deeptools_computematrix']) - DEEPTOOLS_PLOTPROFILE(DEEPTOOLS_COMPUTEMATRIX.out.matrix, params.modules['deeptools_plotprofile']) - DEEPTOOLS_PLOTHEATMAP(DEEPTOOLS_COMPUTEMATRIX.out.matrix, params.modules['deeptools_plotheatmap']) + PICARD_MERGESAMFILES ( + ch_sort_bam, + params.modules['picard_mergesamfiles'] + ) + + /* + * Mark duplicates & filter BAM files + */ + MARK_DUPLICATES ( + PICARD_MERGESAMFILES.out.bam, + params.modules['picard_markduplicates'], + params.modules['samtools_sort_merged_lib'] + ) + + // Fix getting name sorted BAM here for PE/SE + CLEAN_BAM ( + MARK_DUPLICATES.out.bam.join(MARK_DUPLICATES.out.bai, by: [0]), + MAKE_GENOME_FILTER.out.collect(), + ch_bamtools_filter_config, + params.modules['filter_bam'], + params.modules['remove_bam_orphans'], + params.modules['samtools_sort_filter'] + ) + + /* + * Post alignment QC + */ + PICARD_COLLECTMULTIPLEMETRICS ( + CLEAN_BAM.out.bam, + ch_fasta, + params.modules['picard_collectmultiplemetrics'] + ) + + PRESEQ_LCEXTRAP ( + CLEAN_BAM.out.bam, + params.modules['preseq_lcextrap'] + ) + + PHANTOMPEAKQUALTOOLS ( + CLEAN_BAM.out.bam, + params.modules['phantompeakqualtools'] + ) + + /* + * Coverage tracks + */ + BEDTOOLS_GENOMECOV ( + CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), + params.modules['bedtools_genomecov'] + ) + + UCSC_BEDRAPHTOBIGWIG ( + BEDTOOLS_GENOMECOV.out.bedgraph, + GET_CHROM_SIZES.out.sizes, + params.modules['ucsc_bedgraphtobigwig'] + ) + + /* + * Coverage plots + */ + DEEPTOOLS_COMPUTEMATRIX ( + UCSC_BEDRAPHTOBIGWIG.out.bigwig, + ch_gene_bed, + params.modules['deeptools_computematrix'] + ) + + DEEPTOOLS_PLOTPROFILE ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotprofile'] + ) + + DEEPTOOLS_PLOTHEATMAP ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotheatmap'] + ) // Join control BAM here too to generate plots with IP and CONTROL together params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" - DEEPTOOLS_PLOTFINGERPRINT(CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), params.modules['deeptools_plotfingerprint']) - - // PIPELINE REPORTING - GET_SOFTWARE_VERSIONS(params.modules['get_software_versions']) - OUTPUT_DOCUMENTATION(ch_output_docs, ch_output_docs_images, params.modules['output_documentation']) + DEEPTOOLS_PLOTFINGERPRINT ( + CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), + params.modules['deeptools_plotfingerprint'] + ) + + /* + * Pipeline reporting + */ + GET_SOFTWARE_VERSIONS ( + params.modules['get_software_versions'] + ) + + OUTPUT_DOCUMENTATION ( + ch_output_docs, + ch_output_docs_images, + params.modules['output_documentation'] + ) // MULTIQC( // summary, @@ -448,15 +348,20 @@ workflow { // ) } -/* - * Send completion email - */ +//////////////////////////////////////////////////// +/* -- COMPLETION EMAIL -- */ +//////////////////////////////////////////////////// + workflow.onComplete { def multiqc_report = [] Completion.email(workflow, params, summary, run_name, baseDir, multiqc_report, log) Completion.summary(workflow, params, log) } +//////////////////////////////////////////////////// +/* -- THE END -- */ +//////////////////////////////////////////////////// + // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ diff --git a/modules/local/subworkflow/check_input.nf b/modules/local/subworkflow/check_input.nf index e69de29bb..445599082 100644 --- a/modules/local/subworkflow/check_input.nf +++ b/modules/local/subworkflow/check_input.nf @@ -0,0 +1,32 @@ +/* + * Check input samplesheet and get read channels + */ + +include { CHECK_SAMPLESHEET; + get_samplesheet_paths; + get_samplesheet_design } from '../process/check_samplesheet' + +workflow CHECK_INPUT { + take: + ch_input // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group + check_samplesheet_opts // map: options for TrimGalore! module + + main: + CHECK_SAMPLESHEET (ch_input, check_samplesheet_opts) + .reads + .splitCsv(header:true, sep:',') + .map { get_samplesheet_paths(it, params.single_end, seq_center) } + .set { ch_reads } + + CHECK_SAMPLESHEET + .out + .controls + .splitCsv(header:true, sep:',') + .map { get_samplesheet_design(it, params.single_end) } + .set { ch_design } + + emit: + reads = ch_reads // channel: [ val(meta), [ reads ] ] + design = ch_design // channel: [ val(meta), [ reads ] ] +} diff --git a/modules/local/subworkflow/clean_bam.nf b/modules/local/subworkflow/clean_bam.nf new file mode 100644 index 000000000..b51099cf1 --- /dev/null +++ b/modules/local/subworkflow/clean_bam.nf @@ -0,0 +1,31 @@ +/* + * Filter BAM file + */ + +include { FILTER_BAM } from '../process/filter_bam' +include { REMOVE_BAM_ORPHANS } from '../process/remove_bam_orphans' +include { SORT_BAM } from '../../nf-core/subworkflow/sort_bam' + +workflow CLEAN_BAM { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + config // file: BAMtools filter JSON config file + filter_bam_opts // map: options for filter_bam module + rm_bam_orphans_opts // map: options for remove_bam_orphans module + samtools_opts // map: options for SAMTools modules + + main: + FILTER_BAM(ch_bam_bai, ch_bed, config, filter_bam_opts) + REMOVE_BAM_ORPHANS(FILTER_BAM.out.bam, rm_bam_orphans_opts) + SORT_BAM(REMOVE_BAM_ORPHANS.out.bam, samtools_opts) + + emit: + name_bam = REMOVE_BAM_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] + bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] + bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] + stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bamtools_version = FILTER_BAM.out.version // path: *.version.txt +} diff --git a/modules/nf-core/software/preseq_lc_extrap.nf b/modules/nf-core/software/preseq_lcextrap.nf similarity index 94% rename from modules/nf-core/software/preseq_lc_extrap.nf rename to modules/nf-core/software/preseq_lcextrap.nf index b87a038be..24af85664 100644 --- a/modules/nf-core/software/preseq_lc_extrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -1,4 +1,4 @@ -process PRESEQ_LC_EXTRAP { +process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' diff --git a/modules/nf-core/software/trim_galore.nf b/modules/nf-core/software/trimgalore.nf similarity index 96% rename from modules/nf-core/software/trim_galore.nf rename to modules/nf-core/software/trimgalore.nf index a0fd544f7..eaecdf8fe 100644 --- a/modules/nf-core/software/trim_galore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -1,4 +1,4 @@ -process TRIM_GALORE { +process TRIMGALORE { tag "$meta.id" label 'process_high' publishDir "${params.outdir}/${opts.publish_dir}", diff --git a/modules/nf-core/subworkflow/bam_stats.nf b/modules/nf-core/subworkflow/bam_stats.nf new file mode 100644 index 000000000..95c1bb24d --- /dev/null +++ b/modules/nf-core/subworkflow/bam_stats.nf @@ -0,0 +1,24 @@ +/* + * Run SAMtools stats, flagstat and idxstats + */ + +include { SAMTOOLS_STATS } from '../software/samtools_stats' +include { SAMTOOLS_IDXSTATS } from '../software/samtools_idxstats' +include { SAMTOOLS_FLAGSTAT } from '../software/samtools_flagstat' + +workflow BAM_STATS { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + samtools_opts // map: options for SAMTools modules + + main: + SAMTOOLS_STATS(ch_bam_bai, samtools_opts) + SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_opts) + SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_opts) + + emit: + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_STATS.out.version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/map_reads.nf b/modules/nf-core/subworkflow/map_reads.nf new file mode 100644 index 000000000..1e310c8b0 --- /dev/null +++ b/modules/nf-core/subworkflow/map_reads.nf @@ -0,0 +1,28 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { BWA_MEM } from '../software/bwa_mem' +include { SORT_BAM } from './sort_bam' + +workflow MAP_READS { + take: + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_opts // map: options for BWA MEM module + samtools_opts // map: options for SAMTools modules + + main: + BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) + SORT_BAM(BWA_MEM.out.bam, samtools_opts) + + emit: + bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] + bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] + stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bwa_version = BWA_MEM.out.version // path: *.version.txt + samtools_version = SORT_BAM.out.samtools_version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/mark_duplicates.nf b/modules/nf-core/subworkflow/mark_duplicates.nf new file mode 100644 index 000000000..2d326a083 --- /dev/null +++ b/modules/nf-core/subworkflow/mark_duplicates.nf @@ -0,0 +1,29 @@ +/* + * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { PICARD_MARKDUPLICATES } from '../software/picard_markduplicates' +include { SAMTOOLS_INDEX } from '../software/samtools_index' +include { BAM_STATS } from './bam_stats' + +workflow MARK_DUPLICATES { + take: + ch_bam // channel: [ val(meta), [ bam ] ] + markduplicates_opts // map: options for picard MarkDuplicates module + samtools_opts // map: options for SAMTools modules + + main: + PICARD_MARKDUPLICATES(ch_bam, markduplicates_opts) + SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_opts) + BAM_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + + emit: + bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] + metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt + samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/preprocess.nf b/modules/nf-core/subworkflow/preprocess.nf deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/nf-core/subworkflow/qc_trim.nf b/modules/nf-core/subworkflow/qc_trim.nf new file mode 100644 index 000000000..f99089a02 --- /dev/null +++ b/modules/nf-core/subworkflow/qc_trim.nf @@ -0,0 +1,49 @@ +/* + * Read QC and trimming + */ + +include { FASTQC } from '../software/fastqc' +include { TRIMGALORE } from '../software/trimgalore' + +workflow QC_TRIM { + take: + ch_reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + fastqc_opts // map: options for FastQC module + trim_galore_opts // map: options for TrimGalore! module + + main: + fastqc_html = Channel.empty() + fastqc_zip = Channel.empty() + fastqc_version = Channel.empty() + if (!skip_fastqc) { + FASTQC(ch_reads, fastqc_opts).html.set { fastqc_html } + fastqc_zip = FASTQC.out.zip + fastqc_version = FASTQC.out.version + } + + ch_trim_reads = ch_reads + trim_html = Channel.empty() + trim_zip = Channel.empty() + trim_log = Channel.empty() + trim_galore_version = Channel.empty() + if (!skip_trimming) { + TRIMGALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } + trim_html = TRIMGALORE.out.html + trim_zip = TRIMGALORE.out.zip + trim_log = TRIMGALORE.out.log + trim_galore_version = TRIMGALORE.out.version + } + + emit: + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] + fastqc_version // path: *.version.txt + + reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] + trim_galore_version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/sort_bam.nf b/modules/nf-core/subworkflow/sort_bam.nf new file mode 100644 index 000000000..dd4f0b2c7 --- /dev/null +++ b/modules/nf-core/subworkflow/sort_bam.nf @@ -0,0 +1,26 @@ +/* + * Sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { SAMTOOLS_SORT } from '../software/samtools_sort' +include { SAMTOOLS_INDEX } from '../software/samtools_index' +include { BAM_STATS } from './bam_stats' + +workflow SORT_BAM { + take: + ch_bam // channel: [ val(meta), [ bam ] ] + samtools_opts // map: options for SAMTools modules + + main: + SAMTOOLS_SORT(ch_bam, samtools_opts) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_opts) + BAM_STATS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + + emit: + bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt +} From 0486725b06b837a19562cfe26c0172666c223e9a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 12:06:53 +0100 Subject: [PATCH 052/538] Update environment --- environment.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/environment.yml b/environment.yml index c7efd4d9b..7beb5868a 100644 --- a/environment.yml +++ b/environment.yml @@ -22,26 +22,26 @@ dependencies: - conda-forge::r-lattice=0.20_41 - conda-forge::r-upsetr=1.4.0 - conda-forge::r-xfun=0.15 - - conda-forge::gawk=5.1.0 - - conda-forge::pigz=2.3.4 ## Required for TrimGalore multi-threading + #- conda-forge::gawk=5.1.0 + #- conda-forge::pigz=2.3.4 ## Required for TrimGalore multi-threading ## bioconda packages - - bioconda::fastqc=0.11.9 - - bioconda::trim-galore=0.6.5 - - bioconda::bwa=0.7.17 + #- bioconda::fastqc=0.11.9 + #- bioconda::trim-galore=0.6.5 + #- bioconda::bwa=0.7.17 - bioconda::samtools=1.10 - - bioconda::picard=2.23.1 + #- bioconda::picard=2.23.1 - bioconda::bamtools=2.5.1 - bioconda::pysam=0.15.3 - bioconda::bedtools=2.29.2 - - bioconda::ucsc-bedgraphtobigwig=357 - - bioconda::deeptools=3.4.3 - - bioconda::macs2=2.2.7.1 - - bioconda::homer=4.11 - - bioconda::subread=2.0.1 - - bioconda::phantompeakqualtools=1.2.2 - - bioconda::preseq=2.0.3 - - bioconda::multiqc=1.9 + #- bioconda::ucsc-bedgraphtobigwig=357 + #- bioconda::deeptools=3.4.3 + #- bioconda::macs2=2.2.7.1 + #- bioconda::homer=4.11 + #- bioconda::subread=2.0.1 + #- bioconda::phantompeakqualtools=1.2.2 + #- bioconda::preseq=2.0.3 + #- bioconda::multiqc=1.9 - bioconda::bioconductor-biocparallel=1.20.0 - bioconda::bioconductor-deseq2=1.26.0 - bioconda::bioconductor-vsn=3.54.0 From 2dd9f21d265997495d0c17f58556fc1dbaca22f4 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 14:56:26 +0100 Subject: [PATCH 053/538] Refactor input reads channel --- bin/check_samplesheet.py | 330 ++++++++++----------- modules/local/process/check_samplesheet.nf | 29 +- modules/local/subworkflow/check_input.nf | 18 +- 3 files changed, 168 insertions(+), 209 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 921349ecb..e81d5cdc9 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,191 +1,173 @@ #!/usr/bin/env python -####################################################################### -####################################################################### -## Created on April 4th 2019 to check nf-core/chipseq design file -####################################################################### -####################################################################### - import os import sys +import errno import argparse -############################################ -############################################ -## PARSE ARGUMENTS -############################################ -############################################ - -Description = 'Reformat nf-core/chipseq samplesheet and check its contents.' -Epilog = "Example usage: python check_samplesheet.py " - -argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) - -## REQUIRED PARAMETERS -argParser.add_argument('DESIGN_FILE', help="Input samplesheet/design file.") -argParser.add_argument('READ_MAPPING_FILE', help="Output design file containing sample ids and reads.") -argParser.add_argument('CONTROL_MAPPING_FILE', help="Output design file containing ip vs control mappings.") -args = argParser.parse_args() - -############################################ -############################################ -## MAIN FUNCTION -############################################ -############################################ - -def reformat_design(DesignFile,ReadMappingFile,ControlMappingFile): - - ERROR_STR = 'ERROR: Please check design file' - HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] - - ## CHECK HEADER - fin = open(DesignFile,'r') - header = fin.readline().strip().split(',') - if header != HEADER: - print("{} header: {} != {}".format(ERROR_STR,','.join(header),','.join(HEADER))) - sys.exit(1) - - numColList = [] - sampleMappingDict = {} - antibodyDict = {} - while True: - line = fin.readline() - if line: - lspl = [x.strip() for x in line.strip().split(',')] - group,replicate,fastQFiles,antibody,control = lspl[0],lspl[1],[x for x in lspl[2:-2] if x],lspl[-2],lspl[-1] - - ## CHECK VALID NUMBER OF COLUMNS PER SAMPLE - numCols = len(lspl) - if numCols not in [6]: - print("{}: Invalid number of columns (should be 6)!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - numColList.append(numCols) - - ## CHECK GROUP ID DOESNT CONTAIN SPACES - if group.find(' ') != -1: - print("{}: Group id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - - ## CHECK REPLICATE COLUMN IS INTEGER + +def parse_args(args=None): + Description = "Reformat nf-core/chipseq samplesheet file and check its contents." + Epilog = "Example usage: python check_samplesheet.py " + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument("FILE_IN", help="Input samplesheet file.") + parser.add_argument("FILE_OUT", help="Output file.") + return parser.parse_args(args) + + +def make_dir(path): + if len(path) > 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise exception + + +def print_error(error, context='Line', context_str=''): + error_str = "ERROR: Please check samplesheet -> {}".format(error) + if context != '' and context_str != '': + error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format(error, context.strip(), context_str.strip()) + print(error_str) + sys.exit(1) + + +def check_samplesheet(file_in, file_out): + """ + This function checks that the samplesheet follows the following structure: + + group,replicate,fastq_1,fastq_2,antibody,control + CTCF_IP,1,CTCF_IP_1.fastq.gz,CTCF_IP_2.fastq.gz,CTCF,INPUT + INPUT,1,INPUT_1.fastq.gz,INPUT_IP_2.fastq.gz,, + """ + + sample_run_dict = {} + antibody_dict = {} + with open(file_in, "r") as fin: + + ## Check header + HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] + header = fin.readline().strip().split(",") + if header != HEADER: + print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) + sys.exit(1) + + ## Check sample entries + for line in fin: + lspl = [x.strip() for x in line.strip().split(",")] + sample, replicate, fastq_1, fastq_2, antibody, control = lspl + + ## Check valid number of columns per row + if len(lspl) != len(header): + print_error("Invalid number of columns (minimum = {})!".format(len(header)), 'Line', line) + + num_cols = len([x for x in lspl if x]) + if num_cols < 3: + print_error("Invalid number of populated columns (minimum = 3)!", 'Line', line) + + ## Check sample name entries + if sample: + if sample.find(" ") != -1: + print_error("Group entry contains spaces!", 'Line', line) + else: + print_error("Group entry has not been specified!", 'Line', line) + + ## Check replicate entry is integer if not replicate.isdigit(): - print("{}: Replicate id not an integer!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) + print_error("Replicate id not an integer!", 'Line', line) replicate = int(replicate) - for fastq in fastQFiles: - ## CHECK FASTQ FILE EXTENSION - if fastq[-9:] != '.fastq.gz' and fastq[-6:] != '.fq.gz': - print("{}: FastQ file has incorrect extension (has to be '.fastq.gz' or 'fq.gz') - {}\nLine: '{}'".format(ERROR_STR,fastq,line.strip())) - sys.exit(1) - - ## CREATE GROUP MAPPING DICT = {GROUP_ID: {REPLICATE_ID:[[FASTQ_FILES]]} - if group not in sampleMappingDict: - sampleMappingDict[group] = {} - if replicate not in sampleMappingDict[group]: - sampleMappingDict[group][replicate] = [] - sampleMappingDict[group][replicate].append(fastQFiles) + ## Check FastQ file extension + for fastq in [fastq_1, fastq_2]: + if fastq: + if fastq.find(" ") != -1: + print_error("FastQ file contains spaces!", 'Line', line) + if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): + print_error("FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", 'Line', line) - ## CHECK BOTH ANTIBODY AND CONTROL COLUMNS HAVE VALID VALUES + ## Check antibody and control columns have valid values if antibody: if antibody.find(' ') != -1: - print("{}: Antibody id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) + print_error("Antibody id contains spaces!", line) if not control: - print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) + print_error("Both antibody and control columns must be specified!", 'Line', line) if control: if control.find(' ') != -1: - print("{}: Control id contains spaces!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) + print_error("Control id contains spaces!", line) if not antibody: - print("{}: both Antibody and Control must be specified!\nLine: '{}'".format(ERROR_STR,line.strip())) - sys.exit(1) - - ## CREATE ANTIBODY MAPPING CONTROL DICT + print_error("Both antibody and control columns must be specified!", 'Line', line) if antibody and control: - antibodyDict[group] = (antibody,control) - - else: - fin.close() - break - - ## CHECK IF DATA IS PAIRED-END OR SINGLE-END AND NOT A MIXTURE - if min(numColList) != max(numColList): - print("{}: Mixture of paired-end and single-end reads!".format(ERROR_STR)) - sys.exit(1) - - ## CHECK IF ANTIBODY AND CONTROL COLUMNS HAVE BEEN SPECIFIED AT LEAST ONCE - if len(antibodyDict) == 0: - print("{}: Antibody and Control must be specified at least once!".format(ERROR_STR)) - sys.exit(1) - - ## WRITE READ MAPPING FILE - antibodyGroupDict = {} - fout = open(ReadMappingFile,'w') - fout.write(','.join(['sample_id','fastq_1','fastq_2']) + '\n') - for group in sorted(sampleMappingDict.keys()): - - ## CHECK THAT REPLICATE IDS ARE IN FORMAT 1.. - uniq_rep_ids = set(sampleMappingDict[group].keys()) - if len(uniq_rep_ids) != max(uniq_rep_ids): - print("{}: Replicate IDs must start with 1..\nGroup: {}, Replicate IDs: {}".format(ERROR_STR,group,list(uniq_rep_ids))) - sys.exit(1) - - ## RECONSTRUCT LINE FOR SAMPLE IN DESIGN - for replicate in sorted(sampleMappingDict[group].keys()): - for idx in range(len(sampleMappingDict[group][replicate])): - fastQFiles = sampleMappingDict[group][replicate][idx] - - ## GET SAMPLE_ID,FASTQ_1,FASTQ_2 COLUMNS - sample_id = "{}_R{}_T{}".format(group,replicate,idx+1) - oList = [sample_id] + fastQFiles - if len(fastQFiles) == 1: - oList += [''] - fout.write(','.join(oList) + '\n') - - ## EXTRAPOLATE CONTROL COLUMN - if group in antibodyDict: - antibody,control = antibodyDict[group] - if control in sampleMappingDict.keys(): - control_id = "{}_R1".format(control) - if replicate in sampleMappingDict[control]: - control_id = "{}_R{}".format(control,replicate) - if antibody not in antibodyGroupDict: - antibodyGroupDict[antibody] = {} - if group not in antibodyGroupDict[antibody]: - antibodyGroupDict[antibody][group] = [] - antibodyList = [sample_id[:-3],control_id] - if not antibodyList in antibodyGroupDict[antibody][group]: - antibodyGroupDict[antibody][group].append(antibodyList) - else: - print("{}: Control id not a valid group\nControl id: {}, Valid Groups: {}".format(ERROR_STR,control,sorted(sampleMappingDict.keys()))) - sys.exit(1) - fout.close() - - ## WRITE SAMPLE TO CONTROL MAPPING FILE - fout = open(ControlMappingFile,'w') - fout.write(','.join(['sample_id','control_id','antibody','replicatesExist','multipleGroups']) + '\n') - for antibody in sorted(antibodyGroupDict.keys()): - repsExist = '0' - if max([len(x) for x in antibodyGroupDict[antibody].values()]) > 1: - repsExist = '1' - multipleGroups = '0' - if len(antibodyGroupDict[antibody].keys()) > 1: - multipleGroups = '1' - for group in sorted(antibodyGroupDict[antibody].keys()): - for antibodyList in antibodyGroupDict[antibody][group]: - fout.write(','.join(antibodyList+[antibody,repsExist,multipleGroups]) + '\n') - fout.close() - -############################################ -############################################ -## RUN FUNCTION -############################################ -############################################ - -reformat_design(DesignFile=args.DESIGN_FILE,ReadMappingFile=args.READ_MAPPING_FILE,ControlMappingFile=args.CONTROL_MAPPING_FILE) - -############################################ -############################################ -############################################ -############################################ + antibody_dict[sample] = (antibody,control) + + ## Auto-detect paired-end/single-end + sample_info = [] ## [single_end, fastq_1, fastq_2] + if sample and fastq_1 and fastq_2: ## Paired-end short reads + sample_info = ["0", fastq_1, fastq_2] + elif sample and fastq_1 and not fastq_2: ## Single-end short reads + sample_info = ["1", fastq_1, fastq_2] + else: + print_error("Invalid combination of columns provided!", 'Line', line) + + ## Create sample mapping dictionary = {sample: {replicate : [ single_end, fastq_1, fastq_2 ]}} + if sample not in sample_run_dict: + sample_run_dict[sample] = {} + if replicate not in sample_run_dict[sample]: + sample_run_dict[sample][replicate] = [sample_info] + else: + if sample_info in sample_run_dict[sample][replicate]: + print_error("Samplesheet contains duplicate rows!", 'Line', line) + else: + sample_run_dict[sample].append(sample_info) + + ## Check if antibody and control columns have been specified at least once + if len(antibody_dict) == 0: + print_error("Antibody and control must be specified at least once!", '', '') + + ## Write validated samplesheet with appropriate columns + antibody_group_dict = {} + if len(sample_run_dict) > 0: + out_dir = os.path.dirname(file_out) + make_dir(out_dir) + with open(file_out, "w") as fout: + + fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2", "antibody", "control"]) + "\n") + for sample in sorted(sample_run_dict.keys()): + + ## Check that replicate ids are in format 1.. + uniq_rep_ids = set(sample_run_dict[sample].keys()) + if len(uniq_rep_ids) != max(uniq_rep_ids): + print_error("Replicate IDs must start with 1..!", 'Group', sample) + + for replicate in sorted(sample_run_dict[sample].keys()): + + ## Check that multiple runs of the same sample are of the same datatype + if not all(x[0] == sample_run_dict[sample][replicate][0][0] for x in sample_run_dict[sample][replicate]): + print_error("Multiple runs of a sample must be of the same datatype!", 'Group', sample) + + for idx, sample_info in enumerate(sample_run_dict[sample][replicate]): + sample_id = "{}_R{}_T{}".format(sample,replicate,idx+1) + oList = [sample_id] + sample_info + + ## Extrapolate group column + if sample in antibody_dict: + antibody,control = antibody_dict[sample] + if control in sample_run_dict.keys(): + control_id = "{}_R1".format(control) + if replicate in sample_run_dict[control]: + control_id = "{}_R{}".format(control,replicate) + oList += [antibody, control_id] + else: + print_error("Control id not a valid group: {}!".format(control), 'Valid Groups', sorted(sample_run_dict.keys())) + else: + oList += 2 * [''] + fout.write(','.join(oList) + '\n') + + +def main(args=None): + args = parse_args(args) + check_samplesheet(args.FILE_IN, args.FILE_OUT) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/modules/local/process/check_samplesheet.nf b/modules/local/process/check_samplesheet.nf index 00184902a..0a1f64c34 100755 --- a/modules/local/process/check_samplesheet.nf +++ b/modules/local/process/check_samplesheet.nf @@ -14,20 +14,21 @@ process CHECK_SAMPLESHEET { val opts output: - path 'samplesheet_reads.csv', emit: reads - path 'samplesheet_controls.csv', emit: controls + path '*.csv' script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ - check_samplesheet.py $samplesheet samplesheet_reads.csv samplesheet_controls.csv + check_samplesheet.py $samplesheet samplesheet.valid.csv """ } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def get_samplesheet_paths(LinkedHashMap row, boolean single_end, String seq_center) { +def get_samplesheet_paths(LinkedHashMap row, String seq_center) { def meta = [:] - meta.id = row.sample_id - meta.single_end = single_end + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() + meta.antibody = row.antibody + meta.control = row.control def rg = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" if (seq_center) { @@ -36,24 +37,10 @@ def get_samplesheet_paths(LinkedHashMap row, boolean single_end, String seq_cent meta.read_group = rg def array = [] - if (single_end) { + if (meta.single_end) { array = [ meta, [ file(row.fastq_1, checkIfExists: true) ] ] } else { array = [ meta, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] } return array } - -// Function to get list of [sample, control, antibody, replicatesExist?, multipleGroups?] -def get_samplesheet_design(LinkedHashMap row, boolean single_end) { - def meta = [:] - meta.id = row.sample_id - meta.single_end = single_end - meta.antibody = row.antibody - meta.control_id = row.control_id - meta.reps_exist = row.replicatesExist.toBoolean() - meta.groups_exist = row.multipleGroups.toBoolean() - - //return [ row.sample_id, row.control_id, row.antibody, row.replicatesExist.toBoolean(), row.multipleGroups.toBoolean() ] - return meta -} diff --git a/modules/local/subworkflow/check_input.nf b/modules/local/subworkflow/check_input.nf index 445599082..91596732c 100644 --- a/modules/local/subworkflow/check_input.nf +++ b/modules/local/subworkflow/check_input.nf @@ -3,30 +3,20 @@ */ include { CHECK_SAMPLESHEET; - get_samplesheet_paths; - get_samplesheet_design } from '../process/check_samplesheet' + get_samplesheet_paths } from '../process/check_samplesheet' workflow CHECK_INPUT { take: ch_input // file: /path/to/samplesheet.csv seq_center // string: sequencing center for read group - check_samplesheet_opts // map: options for TrimGalore! module + check_samplesheet_opts // map: options for check_samplesheet module main: CHECK_SAMPLESHEET (ch_input, check_samplesheet_opts) - .reads .splitCsv(header:true, sep:',') - .map { get_samplesheet_paths(it, params.single_end, seq_center) } + .map { get_samplesheet_paths(it, seq_center) } .set { ch_reads } - CHECK_SAMPLESHEET - .out - .controls - .splitCsv(header:true, sep:',') - .map { get_samplesheet_design(it, params.single_end) } - .set { ch_design } - emit: - reads = ch_reads // channel: [ val(meta), [ reads ] ] - design = ch_design // channel: [ val(meta), [ reads ] ] + reads = ch_reads // channel: [ val(meta), [ reads ] ] } From caa1eedbf947efe25553cbafc53e4a391ffe29d7 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 15:51:18 +0100 Subject: [PATCH 054/538] Use base expansion for genome indices --- conf/igenomes.config | 148 +++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 2de924228..8fb4b874e 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -12,8 +12,8 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" @@ -25,8 +25,8 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" @@ -37,8 +37,8 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" @@ -50,8 +50,8 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" @@ -61,8 +61,8 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" @@ -71,8 +71,8 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" @@ -82,8 +82,8 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" @@ -93,8 +93,8 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" @@ -104,8 +104,8 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" @@ -114,8 +114,8 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" @@ -125,8 +125,8 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" @@ -136,8 +136,8 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" @@ -146,8 +146,8 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" @@ -156,8 +156,8 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" @@ -166,8 +166,8 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" @@ -177,8 +177,8 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" @@ -187,8 +187,8 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" @@ -198,8 +198,8 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" @@ -208,8 +208,8 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" @@ -219,8 +219,8 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" @@ -231,8 +231,8 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" @@ -241,8 +241,8 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" @@ -252,8 +252,8 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" @@ -262,8 +262,8 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" @@ -274,8 +274,8 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" @@ -287,8 +287,8 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" @@ -300,8 +300,8 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" @@ -310,8 +310,8 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" @@ -322,8 +322,8 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" @@ -333,8 +333,8 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" @@ -343,8 +343,8 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" @@ -354,8 +354,8 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" @@ -365,8 +365,8 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" @@ -376,8 +376,8 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" @@ -387,8 +387,8 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" @@ -397,8 +397,8 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" @@ -407,8 +407,8 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" From d8ab22e58ee8e5e2dea1aef3a020671e9ba2b55e Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 17:18:29 +0100 Subject: [PATCH 055/538] Change conda env path to explicit package name --- modules/local/process/bedtools_genomecov.nf | 2 +- modules/local/process/check_samplesheet.nf | 6 ++++++ modules/local/process/get_chrom_sizes.nf | 4 ++-- modules/local/process/get_software_versions.nf | 6 ++++++ modules/local/process/gtf2bed.nf | 2 +- modules/local/process/make_genome_filter.nf | 2 +- modules/nf-core/software/bwa_index.nf | 2 +- modules/nf-core/software/bwa_mem.nf | 2 +- modules/nf-core/software/deeptools_computematrix.nf | 2 +- modules/nf-core/software/deeptools_plotfingerprint.nf | 4 ++-- modules/nf-core/software/deeptools_plotheatmap.nf | 4 ++-- modules/nf-core/software/deeptools_plotprofile.nf | 4 ++-- modules/nf-core/software/fastqc.nf | 2 +- modules/nf-core/software/homer_annotatepeaks.nf | 4 ++-- modules/nf-core/software/macs2_callpeak.nf | 2 +- modules/nf-core/software/multiqc.nf | 4 ++-- modules/nf-core/software/phantompeakqualtools.nf | 4 ++-- modules/nf-core/software/picard_collectmultiplemetrics.nf | 2 +- modules/nf-core/software/picard_markduplicates.nf | 4 ++-- modules/nf-core/software/picard_mergesamfiles.nf | 4 ++-- modules/nf-core/software/preseq_lcextrap.nf | 2 +- modules/nf-core/software/samtools_flagstat.nf | 2 +- modules/nf-core/software/samtools_idxstats.nf | 4 ++-- modules/nf-core/software/samtools_index.nf | 4 ++-- modules/nf-core/software/samtools_sort.nf | 2 +- modules/nf-core/software/samtools_stats.nf | 4 ++-- modules/nf-core/software/subread_featurecounts.nf | 1 + modules/nf-core/software/trimgalore.nf | 2 +- modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 2 +- 29 files changed, 51 insertions(+), 38 deletions(-) diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 05611f55e..297faf6ad 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -11,7 +11,7 @@ process BEDTOOLS_GENOMECOV { container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) input: tuple val(meta), path(bam), path(flagstat) diff --git a/modules/local/process/check_samplesheet.nf b/modules/local/process/check_samplesheet.nf index 0a1f64c34..19c76dcb6 100755 --- a/modules/local/process/check_samplesheet.nf +++ b/modules/local/process/check_samplesheet.nf @@ -9,6 +9,12 @@ process CHECK_SAMPLESHEET { if (opts.publish_results == "none") null else filename } + // Re-use Python 3 in MultiQC container + container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" + //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" + + conda (params.conda ? "bioconda::multiqc=1.9" : null) + input: path samplesheet val opts diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 79f6fa533..4f213d5fc 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -12,8 +12,8 @@ process GET_CHROM_SIZES { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - //conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::samtools=1.10" : null) + input: path fasta val opts diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index 0a90a0c62..be1631427 100755 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -9,6 +9,12 @@ process GET_SOFTWARE_VERSIONS { else if (filename.endsWith('.yaml')) null else filename } + // Re-use Python 3 in MultiQC container + container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" + //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" + + conda (params.conda ? "bioconda::multiqc=1.9" : null) + input: val opts diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 44ee3b098..008c781b6 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -13,7 +13,7 @@ process GTF2BED { container "quay.io/biocontainers/perl:5.26.2" //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" - //conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "conda-forge::perl=5.26.2" : null) input: path gtf diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 8b2943c75..777c70afc 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -12,7 +12,7 @@ process MAKE_GENOME_FILTER { container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - //conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) input: path sizes diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index 545748120..f6039ab45 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -11,7 +11,7 @@ process BWA_INDEX { container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::bwa=0.7.17" : null) input: path fasta diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index cc751edd9..771a77163 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -11,7 +11,7 @@ process BWA_MEM { container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.10" : null) input: tuple val(meta), path(reads) diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 949c590f5..7b3ef284b 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -11,7 +11,7 @@ process DEEPTOOLS_COMPUTEMATRIX { container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) input: tuple val(meta), path(bigwig) diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 99dbe26b9..bd8df5b21 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -11,8 +11,8 @@ process DEEPTOOLS_PLOTFINGERPRINT { container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + input: tuple val(meta), path(bams), path(bais) val opts diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index bdc3f500c..539195d76 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -11,8 +11,8 @@ process DEEPTOOLS_PLOTHEATMAP { container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + input: tuple val(meta), path(matrix) val opts diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 96db40318..3de239dfb 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -11,8 +11,8 @@ process DEEPTOOLS_PLOTPROFILE { container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + input: tuple val(meta), path(matrix) val opts diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index 7c8967e7f..8bba91ef2 100755 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -11,7 +11,7 @@ process FASTQC { container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::fastqc=0.11.9" : null) input: tuple val(meta), path(reads) diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 56189da48..2b501b555 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -11,8 +11,8 @@ process HOMER_ANNOTATEPEAKS { container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::homer=4.11" : null) + input: tuple val(meta), path(bed) path fasta diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index fa6e16d3e..b7536f06b 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,7 +1,7 @@ container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" //echo \$(macs2 --version 2>&1) > macs2.version.txt - +conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) // /* // * STEP 6.2: Call peaks with MACS2 and calculate FRiP score diff --git a/modules/nf-core/software/multiqc.nf b/modules/nf-core/software/multiqc.nf index 08da39c29..8ec114575 100755 --- a/modules/nf-core/software/multiqc.nf +++ b/modules/nf-core/software/multiqc.nf @@ -30,8 +30,8 @@ process MULTIQC { container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::multiqc=1.9" : null) + input: path (multiqc_config) from ch_multiqc_config path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 95b95ea97..7664ff164 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -11,8 +11,8 @@ process PHANTOMPEAKQUALTOOLS { container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::phantompeakqualtools=1.2.2" : null) + input: tuple val(meta), path(bam) val opts diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index fa3304f7c..aaaea4d63 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -11,7 +11,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::picard=2.23.2" : null) input: tuple val(meta), path(bam) diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 785e4f769..73ab8f0ac 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -11,8 +11,8 @@ process PICARD_MARKDUPLICATES { container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::picard=2.23.2" : null) + input: tuple val(meta), path(bam) val opts diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index b732f7f6b..19a7d8d6f 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -11,8 +11,8 @@ process PICARD_MERGESAMFILES { container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::picard=2.23.2" : null) + input: tuple val(meta), path(bams) val opts diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 24af85664..6ba2a7a7e 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -12,7 +12,7 @@ process PRESEQ_LCEXTRAP { container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::preseq=2.0.3" : null) input: tuple val(meta), path(bam) diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index eb5b910dc..e641c5b0e 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -10,7 +10,7 @@ process SAMTOOLS_FLAGSTAT { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::samtools=1.10" : null) input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index fd1eac27b..cacd23baa 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -10,8 +10,8 @@ process SAMTOOLS_IDXSTATS { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::samtools=1.10" : null) + input: tuple val(meta), path(bam), path(bai) val opts diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 204289fa8..1a99fcaca 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -10,8 +10,8 @@ process SAMTOOLS_INDEX { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::samtools=1.10" : null) + input: tuple val(meta), path(bam) val opts diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index c309a2af7..a3532a5b7 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -11,7 +11,7 @@ process SAMTOOLS_SORT { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::samtools=1.10" : null) input: tuple val(meta), path(bam) diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index c568740df..7a0d68c26 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -10,8 +10,8 @@ process SAMTOOLS_STATS { container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - conda (params.conda ? "${moduleDir}/environment.yml" : null) - + conda (params.conda ? "bioconda::samtools=1.10" : null) + input: tuple val(meta), path(bam), path(bai) val opts diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 54771185a..c50b2bc79 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,6 +1,7 @@ container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" //echo \$(featureCounts -v 2>&1) > featurecounts.version.txt +conda (params.conda ? "bioconda::subread=2.0.1" : null) // /* // * STEP 7.3: Count reads in consensus peaks with featureCounts diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index eaecdf8fe..1dcef6bd7 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -11,7 +11,7 @@ process TRIMGALORE { container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::trim-galore=0.6.5" : null) input: tuple val(meta), path(reads) diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 7e93d36cc..176b6b237 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -11,7 +11,7 @@ process UCSC_BEDRAPHTOBIGWIG { container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" - conda (params.conda ? "${moduleDir}/environment.yml" : null) + conda (params.conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) input: tuple val(meta), path(bedgraph) From eb1c4b58d216c96c4791ea6804dd28038556e916 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 18:52:23 +0100 Subject: [PATCH 056/538] Use first ever stable DSL2 release! Wooooohhooooooo --- .github/workflows/ci.yml | 4 ++-- CHANGELOG.md | 2 +- README.md | 2 +- nextflow.config | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aaed40ac2..1440d45b7 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['20.04.1', ''] + nxf_ver: ['20.07.1', ''] steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -57,7 +57,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest env: - NXF_VER: '20.04.1' + NXF_VER: '20.07.1' NXF_ANSI_LOG: false strategy: matrix: diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d3d088e8..37994ed80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Dependencies` -* Update Nextflow `19.10.0` -> `20.04.1` +* Update Nextflow `19.10.0` -> `20.07.1` ## [1.2.0] - 2020-07-02 diff --git a/README.md b/README.md index 58ab48a8b..71db377df 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.04.1-brightgreen.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.07.1-brightgreen.svg)](https://www.nextflow.io/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3240506.svg)](https://doi.org/10.5281/zenodo.3240506) [![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) diff --git a/nextflow.config b/nextflow.config index 28e37f721..d88f36478 100644 --- a/nextflow.config +++ b/nextflow.config @@ -171,7 +171,7 @@ manifest { homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' - nextflowVersion = '>=20.04.1' + nextflowVersion = '>=20.07.1' version = '1.3.0dev' } From f6fddafd112d3e7d8c5101facf3fd4cce83e64fe Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 18:55:05 +0100 Subject: [PATCH 057/538] enable DLS2 instead of previewing it. Duh. --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index bff23dbe9..3db120b0d 100755 --- a/main.nf +++ b/main.nf @@ -9,7 +9,7 @@ ---------------------------------------------------------------------------------------- */ -nextflow.preview.dsl = 2 +nextflow.enable.dsl = 2 /* * Print help message if required From fed4aab2b05591fd9c8884d909ab306227e86e3a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 18:57:12 +0100 Subject: [PATCH 058/538] Remove container definition --- modules/local/process/get_software_versions.nf | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index be1631427..0a90a0c62 100755 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -9,12 +9,6 @@ process GET_SOFTWARE_VERSIONS { else if (filename.endsWith('.yaml')) null else filename } - // Re-use Python 3 in MultiQC container - container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" - //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" - - conda (params.conda ? "bioconda::multiqc=1.9" : null) - input: val opts From 7296a9c9f67d1068a1ad83675092b9a74e6b2ffb Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 24 Jul 2020 19:25:48 +0100 Subject: [PATCH 059/538] Remove redundant packages --- environment.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/environment.yml b/environment.yml index 7beb5868a..ba6cbcd12 100644 --- a/environment.yml +++ b/environment.yml @@ -22,26 +22,12 @@ dependencies: - conda-forge::r-lattice=0.20_41 - conda-forge::r-upsetr=1.4.0 - conda-forge::r-xfun=0.15 - #- conda-forge::gawk=5.1.0 - #- conda-forge::pigz=2.3.4 ## Required for TrimGalore multi-threading ## bioconda packages - #- bioconda::fastqc=0.11.9 - #- bioconda::trim-galore=0.6.5 - #- bioconda::bwa=0.7.17 - bioconda::samtools=1.10 - #- bioconda::picard=2.23.1 - bioconda::bamtools=2.5.1 - bioconda::pysam=0.15.3 - bioconda::bedtools=2.29.2 - #- bioconda::ucsc-bedgraphtobigwig=357 - #- bioconda::deeptools=3.4.3 - #- bioconda::macs2=2.2.7.1 - #- bioconda::homer=4.11 - #- bioconda::subread=2.0.1 - #- bioconda::phantompeakqualtools=1.2.2 - #- bioconda::preseq=2.0.3 - #- bioconda::multiqc=1.9 - bioconda::bioconductor-biocparallel=1.20.0 - bioconda::bioconductor-deseq2=1.26.0 - bioconda::bioconductor-vsn=3.54.0 From f35f1bb318f30661cd742f07a3f1bc7ba0d932ca Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 06:55:02 +0100 Subject: [PATCH 060/538] Comment out get software versions for now --- main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 3db120b0d..5e0950a7f 100755 --- a/main.nf +++ b/main.nf @@ -331,9 +331,9 @@ workflow { /* * Pipeline reporting */ - GET_SOFTWARE_VERSIONS ( - params.modules['get_software_versions'] - ) + //GET_SOFTWARE_VERSIONS ( + // params.modules['get_software_versions'] + //) OUTPUT_DOCUMENTATION ( ch_output_docs, From 0bf0cdee153b58ab1b73d9cb0379e9941e9523a3 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 07:54:02 +0100 Subject: [PATCH 061/538] Get --conda working for pipeline --- environment.yml | 14 +++++++------- modules/local/process/bedtools_genomecov.nf | 5 +---- modules/local/process/calc_frip.nf | 1 + modules/local/process/check_samplesheet.nf | 6 +----- modules/local/process/featurecounts_deseq2.nf | 2 +- modules/local/process/filter_bam.nf | 2 ++ modules/local/process/get_chrom_sizes.nf | 5 +---- modules/local/process/gtf2bed.nf | 5 +---- modules/local/process/igv.nf | 1 + modules/local/process/macs2_consensus.nf | 1 + modules/local/process/make_genome_filter.nf | 5 +---- modules/local/process/output_documentation.nf | 2 ++ modules/local/process/plot_homer_annotatepeaks.nf | 1 + modules/local/process/remove_bam_orphans.nf | 2 ++ modules/nf-core/software/phantompeakqualtools.nf | 3 +-- nextflow.config | 1 + 16 files changed, 25 insertions(+), 31 deletions(-) diff --git a/environment.yml b/environment.yml index ba6cbcd12..361352d0c 100644 --- a/environment.yml +++ b/environment.yml @@ -7,11 +7,11 @@ channels: - defaults dependencies: ## conda-forge packages - - conda-forge::python=3.7.6 + - conda-forge::python=3.7.8 - conda-forge::markdown=3.2.2 - conda-forge::pymdown-extensions=7.1 - conda-forge::pygments=2.6.1 - - conda-forge::r-base=3.6.2 + - conda-forge::r-base=4.0.2 - conda-forge::r-optparse=1.6.6 - conda-forge::r-rcolorbrewer=1.1_2 - conda-forge::r-reshape2=1.4.4 @@ -21,13 +21,13 @@ dependencies: - conda-forge::r-pheatmap=1.0.12 - conda-forge::r-lattice=0.20_41 - conda-forge::r-upsetr=1.4.0 - - conda-forge::r-xfun=0.15 + - conda-forge::r-xfun=0.16 ## bioconda packages - bioconda::samtools=1.10 - bioconda::bamtools=2.5.1 - - bioconda::pysam=0.15.3 + - bioconda::pysam=0.16.0.1 - bioconda::bedtools=2.29.2 - - bioconda::bioconductor-biocparallel=1.20.0 - - bioconda::bioconductor-deseq2=1.26.0 - - bioconda::bioconductor-vsn=3.54.0 + - bioconda::bioconductor-biocparallel=1.22.0 + - bioconda::bioconductor-deseq2=1.28.0 + - bioconda::bioconductor-vsn=3.56.0 diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 297faf6ad..290f64aa7 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -8,10 +8,7 @@ process BEDTOOLS_GENOMECOV { else if (filename.endsWith('.version.txt')) null else filename } - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - - conda (params.conda ? "bioconda::bedtools=2.29.2" : null) + conda (params.conda ? "${baseDir}/environment.yml" : null) input: tuple val(meta), path(bam), path(flagstat) diff --git a/modules/local/process/calc_frip.nf b/modules/local/process/calc_frip.nf index e69de29bb..a90c447d1 100644 --- a/modules/local/process/calc_frip.nf +++ b/modules/local/process/calc_frip.nf @@ -0,0 +1 @@ +conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/check_samplesheet.nf b/modules/local/process/check_samplesheet.nf index 19c76dcb6..79357dee2 100755 --- a/modules/local/process/check_samplesheet.nf +++ b/modules/local/process/check_samplesheet.nf @@ -9,11 +9,7 @@ process CHECK_SAMPLESHEET { if (opts.publish_results == "none") null else filename } - // Re-use Python 3 in MultiQC container - container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" - //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" - - conda (params.conda ? "bioconda::multiqc=1.9" : null) + conda (params.conda ? "${baseDir}/environment.yml" : null) input: path samplesheet diff --git a/modules/local/process/featurecounts_deseq2.nf b/modules/local/process/featurecounts_deseq2.nf index fb1e28240..4586ee7e1 100644 --- a/modules/local/process/featurecounts_deseq2.nf +++ b/modules/local/process/featurecounts_deseq2.nf @@ -1,4 +1,4 @@ - +conda (params.conda ? "${baseDir}/environment.yml" : null) // /* // * STEP 7.4: Differential analysis with DESeq2 diff --git a/modules/local/process/filter_bam.nf b/modules/local/process/filter_bam.nf index 32c9f8f02..f3e215889 100644 --- a/modules/local/process/filter_bam.nf +++ b/modules/local/process/filter_bam.nf @@ -11,6 +11,8 @@ process FILTER_BAM { else if (filename.endsWith('.version.txt')) null else filename } + conda (params.conda ? "${baseDir}/environment.yml" : null) + input: tuple val(meta), path(bam), path(bai) path bed diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 4f213d5fc..3dfed0f80 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -9,10 +9,7 @@ process GET_CHROM_SIZES { if (opts.publish_results == "none") null else filename } - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) + conda (params.conda ? "${baseDir}/environment.yml" : null) input: path fasta diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 008c781b6..43536aa26 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -10,10 +10,7 @@ process GTF2BED { if (opts.publish_results == "none") null else filename } - container "quay.io/biocontainers/perl:5.26.2" - //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" - - conda (params.conda ? "conda-forge::perl=5.26.2" : null) + conda (params.conda ? "${baseDir}/environment.yml" : null) input: path gtf diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf index cc7a9c228..e1d94bbfb 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/process/igv.nf @@ -1,3 +1,4 @@ +//conda (params.conda ? "${baseDir}/environment.yml" : null) // /* // * STEP 8: Create IGV session file // */ diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index b36d6a197..134a9857f 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -1,3 +1,4 @@ +// conda (params.conda ? "${baseDir}/environment.yml" : null) // /* // * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection // */ diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 777c70afc..7341751a8 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -9,10 +9,7 @@ process MAKE_GENOME_FILTER { if (opts.publish_results == "none") null else filename } - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - - conda (params.conda ? "bioconda::bedtools=2.29.2" : null) + conda (params.conda ? "${baseDir}/environment.yml" : null) input: path sizes diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index e3201527a..831760931 100755 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -8,6 +8,8 @@ process OUTPUT_DOCUMENTATION { if (opts.publish_results == "none") null else filename } + conda (params.conda ? "${baseDir}/environment.yml" : null) + input: path output_docs path images diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index 477c84845..87099c1a3 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -1,3 +1,4 @@ +conda (params.conda ? "${baseDir}/environment.yml" : null) // /* // * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation // */ diff --git a/modules/local/process/remove_bam_orphans.nf b/modules/local/process/remove_bam_orphans.nf index 46fbc30c9..83c3f654b 100644 --- a/modules/local/process/remove_bam_orphans.nf +++ b/modules/local/process/remove_bam_orphans.nf @@ -10,6 +10,8 @@ process REMOVE_BAM_ORPHANS { if (opts.publish_results == "none") null else filename } + conda (params.conda ? "${baseDir}/environment.yml" : null) + input: tuple val(meta), path(bam) val opts diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 7664ff164..cbf1541a3 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -25,8 +25,7 @@ process PHANTOMPEAKQUALTOOLS { script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ - RUN_SPP=`which run_spp.R` - Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript -e "library(caTools); source(run_spp.R)" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus Rscript -e "load('${prefix}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" touch phantompeakqualtools.version.txt diff --git a/nextflow.config b/nextflow.config index d88f36478..fe2bcc264 100644 --- a/nextflow.config +++ b/nextflow.config @@ -72,6 +72,7 @@ params { config_profile_url = false // Options: Other + conda = false help = false outdir = './results' publish_dir_mode = 'copy' From 459ba76dcb656f5278a105fa19f55b76b58af9c0 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 08:13:45 +0100 Subject: [PATCH 062/538] Bad Conda, bad Conda --- modules/nf-core/software/phantompeakqualtools.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index cbf1541a3..ba2b6dd12 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -12,7 +12,7 @@ process PHANTOMPEAKQUALTOOLS { //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" conda (params.conda ? "bioconda::phantompeakqualtools=1.2.2" : null) - + input: tuple val(meta), path(bam) val opts @@ -25,7 +25,8 @@ process PHANTOMPEAKQUALTOOLS { script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ - Rscript -e "library(caTools); source(run_spp.R)" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + RUN_SPP=`which run_spp.R` + Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus Rscript -e "load('${prefix}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" touch phantompeakqualtools.version.txt From 3dfb7ad7ecc2d72aa20cb9eb1bcc9fbade33dd48 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 11:51:14 +0100 Subject: [PATCH 063/538] Fix indents --- modules/local/process/bedtools_genomecov.nf | 6 +-- modules/local/process/check_samplesheet.nf | 4 +- modules/local/process/filter_bam.nf | 6 +-- modules/local/process/get_chrom_sizes.nf | 4 +- .../local/process/get_software_versions.nf | 6 +-- modules/local/process/gtf2bed.nf | 4 +- modules/local/process/make_genome_filter.nf | 4 +- modules/local/process/output_documentation.nf | 4 +- modules/local/process/remove_bam_orphans.nf | 4 +- modules/nf-core/software/bwa_index.nf | 6 +-- modules/nf-core/software/bwa_mem.nf | 6 +-- .../software/deeptools_computematrix.nf | 6 +-- .../software/deeptools_plotfingerprint.nf | 6 +-- .../nf-core/software/deeptools_plotheatmap.nf | 6 +-- .../nf-core/software/deeptools_plotprofile.nf | 6 +-- modules/nf-core/software/fastqc.nf | 6 +-- .../nf-core/software/homer_annotatepeaks.nf | 8 ++-- modules/nf-core/software/macs2_callpeak.nf | 43 +++++++++++++++++++ .../nf-core/software/phantompeakqualtools.nf | 6 +-- .../software/picard_collectmultiplemetrics.nf | 6 +-- .../nf-core/software/picard_markduplicates.nf | 6 +-- .../nf-core/software/picard_mergesamfiles.nf | 6 +-- modules/nf-core/software/preseq_lcextrap.nf | 6 +-- modules/nf-core/software/samtools_flagstat.nf | 6 +-- modules/nf-core/software/samtools_idxstats.nf | 6 +-- modules/nf-core/software/samtools_index.nf | 6 +-- modules/nf-core/software/samtools_sort.nf | 6 +-- modules/nf-core/software/samtools_stats.nf | 6 +-- modules/nf-core/software/trimgalore.nf | 6 +-- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 6 +-- 30 files changed, 125 insertions(+), 82 deletions(-) diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 290f64aa7..7b0860ba1 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -4,9 +4,9 @@ process BEDTOOLS_GENOMECOV { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/check_samplesheet.nf b/modules/local/process/check_samplesheet.nf index 79357dee2..757453eb3 100755 --- a/modules/local/process/check_samplesheet.nf +++ b/modules/local/process/check_samplesheet.nf @@ -6,8 +6,8 @@ process CHECK_SAMPLESHEET { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/filter_bam.nf b/modules/local/process/filter_bam.nf index f3e215889..6302d858e 100644 --- a/modules/local/process/filter_bam.nf +++ b/modules/local/process/filter_bam.nf @@ -7,9 +7,9 @@ process FILTER_BAM { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 3dfed0f80..6051b4dfd 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -6,8 +6,8 @@ process GET_CHROM_SIZES { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index 0a90a0c62..c946bafc0 100755 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -5,9 +5,9 @@ process GET_SOFTWARE_VERSIONS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.yaml')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.yaml')) null + else filename } input: val opts diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 43536aa26..bcc2848e2 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -7,8 +7,8 @@ process GTF2BED { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 7341751a8..542d566c5 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -6,8 +6,8 @@ process MAKE_GENOME_FILTER { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index 831760931..39332b811 100755 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -5,8 +5,8 @@ process OUTPUT_DOCUMENTATION { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/remove_bam_orphans.nf b/modules/local/process/remove_bam_orphans.nf index 83c3f654b..52a6ade92 100644 --- a/modules/local/process/remove_bam_orphans.nf +++ b/modules/local/process/remove_bam_orphans.nf @@ -7,8 +7,8 @@ process REMOVE_BAM_ORPHANS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else filename } + if (opts.publish_results == "none") null + else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index f6039ab45..775e0254b 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -4,9 +4,9 @@ process BWA_INDEX { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 771a77163..ff8657c88 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -4,9 +4,9 @@ process BWA_MEM { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 7b3ef284b..7d597f69b 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -4,9 +4,9 @@ process DEEPTOOLS_COMPUTEMATRIX { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index bd8df5b21..dec02162d 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -4,9 +4,9 @@ process DEEPTOOLS_PLOTFINGERPRINT { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 539195d76..501fa106a 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -4,9 +4,9 @@ process DEEPTOOLS_PLOTHEATMAP { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 3de239dfb..35ee9b2ec 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -4,9 +4,9 @@ process DEEPTOOLS_PLOTPROFILE { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index 8bba91ef2..c6adb0693 100755 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -4,9 +4,9 @@ process FASTQC { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 2b501b555..c45b7383f 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -4,15 +4,15 @@ process HOMER_ANNOTATEPEAKS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" conda (params.conda ? "bioconda::homer=4.11" : null) - + input: tuple val(meta), path(bed) path fasta diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index b7536f06b..67b4e84ad 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -3,6 +3,49 @@ container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //echo \$(macs2 --version 2>&1) > macs2.version.txt conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) +process MACS2_CALLPEAK { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" + //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" + + conda (params.conda ? "bioconda::homer=4.11" : null) + + input: + tuple val(meta), path(bed) + path fasta + path gtf + val opts + + output: + tuple val(meta), path("*.txt"), emit: txt + path "*.version.txt", emit: version + + script: + prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + + """ + annotatePeaks.pl \\ + $opts.args \\ + $bed \\ + $fasta \\ + -gtf $gtf \\ + -cpu $task.cpus \\ + > ${prefix}.annotatePeaks.txt + + touch homer.version.txt + """ +} + + + // /* // * STEP 6.2: Call peaks with MACS2 and calculate FRiP score // */ diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index ba2b6dd12..44db1529c 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -4,9 +4,9 @@ process PHANTOMPEAKQUALTOOLS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index aaaea4d63..37ab6a4f2 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -4,9 +4,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 73ab8f0ac..793c37ba7 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -4,9 +4,9 @@ process PICARD_MARKDUPLICATES { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 19a7d8d6f..928f2dd60 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -4,9 +4,9 @@ process PICARD_MERGESAMFILES { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 6ba2a7a7e..34e156f51 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -5,9 +5,9 @@ process PRESEQ_LCEXTRAP { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index e641c5b0e..524dc6fda 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -3,9 +3,9 @@ process SAMTOOLS_FLAGSTAT { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index cacd23baa..f4c2faf6f 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -3,9 +3,9 @@ process SAMTOOLS_IDXSTATS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 1a99fcaca..c11c1bc60 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -3,9 +3,9 @@ process SAMTOOLS_INDEX { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index a3532a5b7..05fa3207d 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -4,9 +4,9 @@ process SAMTOOLS_SORT { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 7a0d68c26..b3452d08c 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -3,9 +3,9 @@ process SAMTOOLS_STATS { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 1dcef6bd7..8c773426a 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -4,9 +4,9 @@ process TRIMGALORE { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 176b6b237..6b702e9dd 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -4,9 +4,9 @@ process UCSC_BEDRAPHTOBIGWIG { publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + if (opts.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" From 7cb42c2b81238e060cb28d5dd251e2acd7afda06 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 14:30:45 +0100 Subject: [PATCH 064/538] Add in macs2 process --- conf/modules.config | 6 + main.nf | 165 +++++------------- modules/local/process/calc_frip.nf | 3 + .../nf-core/software/homer_annotatepeaks.nf | 11 +- modules/nf-core/software/macs2_callpeak.nf | 100 +++-------- 5 files changed, 83 insertions(+), 202 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 491aae56d..e4889221c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -150,6 +150,12 @@ params { publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" } + 'macs2_callpeak' { + args = "--keep-dup all" + suffix = "" + publish_dir = "bwa/mergedLibrary/macs2" + publish_results = "all" + } 'homer_annotatepeaks_macs2' { args = "-gid" suffix = ".mLb.clN" diff --git a/main.nf b/main.nf index 5e0950a7f..2c3ecd679 100755 --- a/main.nf +++ b/main.nf @@ -42,9 +42,6 @@ params.macs_gsize = params.genome ? params.genomes[ params.genome ].macs_gsize ? params.blacklist = params.genome ? params.genomes[ params.genome ].blacklist ?: false : false params.anno_readme = params.genome ? params.genomes[ params.genome ].readme ?: false : false -// Global variables -def PEAK_TYPE = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - //////////////////////////////////////////////////// /* -- VALIDATE INPUTS -- */ //////////////////////////////////////////////////// @@ -162,8 +159,8 @@ include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deept include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools_plotheatmap' include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools_plotfingerprint' include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools' -//include { MACSC2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' -//include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/software/homer_annotatepeaks' +include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' +include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/software/homer_annotatepeaks' //include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' include { MULTIQC } from './modules/nf-core/software/multiqc' @@ -278,10 +275,10 @@ workflow { params.modules['picard_collectmultiplemetrics'] ) - PRESEQ_LCEXTRAP ( - CLEAN_BAM.out.bam, - params.modules['preseq_lcextrap'] - ) + // PRESEQ_LCEXTRAP ( + // CLEAN_BAM.out.bam, + // params.modules['preseq_lcextrap'] + // ) PHANTOMPEAKQUALTOOLS ( CLEAN_BAM.out.bam, @@ -328,6 +325,46 @@ workflow { params.modules['deeptools_plotfingerprint'] ) + /* + * Call peaks + */ + CLEAN_BAM + .out + .bam + .map { meta, bam -> meta.control ? null : [ meta.id, bam ] } + .set { ch_control_bam } + + // Create channel: [ val(meta), ip_bam, control_bam ] + CLEAN_BAM + .out + .bam + .map { meta, bam -> meta.control ? [ meta.control, meta, bam ] : null } + .combine(ch_control_bam, by: 0) + .map { it -> [ it[1] , it[2], it[3] ] } + .set { ch_control_bam } + + if (params.macs_gsize) { + peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" + pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' + fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' + pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + params.modules['macs2_callpeak'].publish_dir += "/$peakType" + params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" + MACS2_CALLPEAK ( + ch_control_bam, + params.macs_gsize, + params.modules['macs2_callpeak'] + ) + + HOMER_ANNOTATEPEAKS ( + MACS2_CALLPEAK.out.peak, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_macs2'] + ) + } + /* * Pipeline reporting */ @@ -362,116 +399,6 @@ workflow.onComplete { /* -- THE END -- */ //////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- MERGE LIBRARY PEAK ANALYSIS -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// // Create channel linking IP bams with control bams -// ch_rm_orphan_bam_macs_1 -// .combine(ch_rm_orphan_bam_macs_2) -// .set { ch_rm_orphan_bam_macs_1 } -// -// ch_design_controls_csv -// .combine(ch_rm_orphan_bam_macs_1) -// .filter { it[0] == it[5] && it[1] == it[7] } -// .join(ch_rm_orphan_flagstat_macs) -// .map { it -> it[2..-1] } -// .into { ch_group_bam_macs; -// ch_group_bam_plotfingerprint; -// ch_group_bam_counts } -// -// /* -// * STEP 6.2: Call peaks with MACS2 and calculate FRiP score -// */ -// process MACS2 { -// tag "${ip} vs ${control}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.tsv')) "qc/$filename" -// else if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_macs -// path peak_count_header from ch_peak_count_header -// path frip_score_header from ch_frip_score_header -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path("*.$PEAK_TYPE") into ch_macs_homer, -// ch_macs_qc, -// ch_macs_consensus -// path '*igv.txt' into ch_macs_igv -// path '*_mqc.tsv' into ch_macs_mqc -// path '*.{bed,xls,gappedPeak,bdg}' -// -// script: -// broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" -// format = params.single_end ? 'BAM' : 'BAMPE' -// pileup = params.save_macs_pileup ? '-B --SPMR' : '' -// fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' -// pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' -// """ -// macs2 callpeak \\ -// -t ${ipbam[0]} \\ -// -c ${controlbam[0]} \\ -// $broad \\ -// -f $format \\ -// -g $params.macs_gsize \\ -// -n $ip \\ -// $pileup \\ -// $fdr \\ -// $pvalue \\ -// --keep-dup all -// -// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv -// -// READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') -// grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv -// -// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt -// """ -// } -// -// /* -// * STEP 6.3: Annotate peaks with HOMER -// */ -// process MACS2_ANNOTATE { -// tag "${ip} vs ${control}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && !params.skip_peak_annotation -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path(peak) from ch_macs_homer -// path fasta from ch_fasta -// path gtf from ch_gtf -// -// output: -// path '*.txt' into ch_macs_annotate -// -// script: -// """ -// annotatePeaks.pl \\ -// $peak \\ -// $fasta \\ -// -gid \\ -// -gtf $gtf \\ -// -cpu $task.cpus \\ -// > ${ip}_peaks.annotatePeaks.txt -// """ -// } -// // /* // * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation // */ diff --git a/modules/local/process/calc_frip.nf b/modules/local/process/calc_frip.nf index a90c447d1..3ccc18853 100644 --- a/modules/local/process/calc_frip.nf +++ b/modules/local/process/calc_frip.nf @@ -1 +1,4 @@ conda (params.conda ? "${baseDir}/environment.yml" : null) + +READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') +grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index c45b7383f..33fba69cd 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -1,3 +1,5 @@ +def VERSION = 4.11 + process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' @@ -14,7 +16,7 @@ process HOMER_ANNOTATEPEAKS { conda (params.conda ? "bioconda::homer=4.11" : null) input: - tuple val(meta), path(bed) + tuple val(meta), path(peak) path fasta path gtf val opts @@ -25,16 +27,15 @@ process HOMER_ANNOTATEPEAKS { script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" - """ annotatePeaks.pl \\ - $opts.args \\ - $bed \\ + $peak \\ $fasta \\ + $opts.args \\ -gtf $gtf \\ -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt - touch homer.version.txt + echo $VERSION > homer.version.txt """ } diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 67b4e84ad..2cf8c3ae0 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,8 +1,3 @@ -container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" -//container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" -//echo \$(macs2 --version 2>&1) > macs2.version.txt -conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) - process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' @@ -13,92 +8,41 @@ process MACS2_CALLPEAK { else if (filename.endsWith('.version.txt')) null else filename } - container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" - //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" + container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" + //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" - conda (params.conda ? "bioconda::homer=4.11" : null) + conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) input: - tuple val(meta), path(bed) - path fasta - path gtf + tuple val(meta), path(ipbam), path(controlbam) + val macs2_gsize val opts output: - tuple val(meta), path("*.txt"), emit: txt + tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak + path '*.xls', emit: xls + path '*.gappedPeak', emit: gapped optional true + path '*.bed', emit: bed optional true + path '*.bdg', emit: bdg optional true path "*.version.txt", emit: version script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" - + format = meta.single_end ? 'BAM' : 'BAMPE' + control = controlbam ? "--control $controlbam" : '' """ - annotatePeaks.pl \\ + macs2 \\ + callpeak \\ $opts.args \\ - $bed \\ - $fasta \\ - -gtf $gtf \\ - -cpu $task.cpus \\ - > ${prefix}.annotatePeaks.txt + --gsize $macs2_gsize \\ + --format $format \\ + --name $prefix \\ + --treatment $ipbam \\ + $control - touch homer.version.txt + echo \$(macs2 --version 2>&1) > macs2.version.txt """ } - - - -// /* -// * STEP 6.2: Call peaks with MACS2 and calculate FRiP score -// */ -// process MACS2 { -// tag "${ip} vs ${control}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.tsv')) "qc/$filename" -// else if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), path(ipbam), val(control), path(controlbam), path(ipflagstat) from ch_group_bam_macs -// path peak_count_header from ch_peak_count_header -// path frip_score_header from ch_frip_score_header -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), val(ip), val(control), path("*.$PEAK_TYPE") into ch_macs_homer, -// ch_macs_qc, -// ch_macs_consensus -// path '*igv.txt' into ch_macs_igv -// path '*_mqc.tsv' into ch_macs_mqc -// path '*.{bed,xls,gappedPeak,bdg}' -// -// script: -// broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" -// format = params.single_end ? 'BAM' : 'BAMPE' -// pileup = params.save_macs_pileup ? '-B --SPMR' : '' -// fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' -// pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' -// """ -// macs2 callpeak \\ -// -t ${ipbam[0]} \\ -// -c ${controlbam[0]} \\ -// $broad \\ -// -f $format \\ -// -g $params.macs_gsize \\ -// -n $ip \\ -// $pileup \\ -// $fdr \\ -// $pvalue \\ -// --keep-dup all -// -// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv -// -// READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') -// grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv +// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv // -// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt -// """ -// } +// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt From 4c38f5d9c2071839098fa0ca60e2f8e0013b1f63 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 14:42:07 +0100 Subject: [PATCH 065/538] Use biocontainers where possible in local modules --- conf/modules.config | 2 +- main.nf | 3 ++- modules/local/process/bedtools_genomecov.nf | 5 ++++- modules/local/process/get_chrom_sizes.nf | 7 +++++-- modules/local/process/gtf2bed.nf | 5 ++++- modules/local/process/make_genome_filter.nf | 5 ++++- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e4889221c..b84f21dfb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -159,7 +159,7 @@ params { 'homer_annotatepeaks_macs2' { args = "-gid" suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/homer" + publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" } 'get_software_versions' { diff --git a/main.nf b/main.nf index 2c3ecd679..96bb22320 100755 --- a/main.nf +++ b/main.nf @@ -357,12 +357,13 @@ workflow { params.modules['macs2_callpeak'] ) + params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS ( MACS2_CALLPEAK.out.peak, ch_fasta, ch_gtf, params.modules['homer_annotatepeaks_macs2'] - ) + ) } /* diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 7b0860ba1..e72aebb58 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -8,7 +8,10 @@ process BEDTOOLS_GENOMECOV { else if (filename.endsWith('.version.txt')) null else filename } - conda (params.conda ? "${baseDir}/environment.yml" : null) + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) input: tuple val(meta), path(bam), path(flagstat) diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 6051b4dfd..811bdfa66 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -9,8 +9,11 @@ process GET_CHROM_SIZES { if (opts.publish_results == "none") null else filename } - conda (params.conda ? "${baseDir}/environment.yml" : null) - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + input: path fasta val opts diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index bcc2848e2..9abce96e6 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -10,7 +10,10 @@ process GTF2BED { if (opts.publish_results == "none") null else filename } - conda (params.conda ? "${baseDir}/environment.yml" : null) + container "quay.io/biocontainers/perl:5.26.2" + //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" + + conda (params.conda ? "conda-forge::perl=5.26.2" : null) input: path gtf diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 542d566c5..bfc5a2506 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -9,7 +9,10 @@ process MAKE_GENOME_FILTER { if (opts.publish_results == "none") null else filename } - conda (params.conda ? "${baseDir}/environment.yml" : null) + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) input: path sizes From c6a02fa531aafec234b5f01ba859f7f2fd202bdd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 16:02:31 +0100 Subject: [PATCH 066/538] Add commands to get software version --- main.nf | 2 +- modules/local/process/bedtools_genomecov.nf | 4 +++- modules/local/process/get_chrom_sizes.nf | 4 ++++ modules/local/process/make_genome_filter.nf | 7 ++++++- modules/nf-core/software/bwa_index.nf | 4 +++- modules/nf-core/software/bwa_mem.nf | 5 ++++- modules/nf-core/software/deeptools_computematrix.nf | 4 +++- modules/nf-core/software/deeptools_plotfingerprint.nf | 6 ++++-- modules/nf-core/software/deeptools_plotheatmap.nf | 6 ++++-- modules/nf-core/software/deeptools_plotprofile.nf | 6 ++++-- modules/nf-core/software/fastqc.nf | 6 ++++-- modules/nf-core/software/homer_annotatepeaks.nf | 5 +++-- modules/nf-core/software/macs2_callpeak.nf | 4 +++- modules/nf-core/software/multiqc.nf | 9 ++++----- modules/nf-core/software/phantompeakqualtools.nf | 5 ++++- .../nf-core/software/picard_collectmultiplemetrics.nf | 5 ++++- modules/nf-core/software/picard_markduplicates.nf | 7 +++++-- modules/nf-core/software/picard_mergesamfiles.nf | 8 +++++--- modules/nf-core/software/preseq_lcextrap.nf | 5 ++++- modules/nf-core/software/samtools_flagstat.nf | 4 +++- modules/nf-core/software/samtools_idxstats.nf | 6 ++++-- modules/nf-core/software/samtools_index.nf | 6 ++++-- modules/nf-core/software/samtools_sort.nf | 4 +++- modules/nf-core/software/samtools_stats.nf | 6 ++++-- modules/nf-core/software/subread_featurecounts.nf | 2 ++ modules/nf-core/software/trimgalore.nf | 6 ++++-- modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 4 ++++ 27 files changed, 100 insertions(+), 40 deletions(-) diff --git a/main.nf b/main.nf index 96bb22320..e4763c3f3 100755 --- a/main.nf +++ b/main.nf @@ -259,7 +259,7 @@ workflow { // Fix getting name sorted BAM here for PE/SE CLEAN_BAM ( MARK_DUPLICATES.out.bam.join(MARK_DUPLICATES.out.bai, by: [0]), - MAKE_GENOME_FILTER.out.collect(), + MAKE_GENOME_FILTER.out.bed.collect(), ch_bamtools_filter_config, params.modules['filter_bam'], params.modules['remove_bam_orphans'], diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index e72aebb58..b167d11fc 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'bedtools' + process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' @@ -39,6 +41,6 @@ process BEDTOOLS_GENOMECOV { $extend \\ | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph - bedtools --version > bedtools.version.txt + bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 811bdfa66..b90e23ab1 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + /* * Get chromosome sizes from a fasta file */ @@ -21,10 +23,12 @@ process GET_CHROM_SIZES { output: path '*.sizes', emit: sizes path '*.fai', emit: fai + path "*.version.txt", emit: version script: """ samtools faidx $fasta cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index bfc5a2506..59addb3e4 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'bedtools' + /* * Prepare genome intervals for filtering by removing regions in blacklist file */ @@ -20,17 +22,20 @@ process MAKE_GENOME_FILTER { val opts output: - path '*.bed' + path '*.bed', emit: bed + path "*.version.txt", emit: version script: file_out = "${sizes.simpleName}.include_regions.bed" if (params.blacklist) { """ sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out + bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt """ } else { """ awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out + bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt """ } } diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index 775e0254b..cbe788bd7 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'bwa' + process BWA_INDEX { tag "$fasta" label 'process_high' @@ -24,6 +26,6 @@ process BWA_INDEX { script: """ bwa index $opts.args $fasta - echo \$(bwa 2>&1) | sed -n "s/.*\\(v.*\$\\)/\\1/p" > bwa.version.txt + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index ff8657c88..73012e770 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'bwa' + process BWA_MEM { tag "$meta.id" label 'process_high' @@ -34,6 +36,7 @@ process BWA_MEM { $fasta \\ $reads \\ | samtools view $opts.args2 -@ $task.cpus -bS -o ${prefix}.bam - - echo \$(bwa 2>&1) | sed -n "s/.*\\(v.*\$\\)/\\1/p" > bwa.version.txt + + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 7d597f69b..f1d303a56 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'deeptools' + process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' @@ -34,6 +36,6 @@ process DEEPTOOLS_COMPUTEMATRIX { --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ --numberOfProcessors $task.cpus - echo \$(computeMatrix --version 2>&1) > deeptools.version.txt || true + computeMatrix --version | sed -e "s/computeMatrix //g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index dec02162d..35f706535 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'deeptools' + process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' @@ -12,7 +14,7 @@ process DEEPTOOLS_PLOTFINGERPRINT { //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - + input: tuple val(meta), path(bams), path(bais) val opts @@ -36,6 +38,6 @@ process DEEPTOOLS_PLOTFINGERPRINT { --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ --numberOfProcessors $task.cpus - echo \$(plotFingerprint --version 2>&1) > deeptools.version.txt || true + plotFingerprint --version | sed -e "s/plotFingerprint //g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 501fa106a..fa9787136 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'deeptools' + process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' @@ -12,7 +14,7 @@ process DEEPTOOLS_PLOTHEATMAP { //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - + input: tuple val(meta), path(matrix) val opts @@ -31,6 +33,6 @@ process DEEPTOOLS_PLOTHEATMAP { --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab - echo \$(plotHeatmap --version 2>&1) > deeptools.version.txt || true + plotHeatmap --version | sed -e "s/plotHeatmap //g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 35ee9b2ec..b90c171a9 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'deeptools' + process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' @@ -12,7 +14,7 @@ process DEEPTOOLS_PLOTPROFILE { //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - + input: tuple val(meta), path(matrix) val opts @@ -31,6 +33,6 @@ process DEEPTOOLS_PLOTPROFILE { --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab - echo \$(plotProfile --version 2>&1) > deeptools.version.txt || true + plotProfile --version | sed -e "s/plotProfile //g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index c6adb0693..4a69d8218 100755 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'fastqc' + process FASTQC { tag "$meta.id" label 'process_medium' @@ -29,14 +31,14 @@ process FASTQC { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz fastqc $opts.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt + fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz fastqc $opts.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > fastqc.version.txt + fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 33fba69cd..1e0a2f362 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -1,4 +1,5 @@ -def VERSION = 4.11 +def SOFTWARE = 'homer' +def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { tag "$meta.id" @@ -36,6 +37,6 @@ process HOMER_ANNOTATEPEAKS { -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt - echo $VERSION > homer.version.txt + echo $VERSION > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 2cf8c3ae0..f28d6908f 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'macs2' + process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' @@ -40,7 +42,7 @@ process MACS2_CALLPEAK { --treatment $ipbam \\ $control - echo \$(macs2 --version 2>&1) > macs2.version.txt + macs2 --version | sed -e "s/macs2 //g" > ${SOFTWARE}.version.txt """ } // cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv diff --git a/modules/nf-core/software/multiqc.nf b/modules/nf-core/software/multiqc.nf index 8ec114575..8280307da 100755 --- a/modules/nf-core/software/multiqc.nf +++ b/modules/nf-core/software/multiqc.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'multiqc' + // Has the run name been specified by the user? // this has the bonus effect of catching both -name and --name custom_runName = params.name @@ -21,9 +23,6 @@ if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { // """.stripIndent() } // .set { ch_workflow_summary } -/* - * MultiQC - */ process MULTIQC { publishDir "${params.outdir}/multiqc", mode: params.publish_dir_mode @@ -31,7 +30,7 @@ process MULTIQC { //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" conda (params.conda ? "bioconda::multiqc=1.9" : null) - + input: path (multiqc_config) from ch_multiqc_config path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) @@ -52,6 +51,6 @@ process MULTIQC { // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time """ multiqc -f $rtitle $rfilename $custom_config_file . - multiqc --version > multiqc.version.txt + multiqc --version | sed -e "s/multiqc, version //g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 44db1529c..22b2d9e74 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -1,3 +1,6 @@ +def SOFTWARE = 'phantompeakqualtools' +def VERSION = '1.2.2' + process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' @@ -29,6 +32,6 @@ process PHANTOMPEAKQUALTOOLS { Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus Rscript -e "load('${prefix}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" - touch phantompeakqualtools.version.txt + echo $VERSION > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 37ab6a4f2..8b3371c9a 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'picard' + process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' @@ -39,6 +41,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { INPUT=$bam \\ OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta - picard CollectMultipleMetrics --version &> picard.version.txt || true + + echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 793c37ba7..9636e0506 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'picard' + process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' @@ -12,7 +14,7 @@ process PICARD_MARKDUPLICATES { //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" conda (params.conda ? "bioconda::picard=2.23.2" : null) - + input: tuple val(meta), path(bam) val opts @@ -38,6 +40,7 @@ process PICARD_MARKDUPLICATES { INPUT=$bam \\ OUTPUT=${prefix}.bam \\ METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt - picard MarkDuplicates --version &> picard.version.txt || true + + echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 928f2dd60..466d767ca 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'picard' + process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' @@ -12,7 +14,7 @@ process PICARD_MERGESAMFILES { //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" conda (params.conda ? "bioconda::picard=2.23.2" : null) - + input: tuple val(meta), path(bams) val opts @@ -38,12 +40,12 @@ process PICARD_MERGESAMFILES { $opts.args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ OUTPUT=${prefix}.bam - picard MergeSamFiles --version &> picard.version.txt || true + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt """ } else { """ ln -s ${bam_files[0]} ${prefix}.bam - picard MergeSamFiles --version &> picard.version.txt || true + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt """ } } diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 34e156f51..b537077e9 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'preseq' + process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' @@ -34,6 +36,7 @@ process PRESEQ_LCEXTRAP { -output ${prefix}.ccurve.txt \\ $bam cp .command.err ${prefix}.command.log - preseq &> preseq.version.txt + + echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index 524dc6fda..537ab8cf6 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + process SAMTOOLS_FLAGSTAT { tag "$meta.id" publishDir "${params.outdir}/${opts.publish_dir}", @@ -23,6 +25,6 @@ process SAMTOOLS_FLAGSTAT { script: """ samtools flagstat $bam > ${bam}.flagstat - samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index f4c2faf6f..cdedf6bdf 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + process SAMTOOLS_IDXSTATS { tag "$meta.id" publishDir "${params.outdir}/${opts.publish_dir}", @@ -11,7 +13,7 @@ process SAMTOOLS_IDXSTATS { //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" conda (params.conda ? "bioconda::samtools=1.10" : null) - + input: tuple val(meta), path(bam), path(bai) val opts @@ -23,6 +25,6 @@ process SAMTOOLS_IDXSTATS { script: """ samtools idxstats $bam > ${bam}.idxstats - samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index c11c1bc60..7c17e1fe0 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + process SAMTOOLS_INDEX { tag "$meta.id" publishDir "${params.outdir}/${opts.publish_dir}", @@ -11,7 +13,7 @@ process SAMTOOLS_INDEX { //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" conda (params.conda ? "bioconda::samtools=1.10" : null) - + input: tuple val(meta), path(bam) val opts @@ -23,6 +25,6 @@ process SAMTOOLS_INDEX { script: """ samtools index $bam - samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 05fa3207d..61289303d 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' @@ -25,6 +27,6 @@ process SAMTOOLS_SORT { prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ samtools sort $opts.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index b3452d08c..55f125797 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'samtools' + process SAMTOOLS_STATS { tag "$meta.id" publishDir "${params.outdir}/${opts.publish_dir}", @@ -11,7 +13,7 @@ process SAMTOOLS_STATS { //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" conda (params.conda ? "bioconda::samtools=1.10" : null) - + input: tuple val(meta), path(bam), path(bai) val opts @@ -23,6 +25,6 @@ process SAMTOOLS_STATS { script: """ samtools stats $bam > ${bam}.stats - samtools --version | sed -n "s/.*\\(v.*\$\\)/\\1/p" > samtools.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index c50b2bc79..536aa7e8b 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,7 +1,9 @@ +def SOFTWARE = 'subread' container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" //echo \$(featureCounts -v 2>&1) > featurecounts.version.txt conda (params.conda ? "bioconda::subread=2.0.1" : null) +//echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${SOFTWARE}.version.txt // /* // * STEP 7.3: Count reads in consensus peaks with featureCounts diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 8c773426a..ab1bd37a5 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -1,3 +1,5 @@ +def SOFTWARE = 'trimgalore' + process TRIMGALORE { tag "$meta.id" label 'process_high' @@ -54,7 +56,7 @@ process TRIMGALORE { $c_r1 \\ $tpc_r1 \\ ${prefix}.fastq.gz - trim_galore --version > trim_galore.version.txt + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${SOFTWARE}.version.txt """ } else { """ @@ -71,7 +73,7 @@ process TRIMGALORE { $tpc_r2 \\ ${prefix}_1.fastq.gz \\ ${prefix}_2.fastq.gz - trim_galore --version > trim_galore.version.txt + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${SOFTWARE}.version.txt """ } } diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 6b702e9dd..828dd647f 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -1,3 +1,6 @@ +def SOFTWARE = 'ucsc' +def VERSION = '377' + process UCSC_BEDRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' @@ -25,5 +28,6 @@ process UCSC_BEDRAPHTOBIGWIG { prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig + echo $VERSION > ${SOFTWARE}.version.txt """ } From 7ee543803fe60fed37237d36711c44a1b00edce3 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 16:21:13 +0100 Subject: [PATCH 067/538] Add Groovy workflow_summary --- lib/Schema.groovy | 16 ++++++++++++++++ main.nf | 15 +++++++++++---- modules/nf-core/software/multiqc.nf | 16 ---------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/lib/Schema.groovy b/lib/Schema.groovy index e07e454c3..3f25c88f0 100755 --- a/lib/Schema.groovy +++ b/lib/Schema.groovy @@ -166,4 +166,20 @@ class Schema { } return summary } + + static String params_mqc_summary(summary) { + String yaml_file_text = """ + id: 'nf-core-chipseq-summary' + description: " - this information is collected when the pipeline is started." + section_name: 'nf-core/chipseq Workflow Summary' + section_href: 'https://github.com/nf-core/chipseq' + plot_type: 'html' + data: | +
+ ${summary.collect { k,v -> "
$k
${v ?: 'N/A'}
" }.join("\n")} +
+ """.stripIndent() + + return yaml_file_text + } } diff --git a/main.nf b/main.nf index e4763c3f3..67ad07110 100755 --- a/main.nf +++ b/main.nf @@ -379,10 +379,17 @@ workflow { params.modules['output_documentation'] ) - // MULTIQC( - // summary, - // FASTQC.out, - // ch_multiqc_config + // /* + // * MultiQC + // */ + // workflow_summary = Schema.params_mqc_summary(summary) + // ch_workflow_summary = Channel.value(workflow_summary) + // MULTIQC ( + // ch_multiqc_config, + // ch_multiqc_custom_config.collect().ifEmpty([]), + // FASTQC.out.zip.collect().ifEmpty([]), + // //GET_SOFTWARE_VERSIONS.out.yml.collect(), + // ch_workflow_summary // ) } diff --git a/modules/nf-core/software/multiqc.nf b/modules/nf-core/software/multiqc.nf index 8280307da..bc5616be3 100755 --- a/modules/nf-core/software/multiqc.nf +++ b/modules/nf-core/software/multiqc.nf @@ -7,22 +7,6 @@ if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { custom_runName = workflow.runName } -// Channel.from(summary.collect{ [it.key, it.value] }) -// .map { k,v -> "
$k
${v ?: 'N/A'}
" } -// .reduce { a, b -> return [a, b].join("\n ") } -// .map { x -> """ -// id: 'nf-core-chipseq-summary' -// description: " - this information is collected when the pipeline is started." -// section_name: 'nf-core/chipseq Workflow Summary' -// section_href: 'https://github.com/nf-core/chipseq' -// plot_type: 'html' -// data: | -//
-// $x -//
-// """.stripIndent() } -// .set { ch_workflow_summary } - process MULTIQC { publishDir "${params.outdir}/multiqc", mode: params.publish_dir_mode From 6ff0f957c0a9c1618fec00bfe77b83edf005ee67 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sat, 25 Jul 2020 20:32:26 +0100 Subject: [PATCH 068/538] Collect software versions --- main.nf | 74 ++++++++++++++----- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 1 + modules/nf-core/subworkflow/qc_trim.nf | 6 +- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/main.nf b/main.nf index 67ad07110..7bd3be182 100755 --- a/main.nf +++ b/main.nf @@ -275,10 +275,10 @@ workflow { params.modules['picard_collectmultiplemetrics'] ) - // PRESEQ_LCEXTRAP ( - // CLEAN_BAM.out.bam, - // params.modules['preseq_lcextrap'] - // ) + PRESEQ_LCEXTRAP ( + CLEAN_BAM.out.bam, + params.modules['preseq_lcextrap'] + ) PHANTOMPEAKQUALTOOLS ( CLEAN_BAM.out.bam, @@ -318,32 +318,39 @@ workflow { params.modules['deeptools_plotheatmap'] ) - // Join control BAM here too to generate plots with IP and CONTROL together - params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" - DEEPTOOLS_PLOTFINGERPRINT ( - CLEAN_BAM.out.bam.join(CLEAN_BAM.out.bai, by: [0]), - params.modules['deeptools_plotfingerprint'] - ) - /* - * Call peaks + * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] */ CLEAN_BAM .out .bam - .map { meta, bam -> meta.control ? null : [ meta.id, bam ] } - .set { ch_control_bam } + .join ( CLEAN_BAM.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } + .set { ch_ip_control_bam } - // Create channel: [ val(meta), ip_bam, control_bam ] CLEAN_BAM .out .bam - .map { meta, bam -> meta.control ? [ meta.control, meta, bam ] : null } - .combine(ch_control_bam, by: 0) - .map { it -> [ it[1] , it[2], it[3] ] } - .set { ch_control_bam } + .join ( CLEAN_BAM.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } + .combine(ch_ip_control_bam, by: 0) + .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + .set { ch_ip_control_bam } + + /* + * plotFingerprint for IP and control together + */ + params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" + DEEPTOOLS_PLOTFINGERPRINT ( + ch_ip_control_bam, + params.modules['deeptools_plotfingerprint'] + ) if (params.macs_gsize) { + + /* + * Call peaks + */ peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' @@ -351,8 +358,14 @@ workflow { pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' params.modules['macs2_callpeak'].publish_dir += "/$peakType" params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" + + // Create channel: [ val(meta), ip_bam, control_bam ] + ch_ip_control_bam + .map { it -> [ it[0] , it[1][0], it[1][1] ] } + .set { ch_ip_control_bam } + MACS2_CALLPEAK ( - ch_control_bam, + ch_ip_control_bam, params.macs_gsize, params.modules['macs2_callpeak'] ) @@ -369,6 +382,27 @@ workflow { /* * Pipeline reporting */ + MAP_READS.out.bwa_version.first() + .concat( + QC_TRIM.out.fastqc_version.first().ifEmpty(null), + QC_TRIM.out.trimgalore_version.first().ifEmpty(null), + MAP_READS.out.samtools_version.first().ifEmpty(null), + MAKE_GENOME_FILTER.out.version.first().ifEmpty(null), + CLEAN_BAM.out.bamtools_version.first().ifEmpty(null), + PICARD_MERGESAMFILES.out.version.first().ifEmpty(null), + PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null), + PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null), + UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null), + DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null), + MACS2_CALLPEAK.out.version.first().ifEmpty(null), + HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null), + //SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null), + //MULTIQC.out.version.first().ifEmpty(null), + //echo \$(R --version 2>&1) > v_R.txt + ) + .map { it } + .set { versions } + //GET_SOFTWARE_VERSIONS ( // params.modules['get_software_versions'] //) diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 828dd647f..544550f35 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -23,6 +23,7 @@ process UCSC_BEDRAPHTOBIGWIG { output: tuple val(meta), path("*.bigWig"), emit: bigwig + path "*.version.txt", emit: version script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" diff --git a/modules/nf-core/subworkflow/qc_trim.nf b/modules/nf-core/subworkflow/qc_trim.nf index f99089a02..e2f0c6fb0 100644 --- a/modules/nf-core/subworkflow/qc_trim.nf +++ b/modules/nf-core/subworkflow/qc_trim.nf @@ -27,13 +27,13 @@ workflow QC_TRIM { trim_html = Channel.empty() trim_zip = Channel.empty() trim_log = Channel.empty() - trim_galore_version = Channel.empty() + trimgalore_version = Channel.empty() if (!skip_trimming) { TRIMGALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } trim_html = TRIMGALORE.out.html trim_zip = TRIMGALORE.out.zip trim_log = TRIMGALORE.out.log - trim_galore_version = TRIMGALORE.out.version + trimgalore_version = TRIMGALORE.out.version } emit: @@ -45,5 +45,5 @@ workflow QC_TRIM { trim_html // channel: [ val(meta), [ html ] ] trim_zip // channel: [ val(meta), [ zip ] ] trim_log // channel: [ val(meta), [ txt ] ] - trim_galore_version // path: *.version.txt + trimgalore_version // path: *.version.txt } From 2c5774d639f3d7e1a4a15ef6a8f35ef9c4ccd33b Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sun, 26 Jul 2020 10:27:28 +0100 Subject: [PATCH 069/538] Add software versions --- main.nf | 62 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/main.nf b/main.nf index 7bd3be182..8f1455e62 100755 --- a/main.nf +++ b/main.nf @@ -200,6 +200,9 @@ workflow { ch_blacklist.ifEmpty([]), params.modules['make_genome_filter'] ) + ch_software_versions = Channel.empty() + ch_software_versions + .concat(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) /* * Read QC & trimming @@ -213,6 +216,10 @@ workflow { params.modules['fastqc'], params.modules['trimgalore'] ) + ch_software_versions + .concat(QC_TRIM.out.fastqc_version.first().ifEmpty(null), + QC_TRIM.out.trimgalore_version.first().ifEmpty(null)) + .view() /* * Map reads & BAM QC @@ -226,6 +233,9 @@ workflow { params.modules['bwa_mem'], params.modules['samtools_sort_lib'] ) + // ch_software_versions + // .concat(MAP_READS.out.bwa_version.first(), + // MAP_READS.out.samtools_version.first().ifEmpty(null)) /* * Merge resequenced BAM files @@ -246,6 +256,8 @@ workflow { ch_sort_bam, params.modules['picard_mergesamfiles'] ) + // ch_software_versions + // .concat(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) /* * Mark duplicates & filter BAM files @@ -265,6 +277,8 @@ workflow { params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter'] ) + // ch_software_versions + // .concat(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) /* * Post alignment QC @@ -279,11 +293,15 @@ workflow { CLEAN_BAM.out.bam, params.modules['preseq_lcextrap'] ) + // ch_software_versions + // .concat(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) PHANTOMPEAKQUALTOOLS ( CLEAN_BAM.out.bam, params.modules['phantompeakqualtools'] ) + // ch_software_versions + // .concat(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) /* * Coverage tracks @@ -298,6 +316,8 @@ workflow { GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig'] ) + // ch_software_versions + // .concat(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) /* * Coverage plots @@ -307,6 +327,8 @@ workflow { ch_gene_bed, params.modules['deeptools_computematrix'] ) + // ch_software_versions + // .concat(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix, @@ -369,6 +391,8 @@ workflow { params.macs_gsize, params.modules['macs2_callpeak'] ) + // ch_software_versions + // .concat(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS ( @@ -377,36 +401,16 @@ workflow { ch_gtf, params.modules['homer_annotatepeaks_macs2'] ) + // ch_software_versions + // .concat(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) + + // ch_software_versions + // .concat(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } /* * Pipeline reporting */ - MAP_READS.out.bwa_version.first() - .concat( - QC_TRIM.out.fastqc_version.first().ifEmpty(null), - QC_TRIM.out.trimgalore_version.first().ifEmpty(null), - MAP_READS.out.samtools_version.first().ifEmpty(null), - MAKE_GENOME_FILTER.out.version.first().ifEmpty(null), - CLEAN_BAM.out.bamtools_version.first().ifEmpty(null), - PICARD_MERGESAMFILES.out.version.first().ifEmpty(null), - PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null), - PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null), - UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null), - DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null), - MACS2_CALLPEAK.out.version.first().ifEmpty(null), - HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null), - //SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null), - //MULTIQC.out.version.first().ifEmpty(null), - //echo \$(R --version 2>&1) > v_R.txt - ) - .map { it } - .set { versions } - - //GET_SOFTWARE_VERSIONS ( - // params.modules['get_software_versions'] - //) - OUTPUT_DOCUMENTATION ( ch_output_docs, ch_output_docs_images, @@ -425,6 +429,14 @@ workflow { // //GET_SOFTWARE_VERSIONS.out.yml.collect(), // ch_workflow_summary // ) + // ch_software_versions + // .concat(MULTIQC.out.version.first().ifEmpty(null)) + + //ch_software_versions.view() + // GET_SOFTWARE_VERSIONS ( + // ch_software_versions.map { it }, + // params.modules['get_software_versions'] + // ) } //////////////////////////////////////////////////// From 43f843d93f50cb74846eaa85cd55aec8869c99d6 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sun, 26 Jul 2020 11:57:27 +0100 Subject: [PATCH 070/538] Fix getting software versions --- main.nf | 63 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/main.nf b/main.nf index 8f1455e62..009b90fa9 100755 --- a/main.nf +++ b/main.nf @@ -203,6 +203,7 @@ workflow { ch_software_versions = Channel.empty() ch_software_versions .concat(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Read QC & trimming @@ -219,7 +220,7 @@ workflow { ch_software_versions .concat(QC_TRIM.out.fastqc_version.first().ifEmpty(null), QC_TRIM.out.trimgalore_version.first().ifEmpty(null)) - .view() + .set { ch_software_versions } /* * Map reads & BAM QC @@ -233,9 +234,10 @@ workflow { params.modules['bwa_mem'], params.modules['samtools_sort_lib'] ) - // ch_software_versions - // .concat(MAP_READS.out.bwa_version.first(), - // MAP_READS.out.samtools_version.first().ifEmpty(null)) + ch_software_versions + .concat(MAP_READS.out.bwa_version.first(), + MAP_READS.out.samtools_version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Merge resequenced BAM files @@ -256,8 +258,9 @@ workflow { ch_sort_bam, params.modules['picard_mergesamfiles'] ) - // ch_software_versions - // .concat(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Mark duplicates & filter BAM files @@ -277,8 +280,9 @@ workflow { params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter'] ) - // ch_software_versions - // .concat(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) + ch_software_versions + .concat(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Post alignment QC @@ -293,15 +297,17 @@ workflow { CLEAN_BAM.out.bam, params.modules['preseq_lcextrap'] ) - // ch_software_versions - // .concat(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + .set { ch_software_versions } PHANTOMPEAKQUALTOOLS ( CLEAN_BAM.out.bam, params.modules['phantompeakqualtools'] ) - // ch_software_versions - // .concat(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Coverage tracks @@ -316,8 +322,9 @@ workflow { GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig'] ) - // ch_software_versions - // .concat(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) + .set { ch_software_versions } /* * Coverage plots @@ -327,8 +334,9 @@ workflow { ch_gene_bed, params.modules['deeptools_computematrix'] ) - // ch_software_versions - // .concat(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) + .set { ch_software_versions } DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix, @@ -391,8 +399,9 @@ workflow { params.macs_gsize, params.modules['macs2_callpeak'] ) - // ch_software_versions - // .concat(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + .set { ch_software_versions } params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS ( @@ -401,16 +410,23 @@ workflow { ch_gtf, params.modules['homer_annotatepeaks_macs2'] ) - // ch_software_versions - // .concat(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) + ch_software_versions + .concat(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) + .set { ch_software_versions } // ch_software_versions // .concat(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + // .set { ch_software_versions } } /* * Pipeline reporting */ + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect(), + params.modules['get_software_versions'] + ) + OUTPUT_DOCUMENTATION ( ch_output_docs, ch_output_docs_images, @@ -431,12 +447,7 @@ workflow { // ) // ch_software_versions // .concat(MULTIQC.out.version.first().ifEmpty(null)) - - //ch_software_versions.view() - // GET_SOFTWARE_VERSIONS ( - // ch_software_versions.map { it }, - // params.modules['get_software_versions'] - // ) + // .set { ch_software_versions } } //////////////////////////////////////////////////// From d11e500464ed6658c231d7eacd25d315bff93f63 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Sun, 26 Jul 2020 12:27:26 +0100 Subject: [PATCH 071/538] Get software versions working --- bin/scrape_software_versions.py | 68 ++++--------------- main.nf | 2 +- modules/local/process/filter_bam.nf | 4 +- .../local/process/get_software_versions.nf | 38 ++++------- 4 files changed, 27 insertions(+), 85 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 6f61aa86b..e2b87c787 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -1,62 +1,18 @@ #!/usr/bin/env python from __future__ import print_function -from collections import OrderedDict -import re +import os -regexes = { - 'nf-core/chipseq': ['v_pipeline.txt', r"(\S+)"], - 'Nextflow': ['v_nextflow.txt', r"(\S+)"], - 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], - 'Trim Galore!': ['v_trim_galore.txt', r"version (\S+)"], - 'BWA': ['v_bwa.txt', r"Version: (\S+)"], - 'Samtools': ['v_samtools.txt', r"samtools (\S+)"], - 'BEDTools': ['v_bedtools.txt', r"bedtools v(\S+)"], - 'BamTools': ['v_bamtools.txt', r"bamtools (\S+)"], - 'deepTools': ['v_deeptools.txt', r"plotFingerprint (\S+)"], - 'Picard': ['v_picard.txt', r"\n(\S+)"], - 'R': ['v_R.txt', r"R version (\S+)"], - 'Pysam': ['v_pysam.txt', r"(\S+)"], - 'MACS2': ['v_macs2.txt', r"macs2 (\S+)"], - 'HOMER': ['v_homer.txt', r"(\S+)"], - 'featureCounts': ['v_featurecounts.txt', r"featureCounts v(\S+)"], - 'Preseq': ['v_preseq.txt', r"Version: (\S+)"], - 'MultiQC': ['v_multiqc.txt', r"multiqc, version (\S+)"], -} +results = {} +version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] +for version_file in version_files: -results = OrderedDict() -results['nf-core/chipseq'] = 'N/A' -results['Nextflow'] = 'N/A' -results['FastQC'] = 'N/A' -results['Trim Galore!'] = 'N/A' -results['BWA'] = 'N/A' -results['Samtools'] = 'N/A' -results['BEDTools'] = 'N/A' -results['BamTools'] = 'N/A' -results['deepTools'] = 'N/A' -results['Picard'] = 'N/A' -results['R'] = 'N/A' -results['Pysam'] = 'N/A' -results['MACS2'] = 'N/A' -results['HOMER'] = False -results['featureCounts'] = 'N/A' -results['Preseq'] = 'N/A' -results['MultiQC'] = 'N/A' + software = version_file.replace('.version.txt','') + if software == 'pipeline': + software = 'nf-core/chipseq' -# Search each file using its regex -for k, v in regexes.items(): - try: - with open(v[0]) as x: - versions = x.read() - match = re.search(v[1], versions) - if match: - results[k] = "v{}".format(match.group(1)) - except IOError: - results[k] = False - -# Remove software set to false in results -for k in list(results): - if not results[k]: - del(results[k]) + with open(version_file) as fin: + version = fin.read().strip() + results[software] = version # Dump to YAML print (''' @@ -68,11 +24,11 @@ data: |
''') -for k,v in results.items(): +for k,v in sorted(results.items()): print("
{}
{}
".format(k,v)) print ("
") # Write out regexes as csv file: with open('software_versions.csv', 'w') as f: - for k,v in results.items(): + for k,v in sorted(results.items()): f.write("{}\t{}\n".format(k,v)) diff --git a/main.nf b/main.nf index 009b90fa9..56c655908 100755 --- a/main.nf +++ b/main.nf @@ -442,7 +442,7 @@ workflow { // ch_multiqc_config, // ch_multiqc_custom_config.collect().ifEmpty([]), // FASTQC.out.zip.collect().ifEmpty([]), - // //GET_SOFTWARE_VERSIONS.out.yml.collect(), + // //GET_SOFTWARE_VERSIONS.out.yaml.collect(), // ch_workflow_summary // ) // ch_software_versions diff --git a/modules/local/process/filter_bam.nf b/modules/local/process/filter_bam.nf index 6302d858e..686aa7a89 100644 --- a/modules/local/process/filter_bam.nf +++ b/modules/local/process/filter_bam.nf @@ -12,7 +12,7 @@ process FILTER_BAM { else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) - + input: tuple val(meta), path(bam), path(bai) path bed @@ -39,6 +39,6 @@ process FILTER_BAM { | bamtools filter \\ -out ${prefix}.bam \\ -script $config - echo \$(bamtools --version 2>&1) > bamtools.version.txt + echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//' > bamtools.version.txt """ } diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index c946bafc0..52b45a2b4 100755 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -2,39 +2,25 @@ * Parse software version numbers */ process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}/${opts.publish_dir}", - mode: params.publish_dir_mode, - saveAs: { filename -> - if (opts.publish_results == "none") null - else if (filename.endsWith('.yaml')) null - else filename } + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else if (filename.endsWith('.yaml')) null + else filename } input: + path versions val opts output: - path 'software_versions_mqc.yaml' - path "software_versions.csv" - + path "software_versions.csv", emit: csv + path 'software_versions_mqc.yaml', emit: yaml + script: """ - echo $workflow.manifest.version > v_pipeline.txt - echo $workflow.nextflow.version > v_nextflow.txt - fastqc --version > v_fastqc.txt - trim_galore --version > v_trim_galore.txt - echo \$(bwa 2>&1) > v_bwa.txt - samtools --version > v_samtools.txt - bedtools --version > v_bedtools.txt - echo \$(bamtools --version 2>&1) > v_bamtools.txt - echo \$(plotFingerprint --version 2>&1) > v_deeptools.txt || true - picard MarkDuplicates --version &> v_picard.txt || true - echo \$(R --version 2>&1) > v_R.txt - python -c "import pysam; print(pysam.__version__)" > v_pysam.txt - echo \$(macs2 --version 2>&1) > v_macs2.txt - touch v_homer.txt - echo \$(featureCounts -v 2>&1) > v_featurecounts.txt - preseq &> v_preseq.txt - multiqc --version > v_multiqc.txt + echo $workflow.manifest.version > pipeline.version.txt + echo $workflow.nextflow.version > nextflow.version.txt scrape_software_versions.py &> software_versions_mqc.yaml """ } From 58dc14e802833d595bb2a01b5268f97b25e60eec Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 11:53:57 +0100 Subject: [PATCH 072/538] mix instead of concat --- main.nf | 171 ++++++++++++++++---------------------------------------- 1 file changed, 48 insertions(+), 123 deletions(-) diff --git a/main.nf b/main.nf index 56c655908..1cfaf685a 100755 --- a/main.nf +++ b/main.nf @@ -201,9 +201,7 @@ workflow { params.modules['make_genome_filter'] ) ch_software_versions = Channel.empty() - ch_software_versions - .concat(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) /* * Read QC & trimming @@ -217,10 +215,8 @@ workflow { params.modules['fastqc'], params.modules['trimgalore'] ) - ch_software_versions - .concat(QC_TRIM.out.fastqc_version.first().ifEmpty(null), - QC_TRIM.out.trimgalore_version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(QC_TRIM.out.fastqc_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(QC_TRIM.out.trimgalore_version.first().ifEmpty(null)) /* * Map reads & BAM QC @@ -234,10 +230,8 @@ workflow { params.modules['bwa_mem'], params.modules['samtools_sort_lib'] ) - ch_software_versions - .concat(MAP_READS.out.bwa_version.first(), - MAP_READS.out.samtools_version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(MAP_READS.out.bwa_version.first()) + ch_software_versions = ch_software_versions.mix(MAP_READS.out.samtools_version.first().ifEmpty(null)) /* * Merge resequenced BAM files @@ -258,9 +252,7 @@ workflow { ch_sort_bam, params.modules['picard_mergesamfiles'] ) - ch_software_versions - .concat(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) /* * Mark duplicates & filter BAM files @@ -280,9 +272,7 @@ workflow { params.modules['remove_bam_orphans'], params.modules['samtools_sort_filter'] ) - ch_software_versions - .concat(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) /* * Post alignment QC @@ -297,17 +287,13 @@ workflow { CLEAN_BAM.out.bam, params.modules['preseq_lcextrap'] ) - ch_software_versions - .concat(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) PHANTOMPEAKQUALTOOLS ( CLEAN_BAM.out.bam, params.modules['phantompeakqualtools'] ) - ch_software_versions - .concat(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) /* * Coverage tracks @@ -322,9 +308,7 @@ workflow { GET_CHROM_SIZES.out.sizes, params.modules['ucsc_bedgraphtobigwig'] ) - ch_software_versions - .concat(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) /* * Coverage plots @@ -334,9 +318,7 @@ workflow { ch_gene_bed, params.modules['deeptools_computematrix'] ) - ch_software_versions - .concat(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix, @@ -399,9 +381,7 @@ workflow { params.macs_gsize, params.modules['macs2_callpeak'] ) - ch_software_versions - .concat(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS ( @@ -410,13 +390,9 @@ workflow { ch_gtf, params.modules['homer_annotatepeaks_macs2'] ) - ch_software_versions - .concat(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) - .set { ch_software_versions } + ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) - // ch_software_versions - // .concat(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) - // .set { ch_software_versions } + //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } /* @@ -433,21 +409,45 @@ workflow { params.modules['output_documentation'] ) - // /* - // * MultiQC - // */ + /* + * MultiQC + */ // workflow_summary = Schema.params_mqc_summary(summary) // ch_workflow_summary = Channel.value(workflow_summary) + // params.modules['multiqc'].publish_dir += "/$peakType" // MULTIQC ( // ch_multiqc_config, // ch_multiqc_custom_config.collect().ifEmpty([]), - // FASTQC.out.zip.collect().ifEmpty([]), - // //GET_SOFTWARE_VERSIONS.out.yaml.collect(), - // ch_workflow_summary + // GET_SOFTWARE_VERSIONS.out.yaml.collect(), + // ch_workflow_summary, + // + // QC_TRIM.out.fastqc_zip.collect { it[1] }.ifEmpty([]), + // QC_TRIM.out.trim_log.collect { it[1] }.ifEmpty([]), + // QC_TRIM.out.trim_zip.collect { it[1] }.ifEmpty([]), + // + // // MAP_READS.out.stats.collect { it[1] }, + // // MAP_READS.out.flagstat.collect { it[1] }, + // // MAP_READS.out.idxstats.collect { it[1] }, + // + // // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() + // // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} + // // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() + // // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() + // // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() + // // + // // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) + // // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) + // // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) + // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + // // + // // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) + // // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) + // // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) + // // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + // // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) + // + // params.modules['multiqc'] // ) - // ch_software_versions - // .concat(MULTIQC.out.version.first().ifEmpty(null)) - // .set { ch_software_versions } } //////////////////////////////////////////////////// @@ -735,82 +735,7 @@ workflow.onComplete { // igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' // """ // } -// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- MULTIQC -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// Channel.from(summary.collect{ [it.key, it.value] }) -// .map { k,v -> "
$k
${v ?: 'N/A'}
" } -// .reduce { a, b -> return [a, b].join("\n ") } -// .map { x -> """ -// id: 'nf-core-chipseq-summary' -// description: " - this information is collected when the pipeline is started." -// section_name: 'nf-core/chipseq Workflow Summary' -// section_href: 'https://github.com/nf-core/chipseq' -// plot_type: 'html' -// data: | -//
-// $x -//
-// """.stripIndent() } -// .set { ch_workflow_summary } -// -// /* -// * STEP 9: MultiQC -// */ -// process MULTIQC { -// publishDir "${params.outdir}/multiqc/${PEAK_TYPE}", mode: params.publish_dir_mode -// -// when: -// !params.skip_multiqc -// -// input: -// path (multiqc_config) from ch_multiqc_config -// path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) -// -// path ('software_versions/*') from ch_software_versions_mqc.collect() -// path workflow_summary from ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml') -// -// path ('fastqc/*') from ch_fastqc_reports_mqc.collect().ifEmpty([]) -// path ('trimgalore/*') from ch_trimgalore_results_mqc.collect().ifEmpty([]) -// path ('trimgalore/fastqc/*') from ch_trimgalore_fastqc_reports_mqc.collect().ifEmpty([]) -// -// path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() -// path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() -// path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} -// path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() -// path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() -// path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() -// -// path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) -// path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) -// path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) -// path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) -// -// path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) -// path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) -// path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) -// path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) -// path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) -// -// output: -// path '*multiqc_report.html' into ch_multiqc_report -// path '*_data' -// -// script: -// rtitle = custom_runName ? "--title \"$custom_runName\"" : '' -// rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' -// custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' -// """ -// multiqc . -f $rtitle $rfilename $custom_config_file -// """ -// } -// + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /* -- -- */ From 0e00d1da87a13af6087a75111bedda0954689196 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 12:10:19 +0100 Subject: [PATCH 073/538] toGiga to giga --- modules/nf-core/software/picard_collectmultiplemetrics.nf | 2 +- modules/nf-core/software/picard_markduplicates.nf | 2 +- modules/nf-core/software/picard_mergesamfiles.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 8b3371c9a..3f5b1c5c3 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -31,7 +31,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.toGiga() + avail_mem = task.memory.giga } """ picard \\ diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 9636e0506..3605e9a2f 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -30,7 +30,7 @@ process PICARD_MARKDUPLICATES { if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.toGiga() + avail_mem = task.memory.giga } """ picard \\ diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 466d767ca..76ea07ea8 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -30,7 +30,7 @@ process PICARD_MERGESAMFILES { if (!task.memory) { log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' } else { - avail_mem = task.memory.toGiga() + avail_mem = task.memory.giga } if (bam_files.size() > 1) { """ From fa41d658b70a8220a44c9f01af18d533a8aa65f8 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 12:20:01 +0100 Subject: [PATCH 074/538] Move MultiQC module to local folder --- modules/local/process/multiqc.nf | 92 +++++++++++++++++++++++++++++ modules/nf-core/software/multiqc.nf | 40 ------------- 2 files changed, 92 insertions(+), 40 deletions(-) create mode 100755 modules/local/process/multiqc.nf delete mode 100755 modules/nf-core/software/multiqc.nf diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf new file mode 100755 index 000000000..13453f4b1 --- /dev/null +++ b/modules/local/process/multiqc.nf @@ -0,0 +1,92 @@ +def SOFTWARE = 'multiqc' + +// Has the run name been specified by the user? +// this has the bonus effect of catching both -name and --name +custom_runName = params.name +if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + custom_runName = workflow.runName +} + +process MULTIQC { + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" + //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" + + conda (params.conda ? "bioconda::multiqc=1.9" : null) + + input: + path multiqc_config + path mqc_custom_config + path software_versions + val workflow_summary + + path ('fastqc/*') + path ('trimgalore/*') + path ('trimgalore/fastqc/*') + + // path ('alignment/library/*') + // path ('alignment/library/*') + // path ('alignment/library/*') + + // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() + // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} + // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() + // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() + // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() + // + // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) + // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) + // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) + // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + // + // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) + // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) + // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) + + val opts + + output: + path "*multiqc_report.html", emit: report + path "*_data", emit: data + + script: + rtitle = custom_runName ? "--title \"$custom_runName\"" : '' + rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' + // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time + """ + echo '$workflow_summary' > workflow_summary_mqc.yaml + multiqc -f $opts.args $rtitle $rfilename $custom_config_file . + multiqc --version | sed -e "s/multiqc, version //g" > ${SOFTWARE}.version.txt + """ +} + +// path ('fastqc/*') from ch_fastqc_reports_mqc.collect().ifEmpty([]) +// path ('trimgalore/*') from ch_trimgalore_results_mqc.collect().ifEmpty([]) +// path ('trimgalore/fastqc/*') from ch_trimgalore_fastqc_reports_mqc.collect().ifEmpty([]) +// +// path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() +// path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() +// path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} +// path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() +// path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() +// path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() +// +// path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) +// path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) +// path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) +// path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) +// +// path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) +// path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) +// path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) +// path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) +// path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) diff --git a/modules/nf-core/software/multiqc.nf b/modules/nf-core/software/multiqc.nf deleted file mode 100755 index bc5616be3..000000000 --- a/modules/nf-core/software/multiqc.nf +++ /dev/null @@ -1,40 +0,0 @@ -def SOFTWARE = 'multiqc' - -// Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name -custom_runName = params.name -if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - custom_runName = workflow.runName -} - -process MULTIQC { - publishDir "${params.outdir}/multiqc", mode: params.publish_dir_mode - - container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" - //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" - - conda (params.conda ? "bioconda::multiqc=1.9" : null) - - input: - path (multiqc_config) from ch_multiqc_config - path (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) - // TODO nf-core: Add in log files from your new processes for MultiQC to find! - path ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) - path ('software_versions/*') from ch_software_versions_yaml.collect() - path workflow_summary from ch_workflow_summary.collectFile(name: "workflow_summary_mqc.yaml") - - output: - path "*multiqc_report.html" - path "*_data" - path "multiqc_plots" - - script: - rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' - custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' - // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time - """ - multiqc -f $rtitle $rfilename $custom_config_file . - multiqc --version | sed -e "s/multiqc, version //g" > ${SOFTWARE}.version.txt - """ -} From 7656b1462e91ecc9a29f8416fec84ceac34963a8 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 12:20:16 +0100 Subject: [PATCH 075/538] Add MultiQC options --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index b84f21dfb..f142a10d6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -174,5 +174,11 @@ params { publish_dir = "pipeline_info" publish_results = "all" } + 'multiqc' { + args = "" + suffix = "" + publish_dir = "multiqc" + publish_results = "all" + } } } From f1047abcbf6cc80425aa4849b072457be9a532dd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 13:17:29 +0100 Subject: [PATCH 076/538] Rename subworkflows to sort by file type --- conf/modules.config | 6 +- main.nf | 144 +++++++++--------- .../process/{filter_bam.nf => bam_filter.nf} | 2 +- ...e_bam_orphans.nf => bam_remove_orphans.nf} | 2 +- modules/local/process/multiqc.nf | 4 - ...ck_samplesheet.nf => samplesheet_check.nf} | 2 +- modules/local/subworkflow/bam_clean.nf | 31 ++++ modules/local/subworkflow/clean_bam.nf | 31 ---- .../{check_input.nf => input_check.nf} | 10 +- modules/nf-core/software/trimgalore.nf | 2 +- .../{sort_bam.nf => bam_sort_samtools.nf} | 16 +- .../{bam_stats.nf => bam_stats_samtools.nf} | 2 +- .../{qc_trim.nf => fastqc_trimgalore.nf} | 6 +- modules/nf-core/subworkflow/map_bwa_mem.nf | 28 ++++ modules/nf-core/subworkflow/map_reads.nf | 28 ---- ...uplicates.nf => mark_duplicates_picard.nf} | 12 +- 16 files changed, 160 insertions(+), 166 deletions(-) rename modules/local/process/{filter_bam.nf => bam_filter.nf} (95%) rename modules/local/process/{remove_bam_orphans.nf => bam_remove_orphans.nf} (93%) rename modules/local/process/{check_samplesheet.nf => samplesheet_check.nf} (98%) create mode 100644 modules/local/subworkflow/bam_clean.nf delete mode 100644 modules/local/subworkflow/clean_bam.nf rename modules/local/subworkflow/{check_input.nf => input_check.nf} (61%) rename modules/nf-core/subworkflow/{sort_bam.nf => bam_sort_samtools.nf} (54%) rename modules/nf-core/subworkflow/{bam_stats.nf => bam_stats_samtools.nf} (94%) rename modules/nf-core/subworkflow/{qc_trim.nf => fastqc_trimgalore.nf} (87%) create mode 100644 modules/nf-core/subworkflow/map_bwa_mem.nf delete mode 100644 modules/nf-core/subworkflow/map_reads.nf rename modules/nf-core/subworkflow/{mark_duplicates.nf => mark_duplicates_picard.nf} (72%) diff --git a/conf/modules.config b/conf/modules.config index f142a10d6..e3251fffb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -5,7 +5,7 @@ */ params { modules { - 'check_samplesheet' { + 'samplesheet_check' { args = "" suffix = "" publish_dir = "pipeline_info" @@ -78,13 +78,13 @@ params { publish_dir = "bwa/mergedLibrary" publish_results = "all" } - 'filter_bam' { + 'bam_filter' { args = "" suffix = ".mLb.flT.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" } - 'remove_bam_orphans' { + 'bam_remove_orphans' { args = "--only_fr_pairs" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary" diff --git a/main.nf b/main.nf index 1cfaf685a..84c5cb583 100755 --- a/main.nf +++ b/main.nf @@ -141,9 +141,10 @@ include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filt include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' +include { MULTIQC } from './modules/local/process/multiqc' -include { CHECK_INPUT } from './modules/local/subworkflow/check_input' -include { CLEAN_BAM } from './modules/local/subworkflow/clean_bam' +include { INPUT_CHECK } from './modules/local/subworkflow/input_check' +include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' //////////////////////////////////////////////////// /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ @@ -162,13 +163,10 @@ include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phant include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/software/homer_annotatepeaks' //include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' -include { MULTIQC } from './modules/nf-core/software/multiqc' -include { QC_TRIM } from './modules/nf-core/subworkflow/qc_trim' -include { BAM_STATS } from './modules/nf-core/subworkflow/bam_stats' -include { SORT_BAM } from './modules/nf-core/subworkflow/sort_bam' -include { MAP_READS } from './modules/nf-core/subworkflow/map_reads' -include { MARK_DUPLICATES } from './modules/nf-core/subworkflow/mark_duplicates' +include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' +include { MAP_BWA_MEM } from './modules/nf-core/subworkflow/map_bwa_mem' +include { MARK_DUPLICATES_PICARD } from './modules/nf-core/subworkflow/mark_duplicates_picard' //////////////////////////////////////////////////// /* -- RUN MAIN WORKFLOW -- */ @@ -179,10 +177,10 @@ workflow { /* * Read in samplesheet, validate and stage input files */ - CHECK_INPUT ( + INPUT_CHECK ( ch_input, params.seq_center, - params.modules['check_samplesheet'] + params.modules['samplesheet_check'] ) /* @@ -208,35 +206,35 @@ workflow { */ nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' params.modules['trimgalore'].args += nextseq - QC_TRIM ( - CHECK_INPUT.out.reads, + FASTQC_TRIMGALORE ( + INPUT_CHECK.out.reads, params.skip_fastqc, params.skip_trimming, params.modules['fastqc'], params.modules['trimgalore'] ) - ch_software_versions = ch_software_versions.mix(QC_TRIM.out.fastqc_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(QC_TRIM.out.trimgalore_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) /* * Map reads & BAM QC */ score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' params.modules['bwa_mem'].args += score - MAP_READS ( - QC_TRIM.out.reads, + MAP_BWA_MEM ( + FASTQC_TRIMGALORE.out.reads, ch_index, ch_fasta, params.modules['bwa_mem'], params.modules['samtools_sort_lib'] ) - ch_software_versions = ch_software_versions.mix(MAP_READS.out.bwa_version.first()) - ch_software_versions = ch_software_versions.mix(MAP_READS.out.samtools_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) /* * Merge resequenced BAM files */ - MAP_READS + MAP_BWA_MEM .out .bam .map { @@ -257,40 +255,40 @@ workflow { /* * Mark duplicates & filter BAM files */ - MARK_DUPLICATES ( + MARK_DUPLICATES_PICARD ( PICARD_MERGESAMFILES.out.bam, params.modules['picard_markduplicates'], params.modules['samtools_sort_merged_lib'] ) // Fix getting name sorted BAM here for PE/SE - CLEAN_BAM ( - MARK_DUPLICATES.out.bam.join(MARK_DUPLICATES.out.bai, by: [0]), + BAM_CLEAN ( + MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), MAKE_GENOME_FILTER.out.bed.collect(), ch_bamtools_filter_config, - params.modules['filter_bam'], - params.modules['remove_bam_orphans'], + params.modules['bam_filter'], + params.modules['bam_remove_orphans'], params.modules['samtools_sort_filter'] ) - ch_software_versions = ch_software_versions.mix(CLEAN_BAM.out.bamtools_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) /* * Post alignment QC */ PICARD_COLLECTMULTIPLEMETRICS ( - CLEAN_BAM.out.bam, + BAM_CLEAN.out.bam, ch_fasta, params.modules['picard_collectmultiplemetrics'] ) - PRESEQ_LCEXTRAP ( - CLEAN_BAM.out.bam, - params.modules['preseq_lcextrap'] - ) - ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + // PRESEQ_LCEXTRAP ( + // BAM_CLEAN.out.bam, + // params.modules['preseq_lcextrap'] + // ) + // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) PHANTOMPEAKQUALTOOLS ( - CLEAN_BAM.out.bam, + BAM_CLEAN.out.bam, params.modules['phantompeakqualtools'] ) ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) @@ -299,7 +297,7 @@ workflow { * Coverage tracks */ BEDTOOLS_GENOMECOV ( - CLEAN_BAM.out.bam.join(CLEAN_BAM.out.flagstat, by: [0]), + BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), params.modules['bedtools_genomecov'] ) @@ -333,17 +331,17 @@ workflow { /* * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] */ - CLEAN_BAM + BAM_CLEAN .out .bam - .join ( CLEAN_BAM.out.bai, by: [0] ) + .join ( BAM_CLEAN.out.bai, by: [0] ) .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } .set { ch_ip_control_bam } - CLEAN_BAM + BAM_CLEAN .out .bam - .join ( CLEAN_BAM.out.bai, by: [0] ) + .join ( BAM_CLEAN.out.bai, by: [0] ) .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } .combine(ch_ip_control_bam, by: 0) .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } @@ -412,42 +410,42 @@ workflow { /* * MultiQC */ - // workflow_summary = Schema.params_mqc_summary(summary) - // ch_workflow_summary = Channel.value(workflow_summary) - // params.modules['multiqc'].publish_dir += "/$peakType" - // MULTIQC ( - // ch_multiqc_config, - // ch_multiqc_custom_config.collect().ifEmpty([]), - // GET_SOFTWARE_VERSIONS.out.yaml.collect(), - // ch_workflow_summary, - // - // QC_TRIM.out.fastqc_zip.collect { it[1] }.ifEmpty([]), - // QC_TRIM.out.trim_log.collect { it[1] }.ifEmpty([]), - // QC_TRIM.out.trim_zip.collect { it[1] }.ifEmpty([]), - // - // // MAP_READS.out.stats.collect { it[1] }, - // // MAP_READS.out.flagstat.collect { it[1] }, - // // MAP_READS.out.idxstats.collect { it[1] }, - // - // // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() - // // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} - // // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() - // // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() - // // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() - // // - // // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) - // // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) - // // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) - // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - // // - // // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) - // // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) - // // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) - // // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) - // // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) - // - // params.modules['multiqc'] - // ) + workflow_summary = Schema.params_mqc_summary(summary) + ch_workflow_summary = Channel.value(workflow_summary) + params.modules['multiqc'].publish_dir += "/$peakType" + MULTIQC ( + ch_multiqc_config, + ch_multiqc_custom_config.collect().ifEmpty([]), + GET_SOFTWARE_VERSIONS.out.yaml.collect(), + ch_workflow_summary, + + FASTQC_TRIMGALORE.out.fastqc_zip.collect { it[1] }.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_log.collect { it[1] }.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_zip.collect { it[1] }.ifEmpty([]), + + // MAP_BWA_MEM.out.stats.collect { it[1] }, + // MAP_BWA_MEM.out.flagstat.collect { it[1] }, + // MAP_BWA_MEM.out.idxstats.collect { it[1] }, + + // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() + // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} + // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() + // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() + // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() + // + // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) + // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) + // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) + // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + // + // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) + // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) + // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) + + params.modules['multiqc'] + ) } //////////////////////////////////////////////////// diff --git a/modules/local/process/filter_bam.nf b/modules/local/process/bam_filter.nf similarity index 95% rename from modules/local/process/filter_bam.nf rename to modules/local/process/bam_filter.nf index 686aa7a89..0dda5be2f 100644 --- a/modules/local/process/filter_bam.nf +++ b/modules/local/process/bam_filter.nf @@ -1,7 +1,7 @@ /* * Filter BAM file */ -process FILTER_BAM { +process BAM_FILTER { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${opts.publish_dir}", diff --git a/modules/local/process/remove_bam_orphans.nf b/modules/local/process/bam_remove_orphans.nf similarity index 93% rename from modules/local/process/remove_bam_orphans.nf rename to modules/local/process/bam_remove_orphans.nf index 52a6ade92..906a75c14 100644 --- a/modules/local/process/remove_bam_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -1,7 +1,7 @@ /* * Remove orphan reads from paired-end BAM file */ -process REMOVE_BAM_ORPHANS { +process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${opts.publish_dir}", diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 13453f4b1..fee6b9f73 100755 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -69,10 +69,6 @@ process MULTIQC { """ } -// path ('fastqc/*') from ch_fastqc_reports_mqc.collect().ifEmpty([]) -// path ('trimgalore/*') from ch_trimgalore_results_mqc.collect().ifEmpty([]) -// path ('trimgalore/fastqc/*') from ch_trimgalore_fastqc_reports_mqc.collect().ifEmpty([]) -// // path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} diff --git a/modules/local/process/check_samplesheet.nf b/modules/local/process/samplesheet_check.nf similarity index 98% rename from modules/local/process/check_samplesheet.nf rename to modules/local/process/samplesheet_check.nf index 757453eb3..cfdb89572 100755 --- a/modules/local/process/check_samplesheet.nf +++ b/modules/local/process/samplesheet_check.nf @@ -1,7 +1,7 @@ /* * Reformat design file, check validitiy and create IP vs control mappings */ -process CHECK_SAMPLESHEET { +process SAMPLESHEET_CHECK { tag "$samplesheet" publishDir "${params.outdir}/${opts.publish_dir}", mode: params.publish_dir_mode, diff --git a/modules/local/subworkflow/bam_clean.nf b/modules/local/subworkflow/bam_clean.nf new file mode 100644 index 000000000..121a4a842 --- /dev/null +++ b/modules/local/subworkflow/bam_clean.nf @@ -0,0 +1,31 @@ +/* + * Filter BAM file + */ + +include { BAM_FILTER } from '../process/bam_filter' +include { BAM_REMOVE_ORPHANS } from '../process/bam_remove_orphans' +include { BAM_SORT_SAMTOOLS } from '../../nf-core/subworkflow/bam_sort_samtools' + +workflow BAM_CLEAN { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + config // file: BAMtools filter JSON config file + bam_filter_opts // map: options for bam_filter module + bam_remove_orphans_opts // map: options for bam_remove_orphans module + samtools_opts // map: options for SAMTools modules + + main: + BAM_FILTER(ch_bam_bai, ch_bed, config, bam_filter_opts) + BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_opts) + BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_opts) + + emit: + name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bamtools_version = BAM_FILTER.out.version // path: *.version.txt +} diff --git a/modules/local/subworkflow/clean_bam.nf b/modules/local/subworkflow/clean_bam.nf deleted file mode 100644 index b51099cf1..000000000 --- a/modules/local/subworkflow/clean_bam.nf +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Filter BAM file - */ - -include { FILTER_BAM } from '../process/filter_bam' -include { REMOVE_BAM_ORPHANS } from '../process/remove_bam_orphans' -include { SORT_BAM } from '../../nf-core/subworkflow/sort_bam' - -workflow CLEAN_BAM { - take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - config // file: BAMtools filter JSON config file - filter_bam_opts // map: options for filter_bam module - rm_bam_orphans_opts // map: options for remove_bam_orphans module - samtools_opts // map: options for SAMTools modules - - main: - FILTER_BAM(ch_bam_bai, ch_bed, config, filter_bam_opts) - REMOVE_BAM_ORPHANS(FILTER_BAM.out.bam, rm_bam_orphans_opts) - SORT_BAM(REMOVE_BAM_ORPHANS.out.bam, samtools_opts) - - emit: - name_bam = REMOVE_BAM_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] - bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] - bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] - stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bamtools_version = FILTER_BAM.out.version // path: *.version.txt -} diff --git a/modules/local/subworkflow/check_input.nf b/modules/local/subworkflow/input_check.nf similarity index 61% rename from modules/local/subworkflow/check_input.nf rename to modules/local/subworkflow/input_check.nf index 91596732c..79b02402c 100644 --- a/modules/local/subworkflow/check_input.nf +++ b/modules/local/subworkflow/input_check.nf @@ -2,17 +2,17 @@ * Check input samplesheet and get read channels */ -include { CHECK_SAMPLESHEET; - get_samplesheet_paths } from '../process/check_samplesheet' +include { SAMPLESHEET_CHECK; + get_samplesheet_paths } from '../process/samplesheet_check' -workflow CHECK_INPUT { +workflow INPUT_CHECK { take: ch_input // file: /path/to/samplesheet.csv seq_center // string: sequencing center for read group - check_samplesheet_opts // map: options for check_samplesheet module + samplesheet_check_opts // map: options for check_samplesheet module main: - CHECK_SAMPLESHEET (ch_input, check_samplesheet_opts) + SAMPLESHEET_CHECK (ch_input, samplesheet_check_opts) .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, seq_center) } .set { ch_reads } diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index ab1bd37a5..59cc12dfd 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -23,7 +23,7 @@ process TRIMGALORE { tuple val(meta), path("*.fq.gz"), emit: reads tuple val(meta), path("*.html"), emit: html optional true tuple val(meta), path("*.zip"), emit: zip optional true - tuple val(meta), path("*.txt"), emit: log + tuple val(meta), path("*report.txt"), emit: log path "*.version.txt", emit: version script: diff --git a/modules/nf-core/subworkflow/sort_bam.nf b/modules/nf-core/subworkflow/bam_sort_samtools.nf similarity index 54% rename from modules/nf-core/subworkflow/sort_bam.nf rename to modules/nf-core/subworkflow/bam_sort_samtools.nf index dd4f0b2c7..7efb10245 100644 --- a/modules/nf-core/subworkflow/sort_bam.nf +++ b/modules/nf-core/subworkflow/bam_sort_samtools.nf @@ -2,11 +2,11 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { SAMTOOLS_SORT } from '../software/samtools_sort' -include { SAMTOOLS_INDEX } from '../software/samtools_index' -include { BAM_STATS } from './bam_stats' +include { SAMTOOLS_SORT } from '../software/samtools_sort' +include { SAMTOOLS_INDEX } from '../software/samtools_index' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' -workflow SORT_BAM { +workflow BAM_SORT_SAMTOOLS { take: ch_bam // channel: [ val(meta), [ bam ] ] samtools_opts // map: options for SAMTools modules @@ -14,13 +14,13 @@ workflow SORT_BAM { main: SAMTOOLS_SORT(ch_bam, samtools_opts) SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_opts) - BAM_STATS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) emit: bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt } diff --git a/modules/nf-core/subworkflow/bam_stats.nf b/modules/nf-core/subworkflow/bam_stats_samtools.nf similarity index 94% rename from modules/nf-core/subworkflow/bam_stats.nf rename to modules/nf-core/subworkflow/bam_stats_samtools.nf index 95c1bb24d..5f2b6d5c7 100644 --- a/modules/nf-core/subworkflow/bam_stats.nf +++ b/modules/nf-core/subworkflow/bam_stats_samtools.nf @@ -6,7 +6,7 @@ include { SAMTOOLS_STATS } from '../software/samtools_stats' include { SAMTOOLS_IDXSTATS } from '../software/samtools_idxstats' include { SAMTOOLS_FLAGSTAT } from '../software/samtools_flagstat' -workflow BAM_STATS { +workflow BAM_STATS_SAMTOOLS { take: ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] samtools_opts // map: options for SAMTools modules diff --git a/modules/nf-core/subworkflow/qc_trim.nf b/modules/nf-core/subworkflow/fastqc_trimgalore.nf similarity index 87% rename from modules/nf-core/subworkflow/qc_trim.nf rename to modules/nf-core/subworkflow/fastqc_trimgalore.nf index e2f0c6fb0..701075771 100644 --- a/modules/nf-core/subworkflow/qc_trim.nf +++ b/modules/nf-core/subworkflow/fastqc_trimgalore.nf @@ -5,13 +5,13 @@ include { FASTQC } from '../software/fastqc' include { TRIMGALORE } from '../software/trimgalore' -workflow QC_TRIM { +workflow FASTQC_TRIMGALORE { take: ch_reads // channel: [ val(meta), [ reads ] ] skip_fastqc // boolean: true/false skip_trimming // boolean: true/false fastqc_opts // map: options for FastQC module - trim_galore_opts // map: options for TrimGalore! module + trimgalore_opts // map: options for TrimGalore! module main: fastqc_html = Channel.empty() @@ -29,7 +29,7 @@ workflow QC_TRIM { trim_log = Channel.empty() trimgalore_version = Channel.empty() if (!skip_trimming) { - TRIMGALORE(ch_reads, trim_galore_opts).reads.set { ch_trim_reads } + TRIMGALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } trim_html = TRIMGALORE.out.html trim_zip = TRIMGALORE.out.zip trim_log = TRIMGALORE.out.log diff --git a/modules/nf-core/subworkflow/map_bwa_mem.nf b/modules/nf-core/subworkflow/map_bwa_mem.nf new file mode 100644 index 000000000..7f0338299 --- /dev/null +++ b/modules/nf-core/subworkflow/map_bwa_mem.nf @@ -0,0 +1,28 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { BWA_MEM } from '../software/bwa_mem' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow MAP_BWA_MEM { + take: + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_opts // map: options for BWA MEM module + samtools_opts // map: options for SAMTools modules + + main: + BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) + BAM_SORT_SAMTOOLS(BWA_MEM.out.bam, samtools_opts) + + emit: + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bwa_version = BWA_MEM.out.version // path: *.version.txt + samtools_version = BAM_SORT_SAMTOOLS.out.samtools_version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/map_reads.nf b/modules/nf-core/subworkflow/map_reads.nf deleted file mode 100644 index 1e310c8b0..000000000 --- a/modules/nf-core/subworkflow/map_reads.nf +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -include { BWA_MEM } from '../software/bwa_mem' -include { SORT_BAM } from './sort_bam' - -workflow MAP_READS { - take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index - ch_fasta // path: /path/to/genome.fasta - bwa_mem_opts // map: options for BWA MEM module - samtools_opts // map: options for SAMTools modules - - main: - BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) - SORT_BAM(BWA_MEM.out.bam, samtools_opts) - - emit: - bam = SORT_BAM.out.bam // channel: [ val(meta), [ bam ] ] - bai = SORT_BAM.out.bai // channel: [ val(meta), [ bai ] ] - stats = SORT_BAM.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SORT_BAM.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SORT_BAM.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bwa_version = BWA_MEM.out.version // path: *.version.txt - samtools_version = SORT_BAM.out.samtools_version // path: *.version.txt -} diff --git a/modules/nf-core/subworkflow/mark_duplicates.nf b/modules/nf-core/subworkflow/mark_duplicates_picard.nf similarity index 72% rename from modules/nf-core/subworkflow/mark_duplicates.nf rename to modules/nf-core/subworkflow/mark_duplicates_picard.nf index 2d326a083..335a9d9a9 100644 --- a/modules/nf-core/subworkflow/mark_duplicates.nf +++ b/modules/nf-core/subworkflow/mark_duplicates_picard.nf @@ -4,9 +4,9 @@ include { PICARD_MARKDUPLICATES } from '../software/picard_markduplicates' include { SAMTOOLS_INDEX } from '../software/samtools_index' -include { BAM_STATS } from './bam_stats' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' -workflow MARK_DUPLICATES { +workflow MARK_DUPLICATES_PICARD { take: ch_bam // channel: [ val(meta), [ bam ] ] markduplicates_opts // map: options for picard MarkDuplicates module @@ -15,15 +15,15 @@ workflow MARK_DUPLICATES { main: PICARD_MARKDUPLICATES(ch_bam, markduplicates_opts) SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_opts) - BAM_STATS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) emit: bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt } From cab24c8e369b8b7bc71a672a211cdae9e2a535ae Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 14:32:56 +0100 Subject: [PATCH 077/538] Get MultiQC working --- assets/multiqc_config.yaml | 13 +++-- conf/modules.config | 2 +- main.nf | 46 ++++++++------- modules/local/process/multiqc.nf | 57 +++++++------------ modules/nf-core/software/macs2_callpeak.nf | 8 +-- .../nf-core/software/picard_markduplicates.nf | 2 +- 6 files changed, 60 insertions(+), 68 deletions(-) diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 6d5da1d66..4d795e5da 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -42,7 +42,12 @@ module_order: name: 'MERGED LIB: SAMTools (unfiltered)' info: 'This section of the report shows SAMTools results after merging libraries and before filtering.' path_filters: - - './alignment/mergedLibrary/*.mLb.mkD.sorted.bam*' + - './alignment/mergedLibrary/unfiltered/*.mLb.mkD.sorted.bam*' + - picard: + name: 'MERGED LIB: Picard (unfiltered)' + info: 'This section of the report shows picard results after merging libraries and before filtering.' + path_filters: + - './alignment/mergedLibrary/unfiltered/picard_metrics/*' - preseq: name: 'MERGED LIB: Preseq (unfiltered)' info: 'This section of the report shows Preseq results after merging libraries and before filtering.' @@ -50,12 +55,12 @@ module_order: name: 'MERGED LIB: SAMTools (filtered)' info: 'This section of the report shows SAMTools results after merging libraries and after filtering.' path_filters: - - './alignment/mergedLibrary/*.mLb.clN.sorted.bam*' + - './alignment/mergedLibrary/filtered/*.mLb.clN.sorted.bam*' - picard: - name: 'MERGED LIB: Picard' + name: 'MERGED LIB: Picard (filtered)' info: 'This section of the report shows picard results after merging libraries and after filtering.' path_filters: - - './alignment/mergedLibrary/picard_metrics/*' + - './alignment/mergedLibrary/filtered/picard_metrics/*' - deeptools: name: 'MERGED LIB: deepTools' anchor: 'mlib_deeptools' diff --git a/conf/modules.config b/conf/modules.config index e3251fffb..62bb863a5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -68,7 +68,7 @@ params { } 'picard_markduplicates' { args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - suffix = ".mLb.mkD" + suffix = ".mLb.mkD.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" } diff --git a/main.nf b/main.nf index 84c5cb583..5e5685453 100755 --- a/main.nf +++ b/main.nf @@ -281,11 +281,11 @@ workflow { params.modules['picard_collectmultiplemetrics'] ) - // PRESEQ_LCEXTRAP ( - // BAM_CLEAN.out.bam, - // params.modules['preseq_lcextrap'] - // ) - // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + PRESEQ_LCEXTRAP ( + BAM_CLEAN.out.bam, + params.modules['preseq_lcextrap'] + ) + ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) PHANTOMPEAKQUALTOOLS ( BAM_CLEAN.out.bam, @@ -417,32 +417,36 @@ workflow { ch_multiqc_config, ch_multiqc_custom_config.collect().ifEmpty([]), GET_SOFTWARE_VERSIONS.out.yaml.collect(), - ch_workflow_summary, + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), FASTQC_TRIMGALORE.out.fastqc_zip.collect { it[1] }.ifEmpty([]), FASTQC_TRIMGALORE.out.trim_log.collect { it[1] }.ifEmpty([]), FASTQC_TRIMGALORE.out.trim_zip.collect { it[1] }.ifEmpty([]), - // MAP_BWA_MEM.out.stats.collect { it[1] }, - // MAP_BWA_MEM.out.flagstat.collect { it[1] }, - // MAP_BWA_MEM.out.idxstats.collect { it[1] }, + MAP_BWA_MEM.out.stats.collect { it[1] }, + MAP_BWA_MEM.out.flagstat.collect { it[1] }, + MAP_BWA_MEM.out.idxstats.collect { it[1] }, + + MARK_DUPLICATES_PICARD.out.stats.collect { it[1] }.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.flagstat.collect { it[1] }.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.idxstats.collect { it[1] }.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.metrics.collect { it[1] }.ifEmpty([]), + + BAM_CLEAN.out.stats .collect { it[1] }.ifEmpty([]), + BAM_CLEAN.out.flagstat.collect { it[1] }.ifEmpty([]), + BAM_CLEAN.out.idxstats.collect { it[1] }.ifEmpty([]), + PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect { it[1] }.ifEmpty([]), + + PRESEQ_LCEXTRAP.out.ccurve.collect { it[1] }.ifEmpty([]), + DEEPTOOLS_PLOTPROFILE.out.table.collect { it[1] }.ifEmpty([]), + DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect { it[1] }.ifEmpty([]), + // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) - // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() - // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} - // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() - // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() - // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() - // // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - // - // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) - // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) - // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) - // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) - // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) params.modules['multiqc'] ) diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index fee6b9f73..16fc323d5 100755 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -24,32 +24,36 @@ process MULTIQC { path multiqc_config path mqc_custom_config path software_versions - val workflow_summary + path workflow_summary path ('fastqc/*') path ('trimgalore/*') path ('trimgalore/fastqc/*') - // path ('alignment/library/*') - // path ('alignment/library/*') - // path ('alignment/library/*') + path ('alignment/library/*') + path ('alignment/library/*') + path ('alignment/library/*') - // path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() - // path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} - // path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() - // path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() - // path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() - // + path ('alignment/mergedLibrary/unfiltered/*') + path ('alignment/mergedLibrary/unfiltered/*') + path ('alignment/mergedLibrary/unfiltered/*') + path ('alignment/mergedLibrary/unfiltered/picard_metrics/*') + + path ('alignment/mergedLibrary/filtered/*') + path ('alignment/mergedLibrary/filtered/*') + path ('alignment/mergedLibrary/filtered/*') + path ('alignment/mergedLibrary/filtered/picard_metrics/*') + + path ('preseq/*') + path ('deeptools/*') + path ('deeptools/*') + // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) + // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - // - // path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) - // path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) - // path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) - // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) - // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) val opts @@ -61,28 +65,7 @@ process MULTIQC { rtitle = custom_runName ? "--title \"$custom_runName\"" : '' rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' - // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time """ - echo '$workflow_summary' > workflow_summary_mqc.yaml multiqc -f $opts.args $rtitle $rfilename $custom_config_file . - multiqc --version | sed -e "s/multiqc, version //g" > ${SOFTWARE}.version.txt """ } - -// path ('alignment/library/*') from ch_sort_bam_flagstat_mqc.collect() -// path ('alignment/mergedLibrary/*') from ch_merge_bam_stats_mqc.collect() -// path ('alignment/mergedLibrary/*') from ch_rm_orphan_flagstat_mqc.collect{it[1]} -// path ('alignment/mergedLibrary/*') from ch_rm_orphan_stats_mqc.collect() -// path ('alignment/mergedLibrary/picard_metrics/*') from ch_merge_bam_metrics_mqc.collect() -// path ('alignment/mergedLibrary/picard_metrics/*') from ch_collectmetrics_mqc.collect() -// -// path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) -// path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) -// path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) -// path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) -// -// path ('preseq/*') from ch_preseq_mqc.collect().ifEmpty([]) -// path ('deeptools/*') from ch_plotfingerprint_mqc.collect().ifEmpty([]) -// path ('deeptools/*') from ch_plotprofile_mqc.collect().ifEmpty([]) -// path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) -// path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index f28d6908f..8821df938 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -22,10 +22,10 @@ process MACS2_CALLPEAK { output: tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak - path '*.xls', emit: xls - path '*.gappedPeak', emit: gapped optional true - path '*.bed', emit: bed optional true - path '*.bdg', emit: bdg optional true + tuple val(meta), path("*.xls"), emit: xls + tuple val(meta), path("*.gappedPeak"), emit: gapped optional true + tuple val(meta), path("*.bed"), emit: bed optional true + tuple val(meta), path("*.bdg"), emit: bdg optional true path "*.version.txt", emit: version script: diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 3605e9a2f..31c56bedd 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -21,7 +21,7 @@ process PICARD_MARKDUPLICATES { output: tuple val(meta), path("*.bam"), emit: bam - path "*.metrics.txt", emit: metrics + tuple val(meta), path("*.metrics.txt"), emit: metrics path "*.version.txt", emit: version script: From 353fbaa6ac6c0e6bd634ab00c1f27090ce1fca5a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 17:42:50 +0100 Subject: [PATCH 078/538] Fix spacing --- main.nf | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/main.nf b/main.nf index 5e5685453..543075cfc 100755 --- a/main.nf +++ b/main.nf @@ -419,27 +419,27 @@ workflow { GET_SOFTWARE_VERSIONS.out.yaml.collect(), ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - FASTQC_TRIMGALORE.out.fastqc_zip.collect { it[1] }.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_log.collect { it[1] }.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_zip.collect { it[1] }.ifEmpty([]), - - MAP_BWA_MEM.out.stats.collect { it[1] }, - MAP_BWA_MEM.out.flagstat.collect { it[1] }, - MAP_BWA_MEM.out.idxstats.collect { it[1] }, - - MARK_DUPLICATES_PICARD.out.stats.collect { it[1] }.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.flagstat.collect { it[1] }.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.idxstats.collect { it[1] }.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.metrics.collect { it[1] }.ifEmpty([]), - - BAM_CLEAN.out.stats .collect { it[1] }.ifEmpty([]), - BAM_CLEAN.out.flagstat.collect { it[1] }.ifEmpty([]), - BAM_CLEAN.out.idxstats.collect { it[1] }.ifEmpty([]), - PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect { it[1] }.ifEmpty([]), - - PRESEQ_LCEXTRAP.out.ccurve.collect { it[1] }.ifEmpty([]), - DEEPTOOLS_PLOTPROFILE.out.table.collect { it[1] }.ifEmpty([]), - DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect { it[1] }.ifEmpty([]), + FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + + MAP_BWA_MEM.out.stats.collect{it[1]}, + MAP_BWA_MEM.out.flagstat.collect{it[1]}, + MAP_BWA_MEM.out.idxstats.collect{it[1]}, + + MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + + BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), + PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + + PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) From 0d22821c4ebc4e339c08d929efd6a336f3fe7f88 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 27 Jul 2020 17:43:46 +0100 Subject: [PATCH 079/538] Remove --single_end ci test --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1440d45b7..f8fbc404f 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - parameters: [--single_end, --skip_trimming, --skip_consensus_peaks] + parameters: [--skip_trimming, --skip_consensus_peaks] steps: - name: Check out pipeline code uses: actions/checkout@v2 From 8f8412c366b966f3556cb923de10a400ff0034f8 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 28 Jul 2020 13:29:23 +0100 Subject: [PATCH 080/538] Add in QC plots for peaks --- bin/{plot_macs_qc.r => plot_macs2_qc.r} | 0 conf/modules.config | 14 +++- main.nf | 74 +++++++------------ .../local/process/plot_homer_annotatepeaks.nf | 67 ++++++++--------- modules/local/process/plot_macs2_qc.nf | 66 ++++++++--------- .../nf-core/software/homer_annotatepeaks.nf | 2 +- 6 files changed, 101 insertions(+), 122 deletions(-) rename bin/{plot_macs_qc.r => plot_macs2_qc.r} (100%) diff --git a/bin/plot_macs_qc.r b/bin/plot_macs2_qc.r similarity index 100% rename from bin/plot_macs_qc.r rename to bin/plot_macs2_qc.r diff --git a/conf/modules.config b/conf/modules.config index 62bb863a5..d1aa7b919 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -156,9 +156,21 @@ params { publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" } + 'plot_macs2_qc' { + args = "-o ./ -p macs2_peak" + suffix = "" + publish_dir = "bwa/mergedLibrary/macs2" + publish_results = "all" + } 'homer_annotatepeaks_macs2' { args = "-gid" - suffix = ".mLb.clN" + suffix = "_peaks" + publish_dir = "bwa/mergedLibrary/macs2" + publish_results = "all" + } + 'plot_homer_annotatepeaks' { + args = "-o ./ -p macs2_annotatePeaks" + suffix = "" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" } diff --git a/main.nf b/main.nf index 543075cfc..a07b5b7c4 100755 --- a/main.nf +++ b/main.nf @@ -135,16 +135,18 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" /* -- IMPORT LOCAL MODULES/SUBWORKFLOWS -- */ //////////////////////////////////////////////////// -include { GTF2BED } from './modules/local/process/gtf2bed' -include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' -include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' -include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' -include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' -include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' -include { MULTIQC } from './modules/local/process/multiqc' - -include { INPUT_CHECK } from './modules/local/subworkflow/input_check' -include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' +include { GTF2BED } from './modules/local/process/gtf2bed' +include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' +include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' +include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' +include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' +include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' +include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' +include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' +include { MULTIQC } from './modules/local/process/multiqc' + +include { INPUT_CHECK } from './modules/local/subworkflow/input_check' +include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' //////////////////////////////////////////////////// /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ @@ -381,6 +383,13 @@ workflow { ) ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" + PLOT_MACS2_QC ( + MACS2_CALLPEAK.out.peak.collect{it[1]}, + peakType, + params.modules['plot_macs2_qc'] + ) + params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS ( MACS2_CALLPEAK.out.peak, @@ -390,9 +399,17 @@ workflow { ) ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) + params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS.out.txt.collect{it[1]}, + "_peaks.annotatePeaks.txt", + params.modules['plot_homer_annotatepeaks'] + ) + //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } + /* * Pipeline reporting */ @@ -466,43 +483,6 @@ workflow.onComplete { /* -- THE END -- */ //////////////////////////////////////////////////// -// /* -// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation -// */ -// process MACS2_QC { -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc -// -// input: -// path peaks from ch_macs_qc.collect{ it[-1] } -// path annos from ch_macs_annotate.collect() -// path peak_annotation_header from ch_peak_annotation_header -// -// output: -// path '*.tsv' into ch_macs_qc_mqc -// path '*.{txt,pdf}' -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// """ -// plot_macs_qc.r \\ -// -i ${peaks.join(',')} \\ -// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ -// -o ./ \\ -// -p macs_peak -// -// plot_homer_annotatepeaks.r \\ -// -i ${annos.join(',')} \\ -// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ -// -o ./ \\ -// -p macs_annotatePeaks -// -// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv -// """ -// } -// // /////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // /* -- -- */ diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index 87099c1a3..85b9274a7 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -1,37 +1,30 @@ -conda (params.conda ? "${baseDir}/environment.yml" : null) -// /* -// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation -// */ -// process MACS2_QC { -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc -// -// input: -// path peaks from ch_macs_qc.collect{ it[-1] } -// path annos from ch_macs_annotate.collect() -// path peak_annotation_header from ch_peak_annotation_header -// -// output: -// path '*.tsv' into ch_macs_qc_mqc -// path '*.{txt,pdf}' -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// """ -// plot_macs_qc.r \\ -// -i ${peaks.join(',')} \\ -// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ -// -o ./ \\ -// -p macs_peak -// -// plot_homer_annotatepeaks.r \\ -// -i ${annos.join(',')} \\ -// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ -// -o ./ \\ -// -p macs_annotatePeaks -// -// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv -// """ -// } +/* + * Aggregated QC plots for peak-to-gene annotation + */ +process PLOT_HOMER_ANNOTATEPEAKS { + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path annos + val suffix + val opts + + output: + path '*.txt', emit: txt + path '*.pdf', emit: pdf + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + plot_homer_annotatepeaks.r \\ + -i ${annos.join(',')} \\ + -s ${annos.join(',').replaceAll("${suffix}","")} \\ + $opts.args + """ +} diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index 477c84845..51547831e 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -1,36 +1,30 @@ -// /* -// * STEP 6.4: Aggregated QC plots for peaks, FRiP and peak-to-gene annotation -// */ -// process MACS2_QC { -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/qc", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && !params.skip_peak_annotation && !params.skip_peak_qc -// -// input: -// path peaks from ch_macs_qc.collect{ it[-1] } -// path annos from ch_macs_annotate.collect() -// path peak_annotation_header from ch_peak_annotation_header -// -// output: -// path '*.tsv' into ch_macs_qc_mqc -// path '*.{txt,pdf}' -// -// script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ -// """ -// plot_macs_qc.r \\ -// -i ${peaks.join(',')} \\ -// -s ${peaks.join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ -// -o ./ \\ -// -p macs_peak -// -// plot_homer_annotatepeaks.r \\ -// -i ${annos.join(',')} \\ -// -s ${annos.join(',').replaceAll("_peaks.annotatePeaks.txt","")} \\ -// -o ./ \\ -// -p macs_annotatePeaks -// -// cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv -// """ -// } +/* + * Aggregated QC plots for peaks + */ +process PLOT_MACS2_QC { + label 'process_medium' + publishDir "${params.outdir}/${opts.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path peaks + val peak_type + val opts + + output: + path '*.txt', emit: txt + path '*.pdf', emit: pdf + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + plot_macs2_qc.r \\ + -i ${peaks.join(',')} \\ + -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ + $opts.args + """ +} diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 1e0a2f362..4d53de8da 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -23,7 +23,7 @@ process HOMER_ANNOTATEPEAKS { val opts output: - tuple val(meta), path("*.txt"), emit: txt + tuple val(meta), path("*annotatePeaks.txt"), emit: txt path "*.version.txt", emit: version script: From 9814f7841370b308358a5f3b6e224f26c7a90bfc Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 12:51:44 +0100 Subject: [PATCH 081/538] Add in consensus peaks --- CHANGELOG.md | 5 + conf/modules.config | 6 + conf/test_full.config | 1 - docs/usage.md | 7 -- lib/Schema.groovy | 3 +- main.nf | 111 ++++++------------ modules/local/process/bam_filter.nf | 4 +- modules/local/process/bedtools_genomecov.nf | 2 +- .../process/{calc_frip.nf => frip_score.nf} | 0 modules/local/process/macs2_consensus.nf | 103 ++++++++-------- modules/local/process/plot_macs2_qc.nf | 2 +- modules/local/subworkflow/bam_clean.nf | 15 +-- nextflow.config | 1 - nextflow_schema.json | 7 -- 14 files changed, 112 insertions(+), 155 deletions(-) rename modules/local/process/{calc_frip.nf => frip_score.nf} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37994ed80..972d6678e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Fixed` +### `Removed` + +* `--single_end` parameter in favour of auto-detecting from input samplesheeet. + ### `Dependencies` * Update Nextflow `19.10.0` -> `20.07.1` + ## [1.2.0] - 2020-07-02 ### `Added` diff --git a/conf/modules.config b/conf/modules.config index d1aa7b919..25334b035 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -174,6 +174,12 @@ params { publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" } + 'macs2_consensus' { + args = "" + suffix = "" + publish_dir = "bwa/mergedLibrary/macs2" + publish_results = "all" + } 'get_software_versions' { args = "" suffix = "" diff --git a/conf/test_full.config b/conf/test_full.config index 3875f0297..fc4c61791 100755 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -13,7 +13,6 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design_full.csv' - single_end = true // Genome references genome = 'hg19' diff --git a/docs/usage.md b/docs/usage.md index 44d0b95ba..46c347a13 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -11,7 +11,6 @@ * [`-profile`](#-profile) * [`--input`](#--input) * [Generic arguments](#generic-arguments) - * [`--single_end`](#--single_end) * [`--seq_center`](#--seq_center) * [`--fragment_size`](#--fragment_size) * [`--fingerprint_bins`](#--fingerprint_bins) @@ -234,12 +233,6 @@ Example design files have been provided with the pipeline for [paired-end](../as ## Generic arguments -### `--single_end` - -By default, the pipeline expects paired-end data. If you have single-end data, specify `--single_end` on the command line when you launch the pipeline. - -It is not possible to run a mixture of single-end and paired-end files in one run. - ### `--seq_center` Sequencing center information that will be added to read groups in BAM files. diff --git a/lib/Schema.groovy b/lib/Schema.groovy index 3f25c88f0..ae2d2cb90 100755 --- a/lib/Schema.groovy +++ b/lib/Schema.groovy @@ -96,7 +96,6 @@ class Schema { def Map summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = run_name ?: workflow.runName - summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' summary['Design File'] = params.input summary['Genome'] = params.genome ?: 'Not supplied' summary['Fasta File'] = params.fasta @@ -121,7 +120,7 @@ class Schema { summary['NextSeq Trim'] = "$params.trim_nextseq bp" } if (params.seq_center) summary['Sequencing Center'] = params.seq_center - if (params.single_end) summary['Fragment Size'] = "$params.fragment_size bp" + summary['Fragment Size'] = "$params.fragment_size bp" summary['Fingerprint Bins'] = params.fingerprint_bins if (params.keep_dups) summary['Keep Duplicates'] = 'Yes' if (params.keep_multi_map) summary['Keep Multi-mapped'] = 'Yes' diff --git a/main.nf b/main.nf index a07b5b7c4..63d95c727 100755 --- a/main.nf +++ b/main.nf @@ -97,11 +97,9 @@ ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) // JSON files required by BAMTools for alignment filtering -if (params.single_end) { - ch_bamtools_filter_config = file(params.bamtools_filter_se_config, checkIfExists: true) -} else { - ch_bamtools_filter_config = file(params.bamtools_filter_pe_config, checkIfExists: true) -} +ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) +ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) +//ch_bamtools_filter_config // Header files for MultiQC ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) @@ -141,6 +139,8 @@ include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_f include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' +include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' +// include { FRIP_SCORE } from './modules/local/process/frip_score' include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' include { MULTIQC } from './modules/local/process/multiqc' @@ -193,10 +193,7 @@ workflow { if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } MAKE_GENOME_FILTER ( - GET_CHROM_SIZES ( - ch_fasta, - params.modules['get_chrom_sizes'] - ).sizes, + GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, ch_blacklist.ifEmpty([]), params.modules['make_genome_filter'] ) @@ -267,7 +264,8 @@ workflow { BAM_CLEAN ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), MAKE_GENOME_FILTER.out.bed.collect(), - ch_bamtools_filter_config, + ch_bamtools_filter_se_config, + ch_bamtools_filter_pe_config, params.modules['bam_filter'], params.modules['bam_remove_orphans'], params.modules['samtools_sort_filter'] @@ -386,7 +384,6 @@ workflow { params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" PLOT_MACS2_QC ( MACS2_CALLPEAK.out.peak.collect{it[1]}, - peakType, params.modules['plot_macs2_qc'] ) @@ -406,6 +403,33 @@ workflow { params.modules['plot_homer_annotatepeaks'] ) + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + MACS2_CALLPEAK + .out + .peak + .map { meta, peak -> [ meta.antibody , meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" + MACS2_CONSENSUS ( + ch_antibody_peaks, + params.modules['macs2_consensus'] + ) + //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } @@ -483,71 +507,6 @@ workflow.onComplete { /* -- THE END -- */ //////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- CONSENSUS PEAKS ANALYSIS -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// -// // Group by ip from this point and carry forward boolean variables -// ch_macs_consensus -// .map { it -> [ it[0], it[1], it[2], it[-1] ] } -// .groupTuple() -// .map { it -> [ it[0], it[1][0], it[2][0], it[3].sort() ] } -// .set { ch_macs_consensus } -// -// /* -// * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection -// */ -// process CONSENSUS_PEAKS { -// tag "${antibody}" -// label 'process_long' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(peaks) from ch_macs_consensus -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*.bed') into ch_macs_consensus_bed -// tuple val(antibody), path('*.saf') into ch_macs_consensus_saf -// path '*.boolean.txt' into ch_macs_consensus_bool -// path '*igv.txt' into ch_macs_consensus_igv -// path '*.intersect.{txt,plot.pdf}' -// -// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ -// prefix = "${antibody}.consensus_peaks" -// mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') -// collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') -// expandparam = params.narrow_peak ? '--is_narrow_peak' : '' -// """ -// sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ -// | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt -// -// macs2_merged_expand.py ${prefix}.txt \\ -// ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ -// ${prefix}.boolean.txt \\ -// --min_replicates $params.min_reps_consensus \\ -// $expandparam -// -// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed -// -// echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf -// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf -// -// plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf -// -// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt -// """ -// } // // /* // * STEP 7.2: Annotate consensus peaks with HOMER, and add annotation to boolean output file diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index 0dda5be2f..7a9056d44 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -16,7 +16,8 @@ process BAM_FILTER { input: tuple val(meta), path(bam), path(bai) path bed - path config + path bamtools_filter_se_config + path bamtools_filter_pe_config val opts output: @@ -29,6 +30,7 @@ process BAM_FILTER { dup_params = params.keep_dups ? '' : '-F 0x0400' multimap_params = params.keep_multi_map ? '' : '-q 1' blacklist_params = params.blacklist ? "-L $bed" : '' + config = meta.single_end ? bamtools_filter_se_config : bamtools_filter_pe_config """ samtools view \\ $filter_params \\ diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index b167d11fc..f00426105 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -27,7 +27,7 @@ process BEDTOOLS_GENOMECOV { script: prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pc' - extend = (params.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' + extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' """ SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt diff --git a/modules/local/process/calc_frip.nf b/modules/local/process/frip_score.nf similarity index 100% rename from modules/local/process/calc_frip.nf rename to modules/local/process/frip_score.nf diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index 134a9857f..55772aba4 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -1,51 +1,52 @@ -// conda (params.conda ? "${baseDir}/environment.yml" : null) -// /* -// * STEP 7.1: Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts and UpSetR plot for intersection -// */ -// process CONSENSUS_PEAKS { -// tag "${antibody}" -// label 'process_long' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(peaks) from ch_macs_consensus -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*.bed') into ch_macs_consensus_bed -// tuple val(antibody), path('*.saf') into ch_macs_consensus_saf -// path '*.boolean.txt' into ch_macs_consensus_bool -// path '*igv.txt' into ch_macs_consensus_igv -// path '*.intersect.{txt,plot.pdf}' -// -// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ -// prefix = "${antibody}.consensus_peaks" -// mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') -// collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') -// expandparam = params.narrow_peak ? '--is_narrow_peak' : '' -// """ -// sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ -// | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt -// -// macs2_merged_expand.py ${prefix}.txt \\ -// ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${PEAK_TYPE}","")} \\ -// ${prefix}.boolean.txt \\ -// --min_replicates $params.min_reps_consensus \\ -// $expandparam -// -// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed -// -// echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf -// awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf -// -// plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf -// -// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt -// """ -// } +/* + * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts + */ +process MACS2_CONSENSUS { + tag "$meta.id" + label 'process_long' + publishDir "${params.outdir}/${opts.publish_dir}/${meta.id}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (opts.publish_results == "none") null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(peaks) + val opts + + output: + tuple val(meta), path("*.bed"), emit: bed + tuple val(meta), path("*.saf"), emit: saf + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.boolean.txt"), emit: boolean_txt + tuple val(meta), path("*.intersect.txt"), emit: intersect_txt + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + if (meta.multiple_groups || meta.replicates_exist) { + prefix = opts.suffix ? "${meta.id}${opts.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') + collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') + expandparam = params.narrow_peak ? '--is_narrow_peak' : '' + """ + sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ + | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt + + macs2_merged_expand.py \\ + ${prefix}.txt \\ + ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ + ${prefix}.boolean.txt \\ + --min_replicates $params.min_reps_consensus \\ + $expandparam + + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed + + echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf + + plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf + """ + } +} diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index 51547831e..a44737e50 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -13,7 +13,6 @@ process PLOT_MACS2_QC { input: path peaks - val peak_type val opts output: @@ -21,6 +20,7 @@ process PLOT_MACS2_QC { path '*.pdf', emit: pdf script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' """ plot_macs2_qc.r \\ -i ${peaks.join(',')} \\ diff --git a/modules/local/subworkflow/bam_clean.nf b/modules/local/subworkflow/bam_clean.nf index 121a4a842..0b79b5969 100644 --- a/modules/local/subworkflow/bam_clean.nf +++ b/modules/local/subworkflow/bam_clean.nf @@ -8,15 +8,16 @@ include { BAM_SORT_SAMTOOLS } from '../../nf-core/subworkflow/bam_sort_samtools workflow BAM_CLEAN { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - config // file: BAMtools filter JSON config file - bam_filter_opts // map: options for bam_filter module - bam_remove_orphans_opts // map: options for bam_remove_orphans module - samtools_opts // map: options for SAMTools modules + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data + bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data + bam_filter_opts // map: options for bam_filter module + bam_remove_orphans_opts // map: options for bam_remove_orphans module + samtools_opts // map: options for SAMTools modules main: - BAM_FILTER(ch_bam_bai, ch_bed, config, bam_filter_opts) + BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config, bam_filter_opts) BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_opts) BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_opts) diff --git a/nextflow.config b/nextflow.config index fe2bcc264..b86c42e50 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,7 +10,6 @@ params { // Options: Generic input = './design.csv' - single_end = false seq_center = '' fragment_size = 200 fingerprint_bins = 500000 diff --git a/nextflow_schema.json b/nextflow_schema.json index 1d0dfff29..d73ac61a5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -14,13 +14,6 @@ "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 4 columns, and a header row. See [usage docs](https://nf-co.re/atacseq/docs/usage#--input).", "fa_icon": "fas fa-file-csv" }, - "single_end": { - "type": "boolean", - "description": "Specifies that the input is single-end reads.", - "fa_icon": "fas fa-align-center", - "default": false, - "help_text": "By default, the pipeline expects paired-end data. If you have single-end data, specify this parameter on the command line when you launch the pipeline. It is not possible to run a mixture of single-end and paired-end files in one run." - }, "fragment_size": { "type": "integer", "default": 0, From eeeb20573a5153d7e94e649f04321f235f001a01 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 13:29:34 +0100 Subject: [PATCH 082/538] Replace opts with options --- modules/local/process/bam_filter.nf | 8 ++++---- modules/local/process/bam_remove_orphans.nf | 12 ++++++------ modules/local/process/bedtools_genomecov.nf | 8 ++++---- modules/local/process/get_chrom_sizes.nf | 6 +++--- modules/local/process/get_software_versions.nf | 8 ++++---- modules/local/process/gtf2bed.nf | 6 +++--- modules/local/process/macs2_consensus.nf | 8 ++++---- modules/local/process/make_genome_filter.nf | 6 +++--- modules/local/process/multiqc.nf | 10 +++++----- modules/local/process/output_documentation.nf | 6 +++--- modules/local/process/plot_homer_annotatepeaks.nf | 8 ++++---- modules/local/process/plot_macs2_qc.nf | 8 ++++---- modules/local/process/samplesheet_check.nf | 6 +++--- modules/local/subworkflow/bam_clean.nf | 12 ++++++------ modules/local/subworkflow/input_check.nf | 8 ++++---- modules/nf-core/software/bwa_index.nf | 8 ++++---- modules/nf-core/software/bwa_mem.nf | 14 +++++++------- .../nf-core/software/deeptools_computematrix.nf | 10 +++++----- .../nf-core/software/deeptools_plotfingerprint.nf | 10 +++++----- modules/nf-core/software/deeptools_plotheatmap.nf | 10 +++++----- modules/nf-core/software/deeptools_plotprofile.nf | 10 +++++----- modules/nf-core/software/fastqc.nf | 12 ++++++------ modules/nf-core/software/homer_annotatepeaks.nf | 10 +++++----- modules/nf-core/software/macs2_callpeak.nf | 10 +++++----- modules/nf-core/software/phantompeakqualtools.nf | 8 ++++---- .../software/picard_collectmultiplemetrics.nf | 10 +++++----- modules/nf-core/software/picard_markduplicates.nf | 10 +++++----- modules/nf-core/software/picard_mergesamfiles.nf | 10 +++++----- modules/nf-core/software/preseq_lcextrap.nf | 12 ++++++------ modules/nf-core/software/samtools_flagstat.nf | 6 +++--- modules/nf-core/software/samtools_idxstats.nf | 6 +++--- modules/nf-core/software/samtools_index.nf | 6 +++--- modules/nf-core/software/samtools_sort.nf | 10 +++++----- modules/nf-core/software/samtools_stats.nf | 6 +++--- modules/nf-core/software/trimgalore.nf | 12 ++++++------ modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 8 ++++---- modules/nf-core/subworkflow/bam_sort_samtools.nf | 10 +++++----- modules/nf-core/subworkflow/bam_stats_samtools.nf | 10 +++++----- modules/nf-core/subworkflow/fastqc_trimgalore.nf | 14 +++++++------- modules/nf-core/subworkflow/map_bwa_mem.nf | 14 +++++++------- .../nf-core/subworkflow/mark_duplicates_picard.nf | 12 ++++++------ 41 files changed, 189 insertions(+), 189 deletions(-) diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index 7a9056d44..df4e9e90b 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -4,10 +4,10 @@ process BAM_FILTER { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,14 +18,14 @@ process BAM_FILTER { path bed path bamtools_filter_se_config path bamtools_filter_pe_config - val opts + val options output: tuple val(meta), path("*.bam"), emit: bam path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' dup_params = params.keep_dups ? '' : '-F 0x0400' multimap_params = params.keep_multi_map ? '' : '-q 1' diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index 906a75c14..6aa109a4e 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -4,27 +4,27 @@ process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) - + input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("${prefix}.bam"), emit: bam script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam - bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $opts.args + bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $options.args """ } else { """ diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index f00426105..5a97667d4 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'bedtools' process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process BEDTOOLS_GENOMECOV { input: tuple val(meta), path(bam), path(flagstat) - val opts + val options output: tuple val(meta), path("*.bedGraph"), emit: bedgraph @@ -25,7 +25,7 @@ process BEDTOOLS_GENOMECOV { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pc' extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' """ diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index b90e23ab1..9424b046e 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -5,10 +5,10 @@ def SOFTWARE = 'samtools' */ process GET_CHROM_SIZES { tag "$fasta" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" @@ -18,7 +18,7 @@ process GET_CHROM_SIZES { input: path fasta - val opts + val options output: path '*.sizes', emit: sizes diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index 52b45a2b4..3dff31d87 100755 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -2,21 +2,21 @@ * Parse software version numbers */ process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.yaml')) null else filename } input: path versions - val opts + val options output: path "software_versions.csv", emit: csv path 'software_versions_mqc.yaml', emit: yaml - + script: """ echo $workflow.manifest.version > pipeline.version.txt diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 9abce96e6..a10b57102 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -4,10 +4,10 @@ process GTF2BED { tag "$gtf" label 'process_low' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } container "quay.io/biocontainers/perl:5.26.2" @@ -17,7 +17,7 @@ process GTF2BED { input: path gtf - val opts + val options output: path '*.bed' diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index 55772aba4..8abb2c515 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -4,17 +4,17 @@ process MACS2_CONSENSUS { tag "$meta.id" label 'process_long' - publishDir "${params.outdir}/${opts.publish_dir}/${meta.id}", + publishDir "${params.outdir}/${options.publish_dir}/${meta.id}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) input: tuple val(meta), path(peaks) - val opts + val options output: tuple val(meta), path("*.bed"), emit: bed @@ -25,7 +25,7 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - prefix = opts.suffix ? "${meta.id}${opts.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + prefix = options.suffix ? "${meta.id}${options.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 59addb3e4..bc9b5a98f 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -5,10 +5,10 @@ def SOFTWARE = 'bedtools' */ process MAKE_GENOME_FILTER { tag "$sizes" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" @@ -19,7 +19,7 @@ process MAKE_GENOME_FILTER { input: path sizes path blacklist - val opts + val options output: path '*.bed', emit: bed diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 16fc323d5..513886bb9 100755 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -9,10 +9,10 @@ if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { process MULTIQC { label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" @@ -49,13 +49,13 @@ process MULTIQC { path ('deeptools/*') // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) - + // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - val opts + val options output: path "*multiqc_report.html", emit: report @@ -66,6 +66,6 @@ process MULTIQC { rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' """ - multiqc -f $opts.args $rtitle $rfilename $custom_config_file . + multiqc -f $options.args $rtitle $rfilename $custom_config_file . """ } diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index 39332b811..0f8cecd5c 100755 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -2,10 +2,10 @@ * Output Markdown documentation to HTML */ process OUTPUT_DOCUMENTATION { - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -13,7 +13,7 @@ process OUTPUT_DOCUMENTATION { input: path output_docs path images - val opts + val options output: path "results_description.html" diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index 85b9274a7..b2e25bd87 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -3,10 +3,10 @@ */ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -14,7 +14,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { input: path annos val suffix - val opts + val options output: path '*.txt', emit: txt @@ -25,6 +25,6 @@ process PLOT_HOMER_ANNOTATEPEAKS { plot_homer_annotatepeaks.r \\ -i ${annos.join(',')} \\ -s ${annos.join(',').replaceAll("${suffix}","")} \\ - $opts.args + $options.args """ } diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index a44737e50..fe17c6b7f 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -3,17 +3,17 @@ */ process PLOT_MACS2_QC { label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) input: path peaks - val opts + val options output: path '*.txt', emit: txt @@ -25,6 +25,6 @@ process PLOT_MACS2_QC { plot_macs2_qc.r \\ -i ${peaks.join(',')} \\ -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ - $opts.args + $options.args """ } diff --git a/modules/local/process/samplesheet_check.nf b/modules/local/process/samplesheet_check.nf index cfdb89572..29d43e718 100755 --- a/modules/local/process/samplesheet_check.nf +++ b/modules/local/process/samplesheet_check.nf @@ -3,17 +3,17 @@ */ process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else filename } conda (params.conda ? "${baseDir}/environment.yml" : null) input: path samplesheet - val opts + val options output: path '*.csv' diff --git a/modules/local/subworkflow/bam_clean.nf b/modules/local/subworkflow/bam_clean.nf index 0b79b5969..e9813fddd 100644 --- a/modules/local/subworkflow/bam_clean.nf +++ b/modules/local/subworkflow/bam_clean.nf @@ -12,14 +12,14 @@ workflow BAM_CLEAN { ch_bed // channel: [ bed ] bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data - bam_filter_opts // map: options for bam_filter module - bam_remove_orphans_opts // map: options for bam_remove_orphans module - samtools_opts // map: options for SAMTools modules + bam_filter_options // map: options for bam_filter module + bam_remove_orphans_options // map: options for bam_remove_orphans module + samtools_options // map: options for SAMTools modules main: - BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config, bam_filter_opts) - BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_opts) - BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_opts) + BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config, bam_filter_options) + BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_options) + BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_options) emit: name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/modules/local/subworkflow/input_check.nf b/modules/local/subworkflow/input_check.nf index 79b02402c..88c6cac11 100644 --- a/modules/local/subworkflow/input_check.nf +++ b/modules/local/subworkflow/input_check.nf @@ -7,12 +7,12 @@ include { SAMPLESHEET_CHECK; workflow INPUT_CHECK { take: - ch_input // file: /path/to/samplesheet.csv - seq_center // string: sequencing center for read group - samplesheet_check_opts // map: options for check_samplesheet module + ch_input // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group + samplesheet_check_options // map: options for check_samplesheet module main: - SAMPLESHEET_CHECK (ch_input, samplesheet_check_opts) + SAMPLESHEET_CHECK (ch_input, samplesheet_check_options) .splitCsv(header:true, sep:',') .map { get_samplesheet_paths(it, seq_center) } .set { ch_reads } diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index cbe788bd7..5cdf4c1ba 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'bwa' process BWA_INDEX { tag "$fasta" label 'process_high' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process BWA_INDEX { input: path fasta - val opts + val options output: path "${fasta}.*", emit: index @@ -25,7 +25,7 @@ process BWA_INDEX { script: """ - bwa index $opts.args $fasta + bwa index $options.args $fasta echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 73012e770..a0d350b3e 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'bwa' process BWA_MEM { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -19,24 +19,24 @@ process BWA_MEM { tuple val(meta), path(reads) path index path fasta - val opts + val options output: tuple val(meta), path("*.bam"), emit: bam path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" rg = meta.read_group ? "-R ${meta.read_group}" : "" """ bwa mem \\ - $opts.args \\ + $options.args \\ $rg \\ -t $task.cpus \\ $fasta \\ $reads \\ - | samtools view $opts.args2 -@ $task.cpus -bS -o ${prefix}.bam - - + | samtools view $options.args2 -@ $task.cpus -bS -o ${prefix}.bam - + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index f1d303a56..e9b2ec06b 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,7 +18,7 @@ process DEEPTOOLS_COMPUTEMATRIX { input: tuple val(meta), path(bigwig) path bed - val opts + val options output: tuple val(meta), path("*.mat.gz"), emit: matrix @@ -26,10 +26,10 @@ process DEEPTOOLS_COMPUTEMATRIX { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ computeMatrix \\ - $opts.args \\ + $options.args \\ --regionsFileName $bed \\ --scoreFileName $bigwig \\ --outFileName ${prefix}.computeMatrix.mat.gz \\ diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 35f706535..a7ecd0cb8 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process DEEPTOOLS_PLOTFINGERPRINT { input: tuple val(meta), path(bams), path(bais) - val opts + val options output: tuple val(meta), path("*.pdf"), emit: pdf @@ -26,11 +26,11 @@ process DEEPTOOLS_PLOTFINGERPRINT { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ plotFingerprint \\ - $opts.args \\ + $options.args \\ $extend \\ --bamfiles ${bams.join(' ')} \\ --plotFile ${prefix}.plotFingerprint.pdf \\ diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index fa9787136..e12fa6c7e 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process DEEPTOOLS_PLOTHEATMAP { input: tuple val(meta), path(matrix) - val opts + val options output: tuple val(meta), path("*.pdf"), emit: pdf @@ -25,10 +25,10 @@ process DEEPTOOLS_PLOTHEATMAP { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ plotHeatmap \\ - $opts.args \\ + $options.args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index b90c171a9..a34de4cda 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process DEEPTOOLS_PLOTPROFILE { input: tuple val(meta), path(matrix) - val opts + val options output: tuple val(meta), path("*.pdf"), emit: pdf @@ -25,10 +25,10 @@ process DEEPTOOLS_PLOTPROFILE { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ plotProfile \\ - $opts.args \\ + $options.args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index 4a69d8218..f526e8d98 100755 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'fastqc' process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process FASTQC { input: tuple val(meta), path(reads) - val opts + val options output: tuple val(meta), path("*.html"), emit: html @@ -26,18 +26,18 @@ process FASTQC { script: // Add soft-links to original FastQs for consistent naming in pipeline - prefix = opts.suffix ? "${meta.id}.${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}.${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $opts.args --threads $task.cpus ${prefix}.fastq.gz + fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $opts.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 4d53de8da..cf09a4847 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -4,10 +4,10 @@ def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -20,19 +20,19 @@ process HOMER_ANNOTATEPEAKS { tuple val(meta), path(peak) path fasta path gtf - val opts + val options output: tuple val(meta), path("*annotatePeaks.txt"), emit: txt path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ annotatePeaks.pl \\ $peak \\ $fasta \\ - $opts.args \\ + $options.args \\ -gtf $gtf \\ -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 8821df938..f4bfac096 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'macs2' process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,7 +18,7 @@ process MACS2_CALLPEAK { input: tuple val(meta), path(ipbam), path(controlbam) val macs2_gsize - val opts + val options output: tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak @@ -29,13 +29,13 @@ process MACS2_CALLPEAK { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" format = meta.single_end ? 'BAM' : 'BAMPE' control = controlbam ? "--control $controlbam" : '' """ macs2 \\ callpeak \\ - $opts.args \\ + $options.args \\ --gsize $macs2_gsize \\ --format $format \\ --name $prefix \\ diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 22b2d9e74..a6df15650 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -4,10 +4,10 @@ def VERSION = '1.2.2' process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,7 +18,7 @@ process PHANTOMPEAKQUALTOOLS { input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("*.out"), emit: spp @@ -26,7 +26,7 @@ process PHANTOMPEAKQUALTOOLS { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 3f5b1c5c3..1f9dd9bab 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'picard' process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,7 +18,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { input: tuple val(meta), path(bam) path fasta - val opts + val options output: tuple val(meta), path("*_metrics"), emit: metrics @@ -26,7 +26,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -37,7 +37,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard \\ -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ - $opts.args \\ + $options.args \\ INPUT=$bam \\ OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 31c56bedd..338e269b5 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'picard' process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process PICARD_MARKDUPLICATES { input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("*.bam"), emit: bam @@ -25,7 +25,7 @@ process PICARD_MARKDUPLICATES { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -36,7 +36,7 @@ process PICARD_MARKDUPLICATES { picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ - $opts.args \\ + $options.args \\ INPUT=$bam \\ OUTPUT=${prefix}.bam \\ METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 76ea07ea8..2a4630a7b 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'picard' process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,14 +17,14 @@ process PICARD_MERGESAMFILES { input: tuple val(meta), path(bams) - val opts + val options output: tuple val(meta), path("*.bam"), emit: bam path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" bam_files = bams.sort() def avail_mem = 3 if (!task.memory) { @@ -37,7 +37,7 @@ process PICARD_MERGESAMFILES { picard \\ -Xmx${avail_mem}g \\ MergeSamFiles \\ - $opts.args \\ + $options.args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ OUTPUT=${prefix}.bam echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index b537077e9..4c9d24708 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -4,10 +4,10 @@ process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -18,7 +18,7 @@ process PRESEQ_LCEXTRAP { input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("*.ccurve.txt"), emit: ccurve @@ -26,17 +26,17 @@ process PRESEQ_LCEXTRAP { path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pe' """ preseq \\ lc_extrap \\ - $opts.args \\ + $options.args \\ $pe \\ -output ${prefix}.ccurve.txt \\ $bam cp .command.err ${prefix}.command.log - + echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index 537ab8cf6..8a17bba19 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -2,10 +2,10 @@ def SOFTWARE = 'samtools' process SAMTOOLS_FLAGSTAT { tag "$meta.id" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -16,7 +16,7 @@ process SAMTOOLS_FLAGSTAT { input: tuple val(meta), path(bam), path(bai) - val opts + val options output: tuple val(meta), path("*.flagstat"), emit: flagstat diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index cdedf6bdf..0dab14709 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -2,10 +2,10 @@ def SOFTWARE = 'samtools' process SAMTOOLS_IDXSTATS { tag "$meta.id" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -16,7 +16,7 @@ process SAMTOOLS_IDXSTATS { input: tuple val(meta), path(bam), path(bai) - val opts + val options output: tuple val(meta), path("*.idxstats"), emit: idxstats diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 7c17e1fe0..372a3d994 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -2,10 +2,10 @@ def SOFTWARE = 'samtools' process SAMTOOLS_INDEX { tag "$meta.id" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -16,7 +16,7 @@ process SAMTOOLS_INDEX { input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("*.bai"), emit: bai diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 61289303d..0249ee3cf 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'samtools' process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,16 +17,16 @@ process SAMTOOLS_SORT { input: tuple val(meta), path(bam) - val opts + val options output: tuple val(meta), path("*.bam"), emit: bam path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ - samtools sort $opts.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 55f125797..e1ddb90c8 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -2,10 +2,10 @@ def SOFTWARE = 'samtools' process SAMTOOLS_STATS { tag "$meta.id" - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -16,7 +16,7 @@ process SAMTOOLS_STATS { input: tuple val(meta), path(bam), path(bai) - val opts + val options output: tuple val(meta), path("*.stats"), emit: stats diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 59cc12dfd..b740fbc43 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -3,10 +3,10 @@ def SOFTWARE = 'trimgalore' process TRIMGALORE { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -17,7 +17,7 @@ process TRIMGALORE { input: tuple val(meta), path(reads) - val opts + val options output: tuple val(meta), path("*.fq.gz"), emit: reads @@ -45,12 +45,12 @@ process TRIMGALORE { tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz trim_galore \\ - $opts.args \\ + $options.args \\ --cores $cores \\ --gzip \\ $c_r1 \\ @@ -63,7 +63,7 @@ process TRIMGALORE { [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz trim_galore \\ - $opts.args \\ + $options.args \\ --cores $cores \\ --paired \\ --gzip \\ diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 544550f35..5059e4313 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -4,10 +4,10 @@ def VERSION = '377' process UCSC_BEDRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${opts.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, saveAs: { filename -> - if (opts.publish_results == "none") null + if (options.publish_results == "none") null else if (filename.endsWith('.version.txt')) null else filename } @@ -19,14 +19,14 @@ process UCSC_BEDRAPHTOBIGWIG { input: tuple val(meta), path(bedgraph) path sizes - val opts + val options output: tuple val(meta), path("*.bigWig"), emit: bigwig path "*.version.txt", emit: version script: - prefix = opts.suffix ? "${meta.id}${opts.suffix}" : "${meta.id}" + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig echo $VERSION > ${SOFTWARE}.version.txt diff --git a/modules/nf-core/subworkflow/bam_sort_samtools.nf b/modules/nf-core/subworkflow/bam_sort_samtools.nf index 7efb10245..c58c23ac7 100644 --- a/modules/nf-core/subworkflow/bam_sort_samtools.nf +++ b/modules/nf-core/subworkflow/bam_sort_samtools.nf @@ -8,13 +8,13 @@ include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow BAM_SORT_SAMTOOLS { take: - ch_bam // channel: [ val(meta), [ bam ] ] - samtools_opts // map: options for SAMTools modules + ch_bam // channel: [ val(meta), [ bam ] ] + samtools_options // map: options for SAMTools modules main: - SAMTOOLS_SORT(ch_bam, samtools_opts) - SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_opts) - BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + SAMTOOLS_SORT(ch_bam, samtools_options) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_options) + BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) emit: bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/modules/nf-core/subworkflow/bam_stats_samtools.nf b/modules/nf-core/subworkflow/bam_stats_samtools.nf index 5f2b6d5c7..9178106b1 100644 --- a/modules/nf-core/subworkflow/bam_stats_samtools.nf +++ b/modules/nf-core/subworkflow/bam_stats_samtools.nf @@ -8,13 +8,13 @@ include { SAMTOOLS_FLAGSTAT } from '../software/samtools_flagstat' workflow BAM_STATS_SAMTOOLS { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - samtools_opts // map: options for SAMTools modules + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + samtools_options // map: options for SAMTools modules main: - SAMTOOLS_STATS(ch_bam_bai, samtools_opts) - SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_opts) - SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_opts) + SAMTOOLS_STATS(ch_bam_bai, samtools_options) + SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_options) + SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_options) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] diff --git a/modules/nf-core/subworkflow/fastqc_trimgalore.nf b/modules/nf-core/subworkflow/fastqc_trimgalore.nf index 701075771..8cb75d659 100644 --- a/modules/nf-core/subworkflow/fastqc_trimgalore.nf +++ b/modules/nf-core/subworkflow/fastqc_trimgalore.nf @@ -7,18 +7,18 @@ include { TRIMGALORE } from '../software/trimgalore' workflow FASTQC_TRIMGALORE { take: - ch_reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - fastqc_opts // map: options for FastQC module - trimgalore_opts // map: options for TrimGalore! module + ch_reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + fastqc_options // map: options for FastQC module + trimgalore_options // map: options for TrimGalore! module main: fastqc_html = Channel.empty() fastqc_zip = Channel.empty() fastqc_version = Channel.empty() if (!skip_fastqc) { - FASTQC(ch_reads, fastqc_opts).html.set { fastqc_html } + FASTQC(ch_reads, fastqc_options).html.set { fastqc_html } fastqc_zip = FASTQC.out.zip fastqc_version = FASTQC.out.version } @@ -29,7 +29,7 @@ workflow FASTQC_TRIMGALORE { trim_log = Channel.empty() trimgalore_version = Channel.empty() if (!skip_trimming) { - TRIMGALORE(ch_reads, trimgalore_opts).reads.set { ch_trim_reads } + TRIMGALORE(ch_reads, trimgalore_options).reads.set { ch_trim_reads } trim_html = TRIMGALORE.out.html trim_zip = TRIMGALORE.out.zip trim_log = TRIMGALORE.out.log diff --git a/modules/nf-core/subworkflow/map_bwa_mem.nf b/modules/nf-core/subworkflow/map_bwa_mem.nf index 7f0338299..008c2dc3f 100644 --- a/modules/nf-core/subworkflow/map_bwa_mem.nf +++ b/modules/nf-core/subworkflow/map_bwa_mem.nf @@ -7,15 +7,15 @@ include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow MAP_BWA_MEM { take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index - ch_fasta // path: /path/to/genome.fasta - bwa_mem_opts // map: options for BWA MEM module - samtools_opts // map: options for SAMTools modules + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_options // map: options for BWA MEM module + samtools_options // map: options for SAMTools modules main: - BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_opts) - BAM_SORT_SAMTOOLS(BWA_MEM.out.bam, samtools_opts) + BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_options) + BAM_SORT_SAMTOOLS(BWA_MEM.out.bam, samtools_options) emit: bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/modules/nf-core/subworkflow/mark_duplicates_picard.nf b/modules/nf-core/subworkflow/mark_duplicates_picard.nf index 335a9d9a9..9bec786f3 100644 --- a/modules/nf-core/subworkflow/mark_duplicates_picard.nf +++ b/modules/nf-core/subworkflow/mark_duplicates_picard.nf @@ -8,14 +8,14 @@ include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow MARK_DUPLICATES_PICARD { take: - ch_bam // channel: [ val(meta), [ bam ] ] - markduplicates_opts // map: options for picard MarkDuplicates module - samtools_opts // map: options for SAMTools modules + ch_bam // channel: [ val(meta), [ bam ] ] + markduplicates_options // map: options for picard MarkDuplicates module + samtools_options // map: options for SAMTools modules main: - PICARD_MARKDUPLICATES(ch_bam, markduplicates_opts) - SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_opts) - BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_opts) + PICARD_MARKDUPLICATES(ch_bam, markduplicates_options) + SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_options) + BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) emit: bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] From f2b12df44e3f23a62fb14fea59fe5fe84c1a092f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 13:29:49 +0100 Subject: [PATCH 083/538] Add options to publish_by_id --- conf/modules.config | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 25334b035..baab712aa 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -10,42 +10,49 @@ params { suffix = "" publish_dir = "pipeline_info" publish_results = "all" + publish_by_id = false } 'fastqc' { args = "--quiet" suffix = "" publish_dir = "fastqc" publish_results = "all" + publish_by_id = false } 'trimgalore' { args = "--fastqc" suffix = "" publish_dir = "trim_galore" publish_results = "all" + publish_by_id = false } 'bwa_index' { args = "-a bwtsw" suffix = "" publish_dir = "genome/bwa_index" publish_results = "all" + publish_by_id = false } 'gtf2bed' { args = "" suffix = "" publish_dir = "genome" publish_results = "all" + publish_by_id = false } 'make_genome_filter' { args = "" suffix = "" publish_dir = "genome" publish_results = "all" + publish_by_id = false } 'get_chrom_sizes' { args = "" suffix = "" publish_dir = "genome" publish_results = "all" + publish_by_id = false } 'bwa_mem' { args = "-M" @@ -53,150 +60,182 @@ params { suffix = ".Lb" publish_dir = "bwa/library" publish_results = "all" + publish_by_id = false } 'samtools_sort_lib' { args = "" suffix = ".Lb.sorted" publish_dir = "bwa/library" publish_results = "all" + publish_by_id = false } 'picard_mergesamfiles' { args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" suffix = ".mLb.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'picard_markduplicates' { args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" suffix = ".mLb.mkD.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'samtools_sort_merged_lib' { args = "" suffix = ".mLb.mkD.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'bam_filter' { args = "" suffix = ".mLb.flT.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'bam_remove_orphans' { args = "--only_fr_pairs" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'samtools_sort_filter' { args = "" suffix = ".mLb.clN.sorted" publish_dir = "bwa/mergedLibrary" publish_results = "all" + publish_by_id = false } 'picard_collectmultiplemetrics' { args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" suffix = ".mLb.clN.sorted" publish_dir = "bwa/mergedLibrary/picard_metrics" publish_results = "all" + publish_by_id = false } 'preseq_lcextrap' { args = "-verbose -bam -seed 1" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/preseq" publish_results = "all" + publish_by_id = false } 'phantompeakqualtools' { args = "" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/phantompeakqualtools" publish_results = "all" + publish_by_id = false } 'bedtools_genomecov' { args = "" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" + publish_by_id = false } 'ucsc_bedgraphtobigwig' { args = "" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/bigwig" publish_results = "all" + publish_by_id = false } 'deeptools_computematrix' { args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" + publish_by_id = false } 'deeptools_plotprofile' { args = "" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" + publish_by_id = false } 'deeptools_plotheatmap' { args = "" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" + publish_by_id = false } 'deeptools_plotfingerprint' { args = "--skipZeros" suffix = ".mLb.clN" publish_dir = "bwa/mergedLibrary/deeptools" publish_results = "all" + publish_by_id = false } 'macs2_callpeak' { args = "--keep-dup all" suffix = "" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" + publish_by_id = false } 'plot_macs2_qc' { args = "-o ./ -p macs2_peak" suffix = "" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" + publish_by_id = false } 'homer_annotatepeaks_macs2' { args = "-gid" suffix = "_peaks" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" + publish_by_id = false } 'plot_homer_annotatepeaks' { args = "-o ./ -p macs2_annotatePeaks" suffix = "" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" + publish_by_id = false } 'macs2_consensus' { args = "" suffix = "" publish_dir = "bwa/mergedLibrary/macs2" publish_results = "all" + publish_by_id = false + } + 'homer_annotatepeaks_consensus' { + args = "-gid" + suffix = "" + publish_dir = "bwa/mergedLibrary/macs2" + publish_results = "all" + publish_by_id = true } 'get_software_versions' { args = "" suffix = "" publish_dir = "pipeline_info" publish_results = "all" + publish_by_id = false } 'output_documentation' { args = "" suffix = "" publish_dir = "pipeline_info" publish_results = "all" + publish_by_id = false } 'multiqc' { args = "" suffix = "" publish_dir = "multiqc" publish_results = "all" + publish_by_id = false } } } From dc2bbdd0171801b8d87ec58b9bdc9e74bba3ba98 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 14:00:47 +0100 Subject: [PATCH 084/538] Replace explicit declaration with initialised map --- conf/modules.config | 489 +++++++++++++++++++++++--------------------- 1 file changed, 254 insertions(+), 235 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index baab712aa..7b7768754 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -3,239 +3,258 @@ * Nextflow config file for module specific-options * ------------------------------------------------- */ -params { - modules { - 'samplesheet_check' { - args = "" - suffix = "" - publish_dir = "pipeline_info" - publish_results = "all" - publish_by_id = false - } - 'fastqc' { - args = "--quiet" - suffix = "" - publish_dir = "fastqc" - publish_results = "all" - publish_by_id = false - } - 'trimgalore' { - args = "--fastqc" - suffix = "" - publish_dir = "trim_galore" - publish_results = "all" - publish_by_id = false - } - 'bwa_index' { - args = "-a bwtsw" - suffix = "" - publish_dir = "genome/bwa_index" - publish_results = "all" - publish_by_id = false - } - 'gtf2bed' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - publish_by_id = false - } - 'make_genome_filter' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - publish_by_id = false - } - 'get_chrom_sizes' { - args = "" - suffix = "" - publish_dir = "genome" - publish_results = "all" - publish_by_id = false - } - 'bwa_mem' { - args = "-M" - args2 = "-h -F 0x0100 -O BAM" - suffix = ".Lb" - publish_dir = "bwa/library" - publish_results = "all" - publish_by_id = false - } - 'samtools_sort_lib' { - args = "" - suffix = ".Lb.sorted" - publish_dir = "bwa/library" - publish_results = "all" - publish_by_id = false - } - 'picard_mergesamfiles' { - args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - suffix = ".mLb.sorted" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'picard_markduplicates' { - args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - suffix = ".mLb.mkD.sorted" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'samtools_sort_merged_lib' { - args = "" - suffix = ".mLb.mkD.sorted" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'bam_filter' { - args = "" - suffix = ".mLb.flT.sorted" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'bam_remove_orphans' { - args = "--only_fr_pairs" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'samtools_sort_filter' { - args = "" - suffix = ".mLb.clN.sorted" - publish_dir = "bwa/mergedLibrary" - publish_results = "all" - publish_by_id = false - } - 'picard_collectmultiplemetrics' { - args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - suffix = ".mLb.clN.sorted" - publish_dir = "bwa/mergedLibrary/picard_metrics" - publish_results = "all" - publish_by_id = false - } - 'preseq_lcextrap' { - args = "-verbose -bam -seed 1" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/preseq" - publish_results = "all" - publish_by_id = false - } - 'phantompeakqualtools' { - args = "" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/phantompeakqualtools" - publish_results = "all" - publish_by_id = false - } - 'bedtools_genomecov' { - args = "" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/bigwig" - publish_results = "all" - publish_by_id = false - } - 'ucsc_bedgraphtobigwig' { - args = "" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/bigwig" - publish_results = "all" - publish_by_id = false - } - 'deeptools_computematrix' { - args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/deeptools" - publish_results = "all" - publish_by_id = false - } - 'deeptools_plotprofile' { - args = "" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/deeptools" - publish_results = "all" - publish_by_id = false - } - 'deeptools_plotheatmap' { - args = "" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/deeptools" - publish_results = "all" - publish_by_id = false - } - 'deeptools_plotfingerprint' { - args = "--skipZeros" - suffix = ".mLb.clN" - publish_dir = "bwa/mergedLibrary/deeptools" - publish_results = "all" - publish_by_id = false - } - 'macs2_callpeak' { - args = "--keep-dup all" - suffix = "" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = false - } - 'plot_macs2_qc' { - args = "-o ./ -p macs2_peak" - suffix = "" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = false - } - 'homer_annotatepeaks_macs2' { - args = "-gid" - suffix = "_peaks" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = false - } - 'plot_homer_annotatepeaks' { - args = "-o ./ -p macs2_annotatePeaks" - suffix = "" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = false - } - 'macs2_consensus' { - args = "" - suffix = "" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = false - } - 'homer_annotatepeaks_consensus' { - args = "-gid" - suffix = "" - publish_dir = "bwa/mergedLibrary/macs2" - publish_results = "all" - publish_by_id = true - } - 'get_software_versions' { - args = "" - suffix = "" - publish_dir = "pipeline_info" - publish_results = "all" - publish_by_id = false - } - 'output_documentation' { - args = "" - suffix = "" - publish_dir = "pipeline_info" - publish_results = "all" - publish_by_id = false - } - 'multiqc' { - args = "" - suffix = "" - publish_dir = "multiqc" - publish_results = "all" - publish_by_id = false - } - } + +def module_options_init(publish_dir="", args="", suffix="", publish_results="all", publish_by_id=false, args2="") { + def Map options = [:] + options.publish_dir = publish_dir + options.args = args + options.suffix = suffix + options.publish_results = publish_results + options.publish_by_id = publish_by_id + options.args2 = args2 + return options } + +def Map modules = [:] +modules['samplesheet_check'] = module_options_init(publish_dir="pipeline_info") +modules['fastqc'] = module_options_init(publish_dir="fastqc", args="--quiet") +modules['trimgalore'] = module_options_init(publish_dir="trimgalore", args="--fastqc") + +params.modules = modules +println(params.modules) +// params { +// modules { +// // 'samplesheet_check' { +// // args = "" +// // suffix = "" +// // publish_dir = "pipeline_info" +// // publish_results = "all" +// // publish_by_id = false +// // } +// 'fastqc' { +// args = "--quiet" +// suffix = "" +// publish_dir = "fastqc" +// publish_results = "all" +// publish_by_id = false +// } +// 'trimgalore' { +// args = "--fastqc" +// suffix = "" +// publish_dir = "trim_galore" +// publish_results = "all" +// publish_by_id = false +// } +// 'bwa_index' { +// args = "-a bwtsw" +// suffix = "" +// publish_dir = "genome/bwa_index" +// publish_results = "all" +// publish_by_id = false +// } +// 'gtf2bed' { +// args = "" +// suffix = "" +// publish_dir = "genome" +// publish_results = "all" +// publish_by_id = false +// } +// 'make_genome_filter' { +// args = "" +// suffix = "" +// publish_dir = "genome" +// publish_results = "all" +// publish_by_id = false +// } +// 'get_chrom_sizes' { +// args = "" +// suffix = "" +// publish_dir = "genome" +// publish_results = "all" +// publish_by_id = false +// } +// 'bwa_mem' { +// args = "-M" +// args2 = "-h -F 0x0100 -O BAM" +// suffix = ".Lb" +// publish_dir = "bwa/library" +// publish_results = "all" +// publish_by_id = false +// } +// 'samtools_sort_lib' { +// args = "" +// suffix = ".Lb.sorted" +// publish_dir = "bwa/library" +// publish_results = "all" +// publish_by_id = false +// } +// 'picard_mergesamfiles' { +// args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" +// suffix = ".mLb.sorted" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'picard_markduplicates' { +// args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" +// suffix = ".mLb.mkD.sorted" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'samtools_sort_merged_lib' { +// args = "" +// suffix = ".mLb.mkD.sorted" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'bam_filter' { +// args = "" +// suffix = ".mLb.flT.sorted" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'bam_remove_orphans' { +// args = "--only_fr_pairs" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'samtools_sort_filter' { +// args = "" +// suffix = ".mLb.clN.sorted" +// publish_dir = "bwa/mergedLibrary" +// publish_results = "all" +// publish_by_id = false +// } +// 'picard_collectmultiplemetrics' { +// args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" +// suffix = ".mLb.clN.sorted" +// publish_dir = "bwa/mergedLibrary/picard_metrics" +// publish_results = "all" +// publish_by_id = false +// } +// 'preseq_lcextrap' { +// args = "-verbose -bam -seed 1" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/preseq" +// publish_results = "all" +// publish_by_id = false +// } +// 'phantompeakqualtools' { +// args = "" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/phantompeakqualtools" +// publish_results = "all" +// publish_by_id = false +// } +// 'bedtools_genomecov' { +// args = "" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/bigwig" +// publish_results = "all" +// publish_by_id = false +// } +// 'ucsc_bedgraphtobigwig' { +// args = "" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/bigwig" +// publish_results = "all" +// publish_by_id = false +// } +// 'deeptools_computematrix' { +// args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/deeptools" +// publish_results = "all" +// publish_by_id = false +// } +// 'deeptools_plotprofile' { +// args = "" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/deeptools" +// publish_results = "all" +// publish_by_id = false +// } +// 'deeptools_plotheatmap' { +// args = "" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/deeptools" +// publish_results = "all" +// publish_by_id = false +// } +// 'deeptools_plotfingerprint' { +// args = "--skipZeros" +// suffix = ".mLb.clN" +// publish_dir = "bwa/mergedLibrary/deeptools" +// publish_results = "all" +// publish_by_id = false +// } +// 'macs2_callpeak' { +// args = "--keep-dup all" +// suffix = "" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = false +// } +// 'plot_macs2_qc' { +// args = "-o ./ -p macs2_peak" +// suffix = "" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = false +// } +// 'homer_annotatepeaks_macs2' { +// args = "-gid" +// suffix = "_peaks" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = false +// } +// 'plot_homer_annotatepeaks' { +// args = "-o ./ -p macs2_annotatePeaks" +// suffix = "" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = false +// } +// 'macs2_consensus' { +// args = "" +// suffix = "" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = false +// } +// 'homer_annotatepeaks_consensus' { +// args = "-gid" +// suffix = "" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_results = "all" +// publish_by_id = true +// } +// 'get_software_versions' { +// args = "" +// suffix = "" +// publish_dir = "pipeline_info" +// publish_results = "all" +// publish_by_id = false +// } +// 'output_documentation' { +// args = "" +// suffix = "" +// publish_dir = "pipeline_info" +// publish_results = "all" +// publish_by_id = false +// } +// 'multiqc' { +// args = "" +// suffix = "" +// publish_dir = "multiqc" +// publish_results = "all" +// publish_by_id = false +// } +// } +// } From a906de8ceec303247e1bff085168f0b87e09bacc Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 16:25:52 +0100 Subject: [PATCH 085/538] Refactor provision of module options --- conf/modules.config | 455 ++++++++++++++++++++------------------------ main.nf | 17 +- 2 files changed, 221 insertions(+), 251 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7b7768754..5fb0526a7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -4,257 +4,218 @@ * ------------------------------------------------- */ -def module_options_init(publish_dir="", args="", suffix="", publish_results="all", publish_by_id=false, args2="") { +// Function to initialise default values and to generate a Groovy Map of module options +def module_options (Map args) { def Map options = [:] - options.publish_dir = publish_dir - options.args = args - options.suffix = suffix - options.publish_results = publish_results - options.publish_by_id = publish_by_id - options.args2 = args2 + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_dir = args.publish_dir ?: '' + options.publish_results = args.publish_results ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.suffix = args.suffix ?: '' return options } def Map modules = [:] -modules['samplesheet_check'] = module_options_init(publish_dir="pipeline_info") -modules['fastqc'] = module_options_init(publish_dir="fastqc", args="--quiet") -modules['trimgalore'] = module_options_init(publish_dir="trimgalore", args="--fastqc") +modules['samplesheet_check'] = + module_options ( + publish_dir : "pipeline_info" + ) + +modules['fastqc'] = + module_options ( + args : "--quiet", + publish_dir : "fastqc" + ) + +modules['trimgalore'] = + module_options ( + args : "--fastqc", + publish_dir : "trimgalore" + ) + +modules['bwa_index'] = + module_options ( + args : "-a bwtsw", + publish_dir : "genome/bwa_index" + ) + +modules['gtf2bed'] = + module_options ( + publish_dir : "genome" + ) + +modules['make_genome_filter'] = + module_options ( + publish_dir : "genome" + ) + +modules['get_chrom_sizes'] = + module_options ( + publish_dir : "genome" + ) + +modules['bwa_mem'] = + module_options ( + args : "-M", + args2 : "-h -F 0x0100 -O BAM", + publish_dir : "bwa/library", + suffix : ".Lb" + ) + +modules['samtools_sort_lib'] = + module_options ( + publish_dir : "bwa/library", + suffix : ".Lb.sorted" + ) + +modules['picard_mergesamfiles'] = + module_options ( + args : "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.sorted" + ) + +modules['picard_markduplicates'] = + module_options ( + args : "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.mkD.sorted" + ) + +modules['samtools_sort_merged_lib'] = + module_options ( + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.mkD.sorted" + ) + +modules['bam_filter'] = + module_options ( + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.flT.sorted" + ) + +modules['bam_remove_orphans'] = + module_options ( + args : "--only_fr_pairs", + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.clN" + ) + +modules['samtools_sort_filter'] = + module_options ( + publish_dir : "bwa/mergedLibrary", + suffix : ".mLb.clN.sorted" + ) + +modules['picard_collectmultiplemetrics'] = + module_options ( + args : "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", + publish_dir : "bwa/mergedLibrary/picard_metrics", + suffix : ".mLb.clN.sorted" + ) + +modules['preseq_lcextrap'] = + module_options ( + args : "-verbose -bam -seed 1", + publish_dir : "bwa/mergedLibrary/preseq", + suffix : ".mLb.clN" + ) + +modules['phantompeakqualtools'] = + module_options ( + publish_dir : "bwa/mergedLibrary/phantompeakqualtools", + suffix : ".mLb.clN" + ) + +modules['bedtools_genomecov'] = + module_options ( + publish_dir : "bwa/mergedLibrary/bigwig", + suffix : ".mLb.clN" + ) + +modules['ucsc_bedgraphtobigwig'] = + module_options ( + publish_dir : "bwa/mergedLibrary/bigwig", + suffix : ".mLb.clN" + ) + +modules['deeptools_computematrix'] = + module_options ( + args : "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels", + publish_dir : "bwa/mergedLibrary/deeptools", + suffix : ".mLb.clN" + ) + +modules['deeptools_plotprofile'] = + module_options ( + publish_dir : "bwa/mergedLibrary/deeptools", + suffix : ".mLb.clN" + ) + +modules['deeptools_plotheatmap'] = + module_options ( + publish_dir : "bwa/mergedLibrary/deeptools", + suffix : ".mLb.clN" + ) + +modules['deeptools_plotfingerprint'] = + module_options ( + args : "--skipZeros", + publish_dir : "bwa/mergedLibrary/deeptools", + suffix : ".mLb.clN" + ) + +modules['macs2_callpeak'] = + module_options ( + args : "--keep-dup all", + publish_dir : "bwa/mergedLibrary/macs2" + ) + +modules['plot_macs2_qc'] = + module_options ( + args : "-o ./ -p macs2_peak", + publish_dir : "bwa/mergedLibrary/macs2" + ) + +modules['homer_annotatepeaks_macs2'] = + module_options ( + args : "-gid", + publish_dir : "bwa/mergedLibrary/macs2", + suffix : "_peaks" + ) + +modules['plot_homer_annotatepeaks'] = + module_options ( + args : "-o ./ -p macs2_annotatePeaks", + publish_dir : "bwa/mergedLibrary/macs2", + ) + +modules['macs2_consensus'] = + module_options ( + publish_dir : "bwa/mergedLibrary/macs2" + ) + +modules['homer_annotatepeaks_consensus'] = + module_options ( + args : "-gid", + publish_dir : "bwa/mergedLibrary/macs2", + publish_by_id : true + ) + +modules['get_software_versions'] = + module_options ( + publish_dir : "pipeline_info" + ) + +modules['output_documentation'] = + module_options ( + publish_dir : "pipeline_info" + ) + +modules['multiqc'] = + module_options ( + publish_dir : "multiqc" + ) params.modules = modules -println(params.modules) -// params { -// modules { -// // 'samplesheet_check' { -// // args = "" -// // suffix = "" -// // publish_dir = "pipeline_info" -// // publish_results = "all" -// // publish_by_id = false -// // } -// 'fastqc' { -// args = "--quiet" -// suffix = "" -// publish_dir = "fastqc" -// publish_results = "all" -// publish_by_id = false -// } -// 'trimgalore' { -// args = "--fastqc" -// suffix = "" -// publish_dir = "trim_galore" -// publish_results = "all" -// publish_by_id = false -// } -// 'bwa_index' { -// args = "-a bwtsw" -// suffix = "" -// publish_dir = "genome/bwa_index" -// publish_results = "all" -// publish_by_id = false -// } -// 'gtf2bed' { -// args = "" -// suffix = "" -// publish_dir = "genome" -// publish_results = "all" -// publish_by_id = false -// } -// 'make_genome_filter' { -// args = "" -// suffix = "" -// publish_dir = "genome" -// publish_results = "all" -// publish_by_id = false -// } -// 'get_chrom_sizes' { -// args = "" -// suffix = "" -// publish_dir = "genome" -// publish_results = "all" -// publish_by_id = false -// } -// 'bwa_mem' { -// args = "-M" -// args2 = "-h -F 0x0100 -O BAM" -// suffix = ".Lb" -// publish_dir = "bwa/library" -// publish_results = "all" -// publish_by_id = false -// } -// 'samtools_sort_lib' { -// args = "" -// suffix = ".Lb.sorted" -// publish_dir = "bwa/library" -// publish_results = "all" -// publish_by_id = false -// } -// 'picard_mergesamfiles' { -// args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" -// suffix = ".mLb.sorted" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'picard_markduplicates' { -// args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" -// suffix = ".mLb.mkD.sorted" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'samtools_sort_merged_lib' { -// args = "" -// suffix = ".mLb.mkD.sorted" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'bam_filter' { -// args = "" -// suffix = ".mLb.flT.sorted" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'bam_remove_orphans' { -// args = "--only_fr_pairs" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'samtools_sort_filter' { -// args = "" -// suffix = ".mLb.clN.sorted" -// publish_dir = "bwa/mergedLibrary" -// publish_results = "all" -// publish_by_id = false -// } -// 'picard_collectmultiplemetrics' { -// args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" -// suffix = ".mLb.clN.sorted" -// publish_dir = "bwa/mergedLibrary/picard_metrics" -// publish_results = "all" -// publish_by_id = false -// } -// 'preseq_lcextrap' { -// args = "-verbose -bam -seed 1" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/preseq" -// publish_results = "all" -// publish_by_id = false -// } -// 'phantompeakqualtools' { -// args = "" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/phantompeakqualtools" -// publish_results = "all" -// publish_by_id = false -// } -// 'bedtools_genomecov' { -// args = "" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/bigwig" -// publish_results = "all" -// publish_by_id = false -// } -// 'ucsc_bedgraphtobigwig' { -// args = "" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/bigwig" -// publish_results = "all" -// publish_by_id = false -// } -// 'deeptools_computematrix' { -// args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/deeptools" -// publish_results = "all" -// publish_by_id = false -// } -// 'deeptools_plotprofile' { -// args = "" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/deeptools" -// publish_results = "all" -// publish_by_id = false -// } -// 'deeptools_plotheatmap' { -// args = "" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/deeptools" -// publish_results = "all" -// publish_by_id = false -// } -// 'deeptools_plotfingerprint' { -// args = "--skipZeros" -// suffix = ".mLb.clN" -// publish_dir = "bwa/mergedLibrary/deeptools" -// publish_results = "all" -// publish_by_id = false -// } -// 'macs2_callpeak' { -// args = "--keep-dup all" -// suffix = "" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = false -// } -// 'plot_macs2_qc' { -// args = "-o ./ -p macs2_peak" -// suffix = "" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = false -// } -// 'homer_annotatepeaks_macs2' { -// args = "-gid" -// suffix = "_peaks" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = false -// } -// 'plot_homer_annotatepeaks' { -// args = "-o ./ -p macs2_annotatePeaks" -// suffix = "" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = false -// } -// 'macs2_consensus' { -// args = "" -// suffix = "" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = false -// } -// 'homer_annotatepeaks_consensus' { -// args = "-gid" -// suffix = "" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_results = "all" -// publish_by_id = true -// } -// 'get_software_versions' { -// args = "" -// suffix = "" -// publish_dir = "pipeline_info" -// publish_results = "all" -// publish_by_id = false -// } -// 'output_documentation' { -// args = "" -// suffix = "" -// publish_dir = "pipeline_info" -// publish_results = "all" -// publish_by_id = false -// } -// 'multiqc' { -// args = "" -// suffix = "" -// publish_dir = "multiqc" -// publish_results = "all" -// publish_by_id = false -// } -// } -// } diff --git a/main.nf b/main.nf index 63d95c727..1946dffd3 100755 --- a/main.nf +++ b/main.nf @@ -163,7 +163,8 @@ include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deept include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools_plotfingerprint' include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools' include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' -include { HOMER_ANNOTATEPEAKS } from './modules/nf-core/software/homer_annotatepeaks' +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 + HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer_annotatepeaks' //include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' @@ -388,17 +389,17 @@ workflow { ) params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" - HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2 ( MACS2_CALLPEAK.out.peak, ch_fasta, ch_gtf, params.modules['homer_annotatepeaks_macs2'] ) - ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS.out.version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS.out.txt.collect{it[1]}, + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, "_peaks.annotatePeaks.txt", params.modules['plot_homer_annotatepeaks'] ) @@ -430,6 +431,14 @@ workflow { params.modules['macs2_consensus'] ) + params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_consensus'] + ) + //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } From 02d64210cd6c468129548ed70115391937b2548a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 17:38:12 +0100 Subject: [PATCH 086/538] test publish_by_id --- modules/nf-core/software/homer_annotatepeaks.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index cf09a4847..305056a82 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -4,7 +4,7 @@ def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${publish_id}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null @@ -28,6 +28,7 @@ process HOMER_ANNOTATEPEAKS { script: prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + publish_id = options.publish_by_id ? "/${meta.id}" : '' """ annotatePeaks.pl \\ $peak \\ From d71c4a63e0552c678f660956dbc434e49c3bb093 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 18:06:16 +0100 Subject: [PATCH 087/538] Add module option to publish by id --- modules/nf-core/software/homer_annotatepeaks.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 305056a82..c65a9ea49 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -4,7 +4,7 @@ def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${publish_id}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null @@ -28,7 +28,6 @@ process HOMER_ANNOTATEPEAKS { script: prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" - publish_id = options.publish_by_id ? "/${meta.id}" : '' """ annotatePeaks.pl \\ $peak \\ From 793251ecfa4ee4a9805857a3f7ff4010211c8fbe Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 18:06:48 +0100 Subject: [PATCH 088/538] Rename annotated peaks --- conf/modules.config | 3 ++- main.nf | 39 ++------------------------------------- 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5fb0526a7..633ae748a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -200,7 +200,8 @@ modules['homer_annotatepeaks_consensus'] = module_options ( args : "-gid", publish_dir : "bwa/mergedLibrary/macs2", - publish_by_id : true + publish_by_id : true, + suffix : ".consensus_peaks" ) modules['get_software_versions'] = diff --git a/main.nf b/main.nf index 1946dffd3..22f4451c0 100755 --- a/main.nf +++ b/main.nf @@ -438,6 +438,8 @@ workflow { ch_gtf, params.modules['homer_annotatepeaks_consensus'] ) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } @@ -516,43 +518,6 @@ workflow.onComplete { /* -- THE END -- */ //////////////////////////////////////////////////// -// -// /* -// * STEP 7.2: Annotate consensus peaks with HOMER, and add annotation to boolean output file -// */ -// process CONSENSUS_PEAKS_ANNOTATE { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks && !params.skip_peak_annotation -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bed) from ch_macs_consensus_bed -// path bool from ch_macs_consensus_bool -// path fasta from ch_fasta -// path gtf from ch_gtf -// -// output: -// path '*.annotatePeaks.txt' -// -// script: -// prefix = "${antibody}.consensus_peaks" -// """ -// annotatePeaks.pl \\ -// $bed \\ -// $fasta \\ -// -gid \\ -// -gtf $gtf \\ -// -cpu $task.cpus \\ -// > ${prefix}.annotatePeaks.txt -// -// cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt -// paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt -// """ -// } -// // // Get BAM and SAF files for each ip // ch_group_bam_counts // .map { it -> [ it[3], [ it[0], it[1], it[2] ] ] } From f4e292424599fdc5ce2601202fdf04f625ed73e0 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 18:17:54 +0100 Subject: [PATCH 089/538] Add publish_by_id option --- modules/local/process/bam_filter.nf | 2 +- modules/local/process/bam_remove_orphans.nf | 2 +- modules/local/process/bedtools_genomecov.nf | 2 +- modules/local/process/macs2_consensus.nf | 2 +- modules/nf-core/software/bwa_mem.nf | 2 +- modules/nf-core/software/deeptools_computematrix.nf | 2 +- modules/nf-core/software/deeptools_plotfingerprint.nf | 2 +- modules/nf-core/software/deeptools_plotheatmap.nf | 2 +- modules/nf-core/software/deeptools_plotprofile.nf | 2 +- modules/nf-core/software/fastqc.nf | 2 +- modules/nf-core/software/macs2_callpeak.nf | 2 +- modules/nf-core/software/phantompeakqualtools.nf | 2 +- modules/nf-core/software/picard_collectmultiplemetrics.nf | 2 +- modules/nf-core/software/picard_markduplicates.nf | 2 +- modules/nf-core/software/picard_mergesamfiles.nf | 2 +- modules/nf-core/software/preseq_lcextrap.nf | 2 +- modules/nf-core/software/samtools_flagstat.nf | 2 +- modules/nf-core/software/samtools_idxstats.nf | 2 +- modules/nf-core/software/samtools_index.nf | 2 +- modules/nf-core/software/samtools_sort.nf | 2 +- modules/nf-core/software/samtools_stats.nf | 2 +- modules/nf-core/software/trimgalore.nf | 2 +- modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index df4e9e90b..7edfd3339 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -4,7 +4,7 @@ process BAM_FILTER { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index 6aa109a4e..65b30d241 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -4,7 +4,7 @@ process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 5a97667d4..5e60e76e5 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'bedtools' process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index 8abb2c515..ed26a5a86 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -4,7 +4,7 @@ process MACS2_CONSENSUS { tag "$meta.id" label 'process_long' - publishDir "${params.outdir}/${options.publish_dir}/${meta.id}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index a0d350b3e..8f4e826ba 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'bwa' process BWA_MEM { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index e9b2ec06b..895afeb21 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index a7ecd0cb8..0b0663a51 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index e12fa6c7e..5ded02db2 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index a34de4cda..3932e0e66 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index f526e8d98..8d5f49825 100755 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'fastqc' process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index f4bfac096..20e2a93f0 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'macs2' process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index a6df15650..8d072bab2 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -4,7 +4,7 @@ def VERSION = '1.2.2' process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 1f9dd9bab..80e0eacc2 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'picard' process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 338e269b5..13abdd901 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'picard' process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 2a4630a7b..5e81b5a52 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'picard' process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 4c9d24708..b5189911d 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -4,7 +4,7 @@ process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index 8a17bba19..b7f066653 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -2,7 +2,7 @@ def SOFTWARE = 'samtools' process SAMTOOLS_FLAGSTAT { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 0dab14709..2462c0a21 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -2,7 +2,7 @@ def SOFTWARE = 'samtools' process SAMTOOLS_IDXSTATS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 372a3d994..7baafd525 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -2,7 +2,7 @@ def SOFTWARE = 'samtools' process SAMTOOLS_INDEX { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 0249ee3cf..8e665bb17 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'samtools' process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index e1ddb90c8..1a8d84d07 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -2,7 +2,7 @@ def SOFTWARE = 'samtools' process SAMTOOLS_STATS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index b740fbc43..130bc90ee 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -3,7 +3,7 @@ def SOFTWARE = 'trimgalore' process TRIMGALORE { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 5059e4313..43b9b16ce 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -4,7 +4,7 @@ def VERSION = '377' process UCSC_BEDRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, saveAs: { filename -> if (options.publish_results == "none") null From ce414f1475076a513b7a70e30880c163101965f3 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 18:25:51 +0100 Subject: [PATCH 090/538] Tidy up main script --- main.nf | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/main.nf b/main.nf index 22f4451c0..cc87df977 100755 --- a/main.nf +++ b/main.nf @@ -444,7 +444,6 @@ workflow { //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) } - /* * Pipeline reporting */ @@ -617,14 +616,6 @@ workflow.onComplete { // """ // } // -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// /* -- -- */ -// /* -- IGV -- */ -// /* -- -- */ -// /////////////////////////////////////////////////////////////////////////////// -// /////////////////////////////////////////////////////////////////////////////// -// // /* // * STEP 8: Create IGV session file // */ @@ -650,11 +641,3 @@ workflow.onComplete { // igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' // """ // } - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -- -- */ -/* -- END OF PIPELINE -- */ -/* -- -- */ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// From b2a129148bc0f3ec0ee46b5a1496052dd842baa4 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 29 Jul 2020 21:47:02 +0100 Subject: [PATCH 091/538] Update env to get release tests passing --- environment.yml | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/environment.yml b/environment.yml index 361352d0c..e1cce55c3 100644 --- a/environment.yml +++ b/environment.yml @@ -7,11 +7,11 @@ channels: - defaults dependencies: ## conda-forge packages - - conda-forge::python=3.7.8 + - conda-forge::python=3.7.6 - conda-forge::markdown=3.2.2 - conda-forge::pymdown-extensions=7.1 - conda-forge::pygments=2.6.1 - - conda-forge::r-base=4.0.2 + - conda-forge::r-base=3.6.2 - conda-forge::r-optparse=1.6.6 - conda-forge::r-rcolorbrewer=1.1_2 - conda-forge::r-reshape2=1.4.4 @@ -21,13 +21,27 @@ dependencies: - conda-forge::r-pheatmap=1.0.12 - conda-forge::r-lattice=0.20_41 - conda-forge::r-upsetr=1.4.0 - - conda-forge::r-xfun=0.16 + - conda-forge::r-xfun=0.15 + - conda-forge::gawk=5.1.0 + - conda-forge::pigz=2.3.4 ## Required for TrimGalore multi-threading ## bioconda packages + - bioconda::fastqc=0.11.9 + - bioconda::trim-galore=0.6.5 + - bioconda::bwa=0.7.17 - bioconda::samtools=1.10 + - bioconda::picard=2.23.1 - bioconda::bamtools=2.5.1 - - bioconda::pysam=0.16.0.1 + - bioconda::pysam=0.15.3 - bioconda::bedtools=2.29.2 - - bioconda::bioconductor-biocparallel=1.22.0 - - bioconda::bioconductor-deseq2=1.28.0 - - bioconda::bioconductor-vsn=3.56.0 + - bioconda::ucsc-bedgraphtobigwig=357 + - bioconda::deeptools=3.4.3 + - bioconda::macs2=2.2.7.1 + - bioconda::homer=4.11 + - bioconda::subread=2.0.1 + - bioconda::phantompeakqualtools=1.2.2 + - bioconda::preseq=2.0.3 + - bioconda::multiqc=1.9 + - bioconda::bioconductor-biocparallel=1.20.0 + - bioconda::bioconductor-deseq2=1.26.0 + - bioconda::bioconductor-vsn=3.54.0 From 57b4a5bf4a935a9882228c4fbc5c8f28f64643af Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:26:33 +0100 Subject: [PATCH 092/538] Update environment --- conf/modules.config | 17 +++++++++++++++++ environment.yml | 28 +++++++--------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 633ae748a..6d9425a83 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -204,6 +204,23 @@ modules['homer_annotatepeaks_consensus'] = suffix : ".consensus_peaks" ) +modules['subread_featurecounts'] = + module_options ( + args : "-F SAF -O --fracOverlap 0.2", + publish_dir : "bwa/mergedLibrary/macs2", + suffix : "" + ) + +modules['deseq2_featurecounts'] = + module_options ( + publish_dir : "bwa/mergedLibrary/macs2" + ) + +modules['igv'] = + module_options ( + publish_dir : "igv" + ) + modules['get_software_versions'] = module_options ( publish_dir : "pipeline_info" diff --git a/environment.yml b/environment.yml index e1cce55c3..361352d0c 100644 --- a/environment.yml +++ b/environment.yml @@ -7,11 +7,11 @@ channels: - defaults dependencies: ## conda-forge packages - - conda-forge::python=3.7.6 + - conda-forge::python=3.7.8 - conda-forge::markdown=3.2.2 - conda-forge::pymdown-extensions=7.1 - conda-forge::pygments=2.6.1 - - conda-forge::r-base=3.6.2 + - conda-forge::r-base=4.0.2 - conda-forge::r-optparse=1.6.6 - conda-forge::r-rcolorbrewer=1.1_2 - conda-forge::r-reshape2=1.4.4 @@ -21,27 +21,13 @@ dependencies: - conda-forge::r-pheatmap=1.0.12 - conda-forge::r-lattice=0.20_41 - conda-forge::r-upsetr=1.4.0 - - conda-forge::r-xfun=0.15 - - conda-forge::gawk=5.1.0 - - conda-forge::pigz=2.3.4 ## Required for TrimGalore multi-threading + - conda-forge::r-xfun=0.16 ## bioconda packages - - bioconda::fastqc=0.11.9 - - bioconda::trim-galore=0.6.5 - - bioconda::bwa=0.7.17 - bioconda::samtools=1.10 - - bioconda::picard=2.23.1 - bioconda::bamtools=2.5.1 - - bioconda::pysam=0.15.3 + - bioconda::pysam=0.16.0.1 - bioconda::bedtools=2.29.2 - - bioconda::ucsc-bedgraphtobigwig=357 - - bioconda::deeptools=3.4.3 - - bioconda::macs2=2.2.7.1 - - bioconda::homer=4.11 - - bioconda::subread=2.0.1 - - bioconda::phantompeakqualtools=1.2.2 - - bioconda::preseq=2.0.3 - - bioconda::multiqc=1.9 - - bioconda::bioconductor-biocparallel=1.20.0 - - bioconda::bioconductor-deseq2=1.26.0 - - bioconda::bioconductor-vsn=3.54.0 + - bioconda::bioconductor-biocparallel=1.22.0 + - bioconda::bioconductor-deseq2=1.28.0 + - bioconda::bioconductor-vsn=3.56.0 From 7eb4842cc8beb76298df8be82f222e09be14a556 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:26:49 +0100 Subject: [PATCH 093/538] Add in featurecounts --- modules/local/process/multiqc.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 513886bb9..0f2572091 100755 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -52,7 +52,7 @@ process MULTIQC { // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) - // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) + path ('featurecounts/*') // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) val options From fb22ea032fc237cf4dee1d5191b2c93fb5910008 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:27:03 +0100 Subject: [PATCH 094/538] Get featurecounts working --- .../nf-core/software/subread_featurecounts.nf | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 536aa7e8b..36d38da01 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,41 +1,41 @@ def SOFTWARE = 'subread' -container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" -//container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" -//echo \$(featureCounts -v 2>&1) > featurecounts.version.txt -conda (params.conda ? "bioconda::subread=2.0.1" : null) -//echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${SOFTWARE}.version.txt -// /* -// * STEP 7.3: Count reads in consensus peaks with featureCounts -// */ -// process CONSENSUS_PEAKS_COUNTS { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bams), path(saf) from ch_group_bam_counts -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*featureCounts.txt') into ch_macs_consensus_counts -// path '*featureCounts.txt.summary' into ch_macs_consensus_counts_mqc -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() -// pe_params = params.single_end ? '' : '-p --donotsort' -// """ -// featureCounts \\ -// -F SAF \\ -// -O \\ -// --fracOverlap 0.2 \\ -// -T $task.cpus \\ -// $pe_params \\ -// -a $saf \\ -// -o ${prefix}.featureCounts.txt \\ -// ${bam_files.join(' ')} -// """ -// } +process SUBREAD_FEATURECOUNTS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (options.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" + //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" + + conda (params.conda ? "bioconda::subread=2.0.1" : null) + + input: + tuple val(meta), path(bams), path(annotation) + val options + + output: + tuple val(meta), path("*featureCounts.txt"), emit: txt + tuple val(meta), path("*featureCounts.txt.summary"), emit: summary + path "*.version.txt", emit: version + + script: + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + pe = meta.single_end ? '' : '-p' + """ + featureCounts \\ + $options.args \\ + $pe \\ + -T $task.cpus \\ + -a $annotation \\ + -o ${prefix}.featureCounts.txt \\ + ${bams.join(' ')} + + echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${SOFTWARE}.version.txt + """ +} From 35e345af5016b1014503a66db683192afabc7dfd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:27:13 +0100 Subject: [PATCH 095/538] Initial commit --- modules/local/process/deseq2_featurecounts.nf | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 modules/local/process/deseq2_featurecounts.nf diff --git a/modules/local/process/deseq2_featurecounts.nf b/modules/local/process/deseq2_featurecounts.nf new file mode 100644 index 000000000..4586ee7e1 --- /dev/null +++ b/modules/local/process/deseq2_featurecounts.nf @@ -0,0 +1,55 @@ +conda (params.conda ? "${baseDir}/environment.yml" : null) + +// /* +// * STEP 7.4: Differential analysis with DESeq2 +// */ +// process CONSENSUS_PEAKS_DESEQ2 { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts +// path deseq2_pca_header from ch_deseq2_pca_header +// path deseq2_clustering_header from ch_deseq2_clustering_header +// +// output: +// path '*.tsv' into ch_macs_consensus_deseq_mqc +// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv +// path '*.{RData,results.txt,pdf,log}' +// path 'sizeFactors' +// path '*vs*/*.{pdf,txt}' +// path '*vs*/*.bed' +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' +// vst = params.deseq2_vst ? '--vst TRUE' : '' +// """ +// featurecounts_deseq2.r \\ +// --featurecount_file $counts \\ +// --bam_suffix '$bam_ext' \\ +// --outdir ./ \\ +// --outprefix $prefix \\ +// --outsuffix '' \\ +// --cores $task.cpus \\ +// $vst +// +// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv +// +// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv +// +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt +// """ +// } From d6a87840f8a8afd945095d05de8eb210fb5cbc07 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:27:27 +0100 Subject: [PATCH 096/538] Rename for grouping --- modules/local/process/featurecounts_deseq2.nf | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 modules/local/process/featurecounts_deseq2.nf diff --git a/modules/local/process/featurecounts_deseq2.nf b/modules/local/process/featurecounts_deseq2.nf deleted file mode 100644 index 4586ee7e1..000000000 --- a/modules/local/process/featurecounts_deseq2.nf +++ /dev/null @@ -1,55 +0,0 @@ -conda (params.conda ? "${baseDir}/environment.yml" : null) - -// /* -// * STEP 7.4: Differential analysis with DESeq2 -// */ -// process CONSENSUS_PEAKS_DESEQ2 { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts -// path deseq2_pca_header from ch_deseq2_pca_header -// path deseq2_clustering_header from ch_deseq2_clustering_header -// -// output: -// path '*.tsv' into ch_macs_consensus_deseq_mqc -// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv -// path '*.{RData,results.txt,pdf,log}' -// path 'sizeFactors' -// path '*vs*/*.{pdf,txt}' -// path '*vs*/*.bed' -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' -// vst = params.deseq2_vst ? '--vst TRUE' : '' -// """ -// featurecounts_deseq2.r \\ -// --featurecount_file $counts \\ -// --bam_suffix '$bam_ext' \\ -// --outdir ./ \\ -// --outprefix $prefix \\ -// --outsuffix '' \\ -// --cores $task.cpus \\ -// $vst -// -// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv -// -// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv -// -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt -// """ -// } From ab08373600001e89f43053cf97622606ff80257d Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 18:27:37 +0100 Subject: [PATCH 097/538] Fix featurecounts --- main.nf | 188 ++++++++++++++++---------------------------------------- 1 file changed, 52 insertions(+), 136 deletions(-) diff --git a/main.nf b/main.nf index cc87df977..4497bf105 100755 --- a/main.nf +++ b/main.nf @@ -140,7 +140,9 @@ include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_geno include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' -// include { FRIP_SCORE } from './modules/local/process/frip_score' +//include { FRIP_SCORE } from './modules/local/process/frip_score' +//include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' +//include { IGV } from './modules/local/process/igv' include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' include { MULTIQC } from './modules/local/process/multiqc' @@ -165,7 +167,7 @@ include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phant include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer_annotatepeaks' -//include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' +include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' include { MAP_BWA_MEM } from './modules/nf-core/subworkflow/map_bwa_mem' @@ -337,23 +339,23 @@ workflow { .bam .join ( BAM_CLEAN.out.bai, by: [0] ) .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - .set { ch_ip_control_bam } + .set { ch_control_bam_bai } BAM_CLEAN .out .bam .join ( BAM_CLEAN.out.bai, by: [0] ) .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - .combine(ch_ip_control_bam, by: 0) + .combine(ch_control_bam_bai, by: 0) .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - .set { ch_ip_control_bam } + .set { ch_ip_control_bam_bai } /* * plotFingerprint for IP and control together */ params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" DEEPTOOLS_PLOTFINGERPRINT ( - ch_ip_control_bam, + ch_ip_control_bam_bai, params.modules['deeptools_plotfingerprint'] ) @@ -371,8 +373,8 @@ workflow { params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" // Create channel: [ val(meta), ip_bam, control_bam ] - ch_ip_control_bam - .map { it -> [ it[0] , it[1][0], it[1][1] ] } + ch_ip_control_bam_bai + .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } .set { ch_ip_control_bam } MACS2_CALLPEAK ( @@ -409,7 +411,7 @@ workflow { MACS2_CALLPEAK .out .peak - .map { meta, peak -> [ meta.antibody , meta.id.split('_')[0..-2].join('_'), peak ] } + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } .groupTuple() .map { antibody, groups, peaks -> @@ -441,9 +443,48 @@ workflow { // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - //ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .combine(ch_ip_saf) + .map { + it -> + fmeta = it[1] + fmeta['replicates_exist'] = it[4]['replicates_exist'] + fmeta['multiple_groups'] = it[4]['multiple_groups'] + [ fmeta, it[2], it[5] ] } + .set { ch_ip_bam } + + params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" + SUBREAD_FEATURECOUNTS ( + ch_ip_bam, + params.modules['subread_featurecounts'] + ) + ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + + // FRIP_SCORE ( + // params.modules['frip_score'] + // ) + // + // DESEQ2_FEATURECOUNTS ( + // params.modules['deseq2_featurecounts'] + // ) + } + // /* + // * Create IGV session + // */ + // IGV ( + // params.modules['igv'] + // ) + /* * Pipeline reporting */ @@ -496,7 +537,7 @@ workflow { // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) - // path ('macs/consensus/*') from ch_macs_consensus_counts_mqc.collect().ifEmpty([]) + SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) params.modules['multiqc'] @@ -516,128 +557,3 @@ workflow.onComplete { //////////////////////////////////////////////////// /* -- THE END -- */ //////////////////////////////////////////////////// - -// // Get BAM and SAF files for each ip -// ch_group_bam_counts -// .map { it -> [ it[3], [ it[0], it[1], it[2] ] ] } -// .join(ch_rm_orphan_name_bam_counts) -// .map { it -> [ it[1][0], it[1][1], it[1][2], it[2] ] } -// .groupTuple() -// .map { it -> [ it[0], it[1][0], it[2][0], it[3].flatten().sort() ] } -// .join(ch_macs_consensus_saf) -// .set { ch_group_bam_counts } -// -// /* -// * STEP 7.3: Count reads in consensus peaks with featureCounts -// */ -// process CONSENSUS_PEAKS_COUNTS { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}", mode: params.publish_dir_mode -// -// when: -// params.macs_gsize && (replicatesExist || multipleGroups) && !params.skip_consensus_peaks -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(bams), path(saf) from ch_group_bam_counts -// -// output: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path('*featureCounts.txt') into ch_macs_consensus_counts -// path '*featureCounts.txt.summary' into ch_macs_consensus_counts_mqc -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_files = bams.findAll { it.toString().endsWith('.bam') }.sort() -// pe_params = params.single_end ? '' : '-p --donotsort' -// """ -// featureCounts \\ -// -F SAF \\ -// -O \\ -// --fracOverlap 0.2 \\ -// -T $task.cpus \\ -// $pe_params \\ -// -a $saf \\ -// -o ${prefix}.featureCounts.txt \\ -// ${bam_files.join(' ')} -// """ -// } -// -// /* -// * STEP 7.4: Differential analysis with DESeq2 -// */ -// process CONSENSUS_PEAKS_DESEQ2 { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts -// path deseq2_pca_header from ch_deseq2_pca_header -// path deseq2_clustering_header from ch_deseq2_clustering_header -// -// output: -// path '*.tsv' into ch_macs_consensus_deseq_mqc -// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv -// path '*.{RData,results.txt,pdf,log}' -// path 'sizeFactors' -// path '*vs*/*.{pdf,txt}' -// path '*vs*/*.bed' -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' -// vst = params.deseq2_vst ? '--vst TRUE' : '' -// """ -// featurecounts_deseq2.r \\ -// --featurecount_file $counts \\ -// --bam_suffix '$bam_ext' \\ -// --outdir ./ \\ -// --outprefix $prefix \\ -// --outsuffix '' \\ -// --cores $task.cpus \\ -// $vst -// -// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv -// -// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv -// -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt -// """ -// } -// -// /* -// * STEP 8: Create IGV session file -// */ -// process IGV { -// publishDir "${params.outdir}/igv/${PEAK_TYPE}", mode: params.publish_dir_mode -// -// when: -// !params.skip_igv -// -// input: -// path fasta from ch_fasta -// path bigwigs from ch_bigwig_igv.collect().ifEmpty([]) -// path peaks from ch_macs_igv.collect().ifEmpty([]) -// path consensus_peaks from ch_macs_consensus_igv.collect().ifEmpty([]) -// path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) -// -// output: -// path '*.{txt,xml}' -// -// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ -// """ -// cat *.txt > igv_files.txt -// igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' -// """ -// } From 1fd168a378367d17865efc33183a4cbd93d8ee78 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 30 Jul 2020 20:05:16 +0000 Subject: [PATCH 098/538] Template update for nf-core/tools version 1.10.1 --- .github/.dockstore.yml | 5 + .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 15 +- .github/ISSUE_TEMPLATE/feature_request.md | 12 +- .github/PULL_REQUEST_TEMPLATE.md | 15 +- .github/workflows/awsfulltest.yml | 40 ++++ .github/workflows/awstest.yml | 40 ++++ .github/workflows/branch.yml | 30 ++- .github/workflows/ci.yml | 47 +++- .github/workflows/linting.yml | 13 +- .github/workflows/push_dockerhub.yml | 39 ++++ .gitignore | 1 + CHANGELOG.md | 8 +- CODE_OF_CONDUCT.md | 6 +- Dockerfile | 12 +- README.md | 42 ++-- bin/markdown_to_html.py | 43 ++-- bin/scrape_software_versions.py | 36 +-- conf/igenomes.config | 1 + conf/test.config | 2 +- conf/test_full.config | 22 ++ docs/README.md | 20 +- docs/output.md | 50 ++-- docs/usage.md | 272 +++------------------- environment.yml | 2 +- main.nf | 53 +++-- nextflow.config | 9 +- nextflow_schema.json | 259 ++++++++++++++++++++ 28 files changed, 685 insertions(+), 411 deletions(-) create mode 100644 .github/.dockstore.yml create mode 100644 .github/workflows/awsfulltest.yml create mode 100644 .github/workflows/awstest.yml create mode 100644 .github/workflows/push_dockerhub.yml create mode 100644 conf/test_full.config create mode 100644 nextflow_schema.json diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml new file mode 100644 index 000000000..030138a0c --- /dev/null +++ b/.github/.dockstore.yml @@ -0,0 +1,5 @@ +# Dockstore config version, not pipeline version +version: 1.2 +workflows: + - subclass: nfl + primaryDescriptorPath: /nextflow.config diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 484c13c31..6ab73766c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -54,4 +54,4 @@ These tests are run both with the latest available version of `Nextflow` and als ## Getting help -For further information/help, please consult the [nf-core/chipseq documentation](https://nf-co.re/nf-core/chipseq/docs) and don't hesitate to get in touch on the nf-core Slack [#chipseq](https://nfcore.slack.com/channels/chipseq) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/chipseq documentation](https://nf-co.re/chipseq/docs) and don't hesitate to get in touch on the nf-core Slack [#chipseq](https://nfcore.slack.com/channels/chipseq) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f394683ed..7781a9117 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,24 +1,27 @@ + -## Describe the bug +## Description of the bug -A clear and concise description of what the bug is. + ## Steps to reproduce Steps to reproduce the behaviour: -1. Command line: `nextflow run ...` -2. See error: _Please provide your error message_ +1. Command line: +2. See error: ## Expected behaviour -A clear and concise description of what you expected to happen. + ## System @@ -39,4 +42,4 @@ A clear and concise description of what you expected to happen. ## Additional context -Add any other context about the problem here. + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c3bbf1942..1f5a0971a 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,24 +1,26 @@ + ## Is your feature request related to a problem? Please describe -A clear and concise description of what the problem is. + -Ex. I'm always frustrated when [...] + ## Describe the solution you'd like -A clear and concise description of what you want to happen. + ## Describe alternatives you've considered -A clear and concise description of any alternative solutions or features you've considered. + ## Additional context -Add any other context about the feature request here. + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 211df04a3..e910ffbc7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,4 @@ + + ## PR checklist - [ ] This comment contains a description of changes (with reason) +- [ ] `CHANGELOG.md` is updated - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If necessary, also make a PR on the [nf-core/chipseq branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/chipseq) -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). -- [ ] Make sure your code lints (`nf-core lint .`). - [ ] Documentation in `docs` is updated -- [ ] `CHANGELOG.md` is updated -- [ ] `README.md` is updated - -**Learn more about contributing:** [CONTRIBUTING.md](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) \ No newline at end of file +- [ ] If necessary, also make a PR on the [nf-core/chipseq branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/chipseq) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml new file mode 100644 index 000000000..b6305e000 --- /dev/null +++ b/.github/workflows/awsfulltest.yml @@ -0,0 +1,40 @@ +name: nf-core AWS full size tests +# This workflow is triggered on push to the master branch. +# It runs the -profile 'test_full' on AWS batch + +on: + release: + types: [published] + +jobs: + run-awstest: + name: Run AWS full tests + if: github.repository == 'nf-core/chipseq' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: goanpeca/setup-miniconda@v1.0.2 + with: + auto-update-conda: true + python-version: 3.7 + - name: Install awscli + run: conda install -c conda-forge awscli + - name: Start AWS batch job + # TODO nf-core: You can customise AWS full pipeline tests as required + # Add full size test data (but still relatively small datasets for few samples) + # on the `test_full.config` test runs with only one set of parameters + # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + run: | + aws batch submit-job \ + --region eu-west-1 \ + --job-name nf-core-chipseq \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml new file mode 100644 index 000000000..5da17324e --- /dev/null +++ b/.github/workflows/awstest.yml @@ -0,0 +1,40 @@ +name: nf-core AWS test +# This workflow is triggered on push to the master branch. +# It runs the -profile 'test' on AWS batch + +on: + push: + branches: + - master + +jobs: + run-awstest: + name: Run AWS tests + if: github.repository == 'nf-core/chipseq' + runs-on: ubuntu-latest + steps: + - name: Setup Miniconda + uses: goanpeca/setup-miniconda@v1.0.2 + with: + auto-update-conda: true + python-version: 3.7 + - name: Install awscli + run: conda install -c conda-forge awscli + - name: Start AWS batch job + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + run: | + aws batch submit-job \ + --region eu-west-1 \ + --job-name nf-core-chipseq \ + --job-queue $AWS_JOB_QUEUE \ + --job-definition $AWS_JOB_DEFINITION \ + --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}'chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index aa94952dc..492b3ab3d 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -3,14 +3,34 @@ name: nf-core branch protection # It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` on: pull_request: - branches: - - master + branches: [master] jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - # PRs are only ok if coming from an nf-core `dev` branch or a fork `patch` branch + # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs + if: github.repository == 'nf-core/chipseq' run: | - { [[ $(git remote get-url origin) == *nf-core/chipseq ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name}} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + Hi @${{ github.event.pull_request.user.login }}, + + It looks like this pull-request is has been made against the ${{github.event.pull_request.head.repo.full_name}} `master` branch. + The `master` branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.head.repo.full_name}} `dev` branch. + + You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7062197c0..14df9f1d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,30 +1,55 @@ name: nf-core CI -# This workflow is triggered on pushes and PRs to the repository. -# It runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: [push, pull_request] +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors +on: + push: + branches: + - dev + pull_request: + release: + types: [published] jobs: test: + name: Run workflow tests + # Only run on push if this is the nf-core dev branch (merged PRs) + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} + runs-on: ubuntu-latest env: NXF_VER: ${{ matrix.nxf_ver }} NXF_ANSI_LOG: false - runs-on: ubuntu-latest strategy: matrix: # Nextflow versions: check pipeline minimum and current latest nxf_ver: ['19.10.0', ''] steps: - - uses: actions/checkout@v2 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Check if Dockerfile or Conda environment changed + uses: technote-space/get-diff-action@v1 + with: + PREFIX_FILTER: | + Dockerfile + environment.yml + + - name: Build new docker image + if: env.GIT_DIFF + run: docker build --no-cache . -t nfcore/chipseq:dev + - name: Pull docker image + if: ${{ !env.GIT_DIFF }} run: | docker pull nfcore/chipseq:dev docker tag nfcore/chipseq:dev nfcore/chipseq:dev + + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with test data + # TODO nf-core: You can customise CI pipeline run tests as required + # For example: adding multiple test runs with different parameters + # Remember that you can parallelise this by using strategy.matrix run: | - # TODO nf-core: You can customise CI pipeline run tests as required - # (eg. adding multiple test runs with different parameters) nextflow run ${GITHUB_WORKSPACE} -profile test,docker diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 1e0827a80..eb66c1449 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -33,18 +33,29 @@ jobs: nf-core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + + - name: Check out pipeline code + uses: actions/checkout@v2 + - name: Install Nextflow run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + - uses: actions/setup-python@v1 with: python-version: '3.6' architecture: 'x64' + - name: Install dependencies run: | python -m pip install --upgrade pip pip install nf-core + - name: Run nf-core lint + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} run: nf-core lint ${GITHUB_WORKSPACE} + diff --git a/.github/workflows/push_dockerhub.yml b/.github/workflows/push_dockerhub.yml new file mode 100644 index 000000000..96d7636c9 --- /dev/null +++ b/.github/workflows/push_dockerhub.yml @@ -0,0 +1,39 @@ +name: nf-core Docker push +# This builds the docker image and pushes it to DockerHub +# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) +on: + push: + branches: + - dev + release: + types: [published] + +push_dockerhub: + name: Push new Docker image to Docker Hub + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/chipseq' }} + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Build new docker image + run: docker build --no-cache . -t nfcore/chipseq:latest + + - name: Push Docker image to DockerHub (dev) + if: ${{ github.event_name == 'push' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker tag nfcore/chipseq:latest nfcore/chipseq:dev + docker push nfcore/chipseq:dev + + - name: Push Docker image to DockerHub (release) + if: ${{ github.event_name == 'release' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/chipseq:latest + docker tag nfcore/chipseq:latest nfcore/chipseq:${{ github.event.release.tag_name }} + docker push nfcore/chipseq:${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index 6354f3708..aa4bb5b37 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ results/ .DS_Store tests/ testing/ +testing* *.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bf14bf1e..bcbe42c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ # nf-core/chipseq: Changelog -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.1.1dev - [date] +## v1.3.0dev - [date] -Initial release of nf-core/chipseq, created with the [nf-core](http://nf-co.re/) template. +Initial release of nf-core/chipseq, created with the [nf-core](https://nf-co.re/) template. ### `Added` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index cf930c8ac..405fb1bfd 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct/][version] -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +[homepage]: https://contributor-covenant.org +[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ diff --git a/Dockerfile b/Dockerfile index 8bb131de1..0e2e359d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,17 @@ -FROM nfcore/base:1.9 +FROM nfcore/base:1.10.1 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" # Install the conda environment COPY environment.yml / -RUN conda env create -f /environment.yml && conda clean -a +RUN conda env create --quiet -f /environment.yml && conda clean -a # Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-chipseq-1.1.1dev/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-chipseq-1.3.0dev/bin:$PATH # Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-chipseq-1.1.1dev > nf-core-chipseq-1.1.1dev.yml +RUN conda env export --name nf-core-chipseq-1.3.0dev > nf-core-chipseq-1.3.0dev.yml + +# Instruct R processes to use these empty files instead of clashing with a local version +RUN touch .Rprofile +RUN touch .Renviron diff --git a/README.md b/README.md index b718ec207..256076543 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,9 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions) [![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](https://bioconda.github.io/) [![Docker](https://img.shields.io/docker/automated/nfcore/chipseq.svg)](https://hub.docker.com/r/nfcore/chipseq) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/chipseq) ## Introduction @@ -15,40 +16,31 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ## Quick Start -i. Install [`nextflow`](https://nf-co.re/usage/installation) +1. Install [`nextflow`](https://nf-co.re/usage/installation) -ii. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility (please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles)) +2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ -iii. Download the pipeline and test it on a minimal dataset with a single command +3. Download the pipeline and test it on a minimal dataset with a single command: -```bash -nextflow run nf-core/chipseq -profile test, -``` + ```bash + nextflow run nf-core/chipseq -profile test, + ``` -> Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. -iv. Start running your own analysis! +4. Start running your own analysis! - + -```bash -nextflow run nf-core/chipseq -profile --reads '*_R{1,2}.fastq.gz' --genome GRCh37 -``` + ```bash + nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + ``` See [usage docs](docs/usage.md) for all of the available options when running the pipeline. ## Documentation -The nf-core/chipseq pipeline comes with documentation about the pipeline, found in the `docs/` directory: - -1. [Installation](https://nf-co.re/usage/installation) -2. Pipeline configuration - * [Local installation](https://nf-co.re/usage/local_installation) - * [Adding your own system config](https://nf-co.re/usage/adding_own_config) - * [Reference genomes](https://nf-co.re/usage/reference_genomes) -3. [Running the pipeline](docs/usage.md) -4. [Output and how to interpret the results](docs/output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) +The nf-core/chipseq pipeline comes with documentation about the pipeline which you can read at [https://nf-core/chipseq/docs](https://nf-core/chipseq/docs) or find in the [`docs/` directory](docs). @@ -60,7 +52,7 @@ nf-core/chipseq was originally written by Philip Ewels. If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). -For further information or help, don't hesitate to get in touch on [Slack](https://nfcore.slack.com/channels/chipseq) (you can join with [this invite](https://nf-co.re/join/slack)). +For further information or help, don't hesitate to get in touch on the [Slack `#chipseq` channel](https://nfcore.slack.com/channels/chipseq) (you can join with [this invite](https://nf-co.re/join/slack)). ## Citation @@ -73,5 +65,5 @@ You can cite the `nf-core` publication as follows: > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). > ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py index 57cc4263f..a26d1ff5e 100755 --- a/bin/markdown_to_html.py +++ b/bin/markdown_to_html.py @@ -4,33 +4,23 @@ import markdown import os import sys +import io + def convert_markdown(in_fn): - input_md = open(in_fn, mode="r", encoding="utf-8").read() + input_md = io.open(in_fn, mode="r", encoding="utf-8").read() html = markdown.markdown( "[TOC]\n" + input_md, - extensions = [ - 'pymdownx.extra', - 'pymdownx.b64', - 'pymdownx.highlight', - 'pymdownx.emoji', - 'pymdownx.tilde', - 'toc' - ], - extension_configs = { - 'pymdownx.b64': { - 'base_path': os.path.dirname(in_fn) - }, - 'pymdownx.highlight': { - 'noclasses': True - }, - 'toc': { - 'title': 'Table of Contents' - } - } + extensions=["pymdownx.extra", "pymdownx.b64", "pymdownx.highlight", "pymdownx.emoji", "pymdownx.tilde", "toc"], + extension_configs={ + "pymdownx.b64": {"base_path": os.path.dirname(in_fn)}, + "pymdownx.highlight": {"noclasses": True}, + "toc": {"title": "Table of Contents"}, + }, ) return html + def wrap_html(contents): header = """ @@ -83,18 +73,19 @@ def wrap_html(contents): def parse_args(args=None): parser = argparse.ArgumentParser() - parser.add_argument('mdfile', type=argparse.FileType('r'), nargs='?', - help='File to convert. Defaults to stdin.') - parser.add_argument('-o', '--out', type=argparse.FileType('w'), - default=sys.stdout, - help='Output file name. Defaults to stdout.') + parser.add_argument("mdfile", type=argparse.FileType("r"), nargs="?", help="File to convert. Defaults to stdin.") + parser.add_argument( + "-o", "--out", type=argparse.FileType("w"), default=sys.stdout, help="Output file name. Defaults to stdout." + ) return parser.parse_args(args) + def main(args=None): args = parse_args(args) converted_md = convert_markdown(args.mdfile.name) html = wrap_html(converted_md) args.out.write(html) -if __name__ == '__main__': + +if __name__ == "__main__": sys.exit(main()) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index ba617e63c..f2d0a5cf2 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -5,16 +5,16 @@ # TODO nf-core: Add additional regexes for new tools in process get_software_versions regexes = { - 'nf-core/chipseq': ['v_pipeline.txt', r"(\S+)"], - 'Nextflow': ['v_nextflow.txt', r"(\S+)"], - 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], - 'MultiQC': ['v_multiqc.txt', r"multiqc, version (\S+)"], + "nf-core/chipseq": ["v_pipeline.txt", r"(\S+)"], + "Nextflow": ["v_nextflow.txt", r"(\S+)"], + "FastQC": ["v_fastqc.txt", r"FastQC v(\S+)"], + "MultiQC": ["v_multiqc.txt", r"multiqc, version (\S+)"], } results = OrderedDict() -results['nf-core/chipseq'] = 'N/A' -results['Nextflow'] = 'N/A' -results['FastQC'] = 'N/A' -results['MultiQC'] = 'N/A' +results["nf-core/chipseq"] = 'N/A' +results["Nextflow"] = 'N/A' +results["FastQC"] = 'N/A' +results["MultiQC"] = 'N/A' # Search each file using its regex for k, v in regexes.items(): @@ -30,10 +30,11 @@ # Remove software set to false in results for k in list(results): if not results[k]: - del(results[k]) + del results[k] # Dump to YAML -print (''' +print( + """ id: 'software_versions' section_name: 'nf-core/chipseq Software Versions' section_href: 'https://github.com/nf-core/chipseq' @@ -41,12 +42,13 @@ description: 'are collected at run time from the software output.' data: |
-''') -for k,v in results.items(): - print("
{}
{}
".format(k,v)) -print ("
") +""" +) +for k, v in results.items(): + print("
{}
{}
".format(k, v)) +print(" ") # Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in results.items(): - f.write("{}\t{}\n".format(k,v)) +with open("software_versions.csv", "w") as f: + for k, v in results.items(): + f.write("{}\t{}\n".format(k, v)) diff --git a/conf/igenomes.config b/conf/igenomes.config index 2de924228..caeafceb2 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -340,6 +340,7 @@ params { gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" mito_name = "chrM" + macs_gsize = "1.37e9" } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/test.config b/conf/test.config index 1cb87e03e..a0004e3ff 100644 --- a/conf/test.config +++ b/conf/test.config @@ -19,7 +19,7 @@ params { // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed single_end = false - readPaths = [ + input_paths = [ ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] ] diff --git a/conf/test_full.config b/conf/test_full.config new file mode 100644 index 000000000..deedc3a34 --- /dev/null +++ b/conf/test_full.config @@ -0,0 +1,22 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running full-size tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a full size pipeline test. Use as follows: + * nextflow run nf-core/chipseq -profile test_full, + */ + +params { + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' + + // Input data for full size test + // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) + // TODO nf-core: Give any required params for the test so that command line flags are not needed + single_end = false + readPaths = [ + ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], + ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] + ] +} diff --git a/docs/README.md b/docs/README.md index 80d36de34..84fa58441 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,12 @@ # nf-core/chipseq: Documentation -The nf-core/chipseq documentation is split into the following files: - -1. [Installation](https://nf-co.re/usage/installation) -2. Pipeline configuration - * [Local installation](https://nf-co.re/usage/local_installation) - * [Adding your own system config](https://nf-co.re/usage/adding_own_config) - * [Reference genomes](https://nf-co.re/usage/reference_genomes) -3. [Running the pipeline](usage.md) -4. [Output and how to interpret the results](output.md) -5. [Troubleshooting](https://nf-co.re/usage/troubleshooting) +The nf-core/chipseq documentation is split into the following pages: + + + +* [Usage](usage.md) + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +* [Output](output.md) + * An overview of the different results produced by the pipeline and how to interpret them. + +You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index 2816b060a..0bed8064d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,6 +2,8 @@ This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. + ## Pipeline overview @@ -9,35 +11,47 @@ This document describes the output produced by the pipeline. Most of the plots a The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - read quality control -* [MultiQC](#multiqc) - aggregate report, describing results of the whole pipeline +* [FastQC](#fastqc) - Read quality control +* [MultiQC](#multiqc) - Aggregate report describing results from the whole pipeline +* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ## FastQC -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%T/A/G/C). You get information about adapter contamination and other overrepresented sequences. +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. -For further reading and documentation see the [FastQC help](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. To see how your reads look after trimming, look at the FastQC reports in the `trim_galore` directory. +**Output files:** -**Output directory: `results/fastqc`** +* `fastqc/` + * `*_fastqc.html`: FastQC report containing quality metrics for your untrimmed raw fastq files. +* `fastqc/zips/` + * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. -* `sample_fastqc.html` - * FastQC report, containing quality metrics for your untrimmed raw fastq files -* `zips/sample_fastqc.zip` - * zip file containing the FastQC report, tab-delimited data file and plot images +> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. ## MultiQC -[MultiQC](http://multiqc.info) is a visualisation tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in within the report data directory. +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarizing all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. + +The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. + +For more information about how to use MultiQC reports, see [https://multiqc.info](https://multiqc.info). + +**Output files:** + +* `multiqc/` + * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + * `multiqc_plots/`: directory containing static images from the report in various formats. -The pipeline has special steps which allow the software versions used to be reported in the MultiQC output for future traceability. +## Pipeline information -**Output directory: `results/multiqc`** +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. -* `Project_multiqc_report.html` - * MultiQC report - a standalone HTML file that can be viewed in your web browser -* `Project_multiqc_data/` - * Directory containing parsed statistics from the different tools used in the pipeline +**Output files:** -For more information about how to use MultiQC reports, see [http://multiqc.info](http://multiqc.info) +* `pipeline_info/` + * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. + * Documentation for interpretation of results in HTML format: `results_description.html`. diff --git a/docs/usage.md b/docs/usage.md index 5433cf5e4..ba405e485 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,62 +1,15 @@ # nf-core/chipseq: Usage -## Table of contents - -* [Table of contents](#table-of-contents) -* [Introduction](#introduction) -* [Running the pipeline](#running-the-pipeline) - * [Updating the pipeline](#updating-the-pipeline) - * [Reproducibility](#reproducibility) -* [Main arguments](#main-arguments) - * [`-profile`](#-profile) - * [`--reads`](#--reads) - * [`--single_end`](#--single_end) -* [Reference genomes](#reference-genomes) - * [`--genome` (using iGenomes)](#--genome-using-igenomes) - * [`--fasta`](#--fasta) - * [`--igenomes_ignore`](#--igenomes_ignore) -* [Job resources](#job-resources) - * [Automatic resubmission](#automatic-resubmission) - * [Custom resource requests](#custom-resource-requests) -* [AWS Batch specific parameters](#aws-batch-specific-parameters) - * [`--awsqueue`](#--awsqueue) - * [`--awsregion`](#--awsregion) - * [`--awscli`](#--awscli) -* [Other command line parameters](#other-command-line-parameters) - * [`--outdir`](#--outdir) - * [`--email`](#--email) - * [`--email_on_fail`](#--email_on_fail) - * [`--max_multiqc_email_size`](#--max_multiqc_email_size) - * [`-name`](#-name) - * [`-resume`](#-resume) - * [`-c`](#-c) - * [`--custom_config_version`](#--custom_config_version) - * [`--custom_config_base`](#--custom_config_base) - * [`--max_memory`](#--max_memory) - * [`--max_time`](#--max_time) - * [`--max_cpus`](#--max_cpus) - * [`--plaintext_email`](#--plaintext_email) - * [`--monochrome_logs`](#--monochrome_logs) - * [`--multiqc_config`](#--multiqc_config) - ## Introduction -Nextflow handles job submissions on SLURM or other environments, and supervises running the jobs. Thus the Nextflow process must run until the pipeline is finished. We recommend that you put the process running in the background through `screen` / `tmux` or similar tool. Alternatively you can run nextflow within a cluster job submitted your job scheduler. - -It is recommended to limit the Nextflow Java virtual machines memory. We recommend adding the following line to your environment (typically in `~/.bashrc` or `~./bash_profile`): - -```bash -NXF_OPTS='-Xms1g -Xmx4g' -``` - - + ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/chipseq --reads '*_R{1,2}.fastq.gz' -profile docker +nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -86,7 +39,9 @@ First, go to the [nf-core/chipseq releases page](https://github.com/nf-core/chip This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. -## Main arguments +## Core Nextflow arguments + +> **NB:** These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). ### `-profile` @@ -104,11 +59,11 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](http://docker.com/) - * Pulls software from dockerhub: [`nfcore/chipseq`](http://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Docker](https://docker.com/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `singularity` - * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) - * Pulls software from DockerHub: [`nfcore/chipseq`](http://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `conda` * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker or Singularity. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) @@ -117,215 +72,50 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * A profile with a complete configuration for automated testing * Includes links to test data so needs no other parameters - - -### `--reads` - -Use this to specify the location of your input FastQ files. For example: - -```bash ---reads 'path/to/data/sample_*_{1,2}.fastq' -``` - -Please note the following requirements: - -1. The path must be enclosed in quotes -2. The path must have at least one `*` wildcard character -3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs. - -If left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz` - -### `--single_end` - -By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--reads`. For example: - -```bash ---single_end --reads '*.fastq' -``` - -It is not possible to run a mixture of single-end and paired-end files in one run. - -## Reference genomes - -The pipeline config files come bundled with paths to the illumina iGenomes reference index files. If running with docker or AWS, the configuration is set up to use the [AWS-iGenomes](https://ewels.github.io/AWS-iGenomes/) resource. - -### `--genome` (using iGenomes) +### `-resume` -There are 31 different species supported in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. +Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. -You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Common genomes that are supported are: +You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. -* Human - * `--genome GRCh37` -* Mouse - * `--genome GRCm38` -* _Drosophila_ - * `--genome BDGP6` -* _S. cerevisiae_ - * `--genome 'R64-1-1'` +### `-c` -> There are numerous others - check the config file for more. +Specify the path to a specific config file (this is a core NextFlow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. -Note that you can use the same configuration setup to save sets of reference files for your own use, even if they are not part of the iGenomes resource. See the [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for instructions on where to save such a file. +#### Custom resource requests -The syntax for this reference configuration is as follows: +Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. - +Whilst these default requirements will hopefully work for most people with most data, you may find that you want to customise the compute resources that the pipeline requests. You can do this by creating a custom config file. For example, to give the workflow process `star` 32GB of memory, you could use the following config: ```nextflow -params { - genomes { - 'GRCh37' { - fasta = '' // Used if no star index given - } - // Any number of additional genomes, key is used with --genome +process { + withName: star { + memory = 32.GB } } ``` - - -### `--fasta` - -If you prefer, you can specify the full path to your reference genome when you run the pipeline: - -```bash ---fasta '[path to Fasta reference]' -``` - -### `--igenomes_ignore` - -Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`. - -## Job resources - -### Automatic resubmission - -Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. - -### Custom resource requests - -Wherever process-specific requirements are set in the pipeline, the default value can be changed by creating a custom config file. See the files hosted at [`nf-core/configs`](https://github.com/nf-core/configs/tree/master/conf) for examples. +See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition below). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. -If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack). - -## AWS Batch specific parameters - -Running the pipeline on AWS Batch requires a couple of specific parameters to be set according to your AWS Batch configuration. Please use [`-profile awsbatch`](https://github.com/nf-core/configs/blob/master/conf/awsbatch.config) and then specify all of the following parameters. - -### `--awsqueue` - -The JobQueue that you intend to use on AWS Batch. +If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -### `--awsregion` +### Running in the background -The AWS region in which to run your job. Default is set to `eu-west-1` but can be adjusted to your needs. +Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. -### `--awscli` +The Nextflow `-bg` flag launches Nextflow in the background, detached from your terminal so that the workflow does not stop if you log out of your session. The logs are saved to a file. -The [AWS CLI](https://www.nextflow.io/docs/latest/awscloud.html#aws-cli-installation) path in your custom AMI. Default: `/home/ec2-user/miniconda/bin/aws`. +Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. +Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a S3 storage bucket of your choice - you'll get an error message notifying you if you didn't. +#### Nextflow memory requirements -## Other command line parameters - - - -### `--outdir` - -The output directory where the results will be saved. - -### `--email` - -Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run. - -### `--email_on_fail` - -This works exactly as with `--email`, except emails are only sent if the workflow is not successful. - -### `--max_multiqc_email_size` - -Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB). - -### `-name` - -Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. - -This is used in the MultiQC report (if not default) and in the summary HTML / e-mail (always). - -**NB:** Single hyphen (core Nextflow option) - -### `-resume` - -Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. - -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. - -**NB:** Single hyphen (core Nextflow option) - -### `-c` - -Specify the path to a specific config file (this is a core NextFlow command). - -**NB:** Single hyphen (core Nextflow option) - -Note - you can use this to override pipeline defaults. - -### `--custom_config_version` - -Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`. - -```bash -## Download and use config file with following git commid id ---custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96 -``` - -### `--custom_config_base` - -If you're running offline, nextflow will not be able to fetch the institutional config files -from the internet. If you don't need them, then this is not a problem. If you do need them, -you should download the files from the repo and tell nextflow where to find them with the -`custom_config_base` option. For example: +In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. +We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): ```bash -## Download and unzip the config files -cd /path/to/my/configs -wget https://github.com/nf-core/configs/archive/master.zip -unzip master.zip - -## Run the pipeline -cd /path/to/my/data -nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/ +NXF_OPTS='-Xms1g -Xmx4g' ``` - -> Note that the nf-core/tools helper package has a `download` command to download all required pipeline -> files + singularity containers + institutional configs in one go for you, to make this process easier. - -### `--max_memory` - -Use to set a top-limit for the default memory requirement for each process. -Should be a string in the format integer-unit. eg. `--max_memory '8.GB'` - -### `--max_time` - -Use to set a top-limit for the default time requirement for each process. -Should be a string in the format integer-unit. eg. `--max_time '2.h'` - -### `--max_cpus` - -Use to set a top-limit for the default CPU requirement for each process. -Should be a string in the format integer-unit. eg. `--max_cpus 1` - -### `--plaintext_email` - -Set to receive plain-text e-mails instead of HTML formatted. - -### `--monochrome_logs` - -Set to disable colourful command line output and live life in monochrome. - -### `--multiqc_config` - -Specify a path to a custom MultiQC configuration file. diff --git a/environment.yml b/environment.yml index a32b3b167..88677053e 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-chipseq-1.1.1dev +name: nf-core-chipseq-1.3.0dev channels: - conda-forge - bioconda diff --git a/main.nf b/main.nf index ac5a1cfba..15a4dfcce 100644 --- a/main.nf +++ b/main.nf @@ -18,12 +18,12 @@ def helpMessage() { The typical command for running the pipeline is as follows: - nextflow run nf-core/chipseq --reads '*_R{1,2}.fastq.gz' -profile docker + nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker Mandatory arguments: - --reads [file] Path to input data (must be surrounded with quotes) - -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, test, awsbatch, and more + --input [file] Path to input data (must be surrounded with quotes) + -profile [str] Configuration profile to use. Can use multiple (comma separated) + Available: conda, docker, singularity, test, awsbatch, and more Options: --genome [str] Name of iGenomes reference @@ -34,9 +34,10 @@ def helpMessage() { Other options: --outdir [file] The output directory where the results will be saved + --publish_dir_mode [str] Mode for publishing results in the output directory. Available: symlink, rellink, link, copy, copyNoFollow, move (Default: copy) --email [email] Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits --email_on_fail [email] Same as --email, except only send mail if the workflow is not successful - --max_multiqc_email_size [str] Theshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) + --max_multiqc_email_size [str] Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic AWSBatch options: @@ -73,12 +74,13 @@ params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } // Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name +// this has the bonus effect of catching both -name and --name custom_runName = params.name if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { custom_runName = workflow.runName } +// Check AWS batch settings if (workflow.profile.contains('awsbatch')) { // AWSBatch sanity checking if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" @@ -93,28 +95,29 @@ if (workflow.profile.contains('awsbatch')) { ch_multiqc_config = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() ch_output_docs = file("$baseDir/docs/output.md", checkIfExists: true) +ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) /* * Create a channel for input read files */ -if (params.readPaths) { +if (params.input_paths) { if (params.single_end) { Channel - .from(params.readPaths) + .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } .into { ch_read_files_fastqc; ch_read_files_trimming } } else { Channel - .from(params.readPaths) + .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.readPaths was empty - no input files supplied" } + .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } .into { ch_read_files_fastqc; ch_read_files_trimming } } } else { Channel - .fromFilePairs(params.reads, size: params.single_end ? 1 : 2) - .ifEmpty { exit 1, "Cannot find any reads matching: ${params.reads}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } + .fromFilePairs(params.input, size: params.single_end ? 1 : 2) + .ifEmpty { exit 1, "Cannot find any reads matching: ${params.input}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } .into { ch_read_files_fastqc; ch_read_files_trimming } } @@ -124,7 +127,7 @@ def summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = custom_runName ?: workflow.runName // TODO nf-core: Report custom parameters here -summary['Reads'] = params.reads +summary['Reads'] = params.input summary['Fasta Ref'] = params.fasta summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" @@ -140,9 +143,10 @@ if (workflow.profile.contains('awsbatch')) { summary['AWS CLI'] = params.awscli } summary['Config Profile'] = workflow.profile -if (params.config_profile_description) summary['Config Description'] = params.config_profile_description -if (params.config_profile_contact) summary['Config Contact'] = params.config_profile_contact -if (params.config_profile_url) summary['Config URL'] = params.config_profile_url +if (params.config_profile_description) summary['Config Profile Description'] = params.config_profile_description +if (params.config_profile_contact) summary['Config Profile Contact'] = params.config_profile_contact +if (params.config_profile_url) summary['Config Profile URL'] = params.config_profile_url +summary['Config Files'] = workflow.configFiles.join(', ') if (params.email || params.email_on_fail) { summary['E-mail Address'] = params.email summary['E-mail on failure'] = params.email_on_fail @@ -174,7 +178,7 @@ Channel.from(summary.collect{ [it.key, it.value] }) * Parse software version numbers */ process get_software_versions { - publishDir "${params.outdir}/pipeline_info", mode: 'copy', + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, saveAs: { filename -> if (filename.indexOf(".csv") > 0) filename else null @@ -201,7 +205,7 @@ process get_software_versions { process fastqc { tag "$name" label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: 'copy', + publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, saveAs: { filename -> filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" } @@ -222,7 +226,7 @@ process fastqc { * STEP 2 - MultiQC */ process multiqc { - publishDir "${params.outdir}/MultiQC", mode: 'copy' + publishDir "${params.outdir}/MultiQC", mode: params.publish_dir_mode input: file (multiqc_config) from ch_multiqc_config @@ -251,10 +255,11 @@ process multiqc { * STEP 3 - Output Description HTML */ process output_documentation { - publishDir "${params.outdir}/pipeline_info", mode: 'copy' + publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode input: file output_docs from ch_output_docs + file images from ch_output_docs_images output: file "results_description.html" @@ -345,7 +350,11 @@ workflow.onComplete { log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (sendmail)" } catch (all) { // Catch failures and try with plaintext - [ 'mail', '-s', subject, email_address ].execute() << email_txt + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + if ( mqc_report.size() <= params.max_multiqc_email_size.toBytes() ) { + mail_cmd += [ '-A', mqc_report ] + } + mail_cmd.execute() << email_html log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (mail)" } } diff --git a/nextflow.config b/nextflow.config index 1eadc7d5f..a547df3fc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,9 +11,10 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags genome = false - reads = "data/*{1,2}.fastq.gz" + input = "data/*{1,2}.fastq.gz" single_end = false outdir = './results' + publish_dir_mode = 'copy' // Boilerplate options name = false @@ -78,9 +79,11 @@ if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' } -// Export this variable to prevent local Python libraries from conflicting with those in the container +// 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 @@ -110,7 +113,7 @@ manifest { description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = '1.1.1dev' + version = '1.3.0dev' } // Function to ensure that resource requirements don't go beyond diff --git a/nextflow_schema.json b/nextflow_schema.json new file mode 100644 index 000000000..37e0fdf2e --- /dev/null +++ b/nextflow_schema.json @@ -0,0 +1,259 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/chipseq/master/nextflow_schema.json", + "title": "nf-core/chipseq pipeline parameters", + "description": "ChIP-seq peak-calling and differential analysis pipeline.", + "type": "object", + "definitions": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": [ + "input" + ], + "properties": { + "input": { + "type": "string", + "fa_icon": "fas fa-dna", + "description": "Input FastQ files.", + "help_text": "Use this to specify the location of your input FastQ files. For example:\n\n```bash\n--input 'path/to/data/sample_*_{1,2}.fastq'\n```\n\nPlease note the following requirements:\n\n1. The path must be enclosed in quotes\n2. The path must have at least one `*` wildcard character\n3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs.\n\nIf left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz`" + }, + "single_end": { + "type": "boolean", + "description": "Specifies that the input is single-end reads.", + "fa_icon": "fas fa-align-center", + "help_text": "By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--input`. For example:\n\n```bash\n--single_end --input '*.fastq'\n```\n\nIt is not possible to run a mixture of single-end and paired-end files in one run." + }, + "outdir": { + "type": "string", + "description": "The output directory where the results will be saved.", + "default": "./results", + "fa_icon": "fas fa-folder-open" + }, + "email": { + "type": "string", + "description": "Email address for completion summary.", + "fa_icon": "fas fa-envelope", + "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + } + } + }, + "reference_genome_options": { + "title": "Reference genome options", + "type": "object", + "fa_icon": "fas fa-dna", + "description": "Options for the reference genome indices used to align reads.", + "properties": { + "genome": { + "type": "string", + "description": "Name of iGenomes reference.", + "fa_icon": "fas fa-book", + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`.\n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." + }, + "fasta": { + "type": "string", + "fa_icon": "fas fa-font", + "description": "Path to FASTA genome file.", + "help_text": "If you have no genome reference available, the pipeline can build one using a FASTA file. This requires additional time and resources, so it's better to use a pre-build index if possible." + }, + "igenomes_base": { + "type": "string", + "description": "Directory / URL base for iGenomes references.", + "default": "s3://ngi-igenomes/igenomes/", + "fa_icon": "fas fa-cloud-download-alt", + "hidden": true + }, + "igenomes_ignore": { + "type": "boolean", + "description": "Do not load the iGenomes reference config.", + "fa_icon": "fas fa-ban", + "hidden": true, + "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "hidden": true, + "fa_icon": "fas fa-question-circle" + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "hidden": true, + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "mov" + ] + }, + "name": { + "type": "string", + "description": "Workflow name.", + "fa_icon": "fas fa-fingerprint", + "hidden": true, + "help_text": "A custom name for the pipeline run. Unlike the core nextflow `-name` option with one hyphen this parameter can be reused multiple times, for example if using `-resume`. Passed through to steps such as MultiQC and used for things like report filenames and titles." + }, + "email_on_fail": { + "type": "string", + "description": "Email address for completion summary, only when pipeline fails.", + "fa_icon": "fas fa-exclamation-triangle", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", + "hidden": true, + "help_text": "This works exactly as with `--email`, except emails are only sent if the workflow is not successful." + }, + "plaintext_email": { + "type": "boolean", + "description": "Send plain-text email instead of HTML.", + "fa_icon": "fas fa-remove-format", + "hidden": true, + "help_text": "Set to receive plain-text e-mails instead of HTML formatted." + }, + "max_multiqc_email_size": { + "type": "string", + "description": "File size limit when attaching MultiQC reports to summary emails.", + "default": "25.MB", + "fa_icon": "fas fa-file-upload", + "hidden": true, + "help_text": "If file generated by pipeline exceeds the threshold, it will not be attached." + }, + "monochrome_logs": { + "type": "boolean", + "description": "Do not use coloured log outputs.", + "fa_icon": "fas fa-palette", + "hidden": true, + "help_text": "Set to disable colourful command line output and live life in monochrome." + }, + "multiqc_config": { + "type": "string", + "description": "Custom config file to supply to MultiQC.", + "fa_icon": "fas fa-cog", + "hidden": true + }, + "tracedir": { + "type": "string", + "description": "Directory to keep pipeline Nextflow logs and reports.", + "default": "${params.outdir}/pipeline_info", + "fa_icon": "fas fa-cogs", + "hidden": true + } + } + }, + "max_job_request_options": { + "title": "Max job request options", + "type": "object", + "fa_icon": "fab fa-acquisitions-incorporated", + "description": "Set the top limit for requested resources for any single job.", + "help_text": "If you are running on a smaller system, a pipeline step requesting more resources than are available may cause the Nextflow to stop the run with an error. These options allow you to cap the maximum resources requested by any single job so that the pipeline will run on your system.\n\nNote that you can not _increase_ the resources requested by any job using these options. For that you will need your own configuration file. See [the nf-core website](https://nf-co.re/usage/configuration) for details.", + "properties": { + "max_cpus": { + "type": "integer", + "description": "Maximum number of CPUs that can be requested for any single job.", + "default": 16, + "fa_icon": "fas fa-microchip", + "hidden": true, + "help_text": "Use to set an upper-limit for the CPU requirement for each process. Should be an integer e.g. `--max_cpus 1`" + }, + "max_memory": { + "type": "string", + "description": "Maximum amount of memory that can be requested for any single job.", + "default": "128.GB", + "fa_icon": "fas fa-memory", + "hidden": true, + "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" + }, + "max_time": { + "type": "string", + "description": "Maximum amount of time that can be requested for any single job.", + "default": "240.h", + "fa_icon": "far fa-clock", + "hidden": true, + "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" + } + } + }, + "institutional_config_options": { + "title": "Institutional config options", + "type": "object", + "fa_icon": "fas fa-university", + "description": "Parameters used to describe centralised config profiles. These should not be edited.", + "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", + "properties": { + "custom_config_version": { + "type": "string", + "description": "Git commit id for Institutional configs.", + "default": "master", + "hidden": true, + "fa_icon": "fas fa-users-cog", + "help_text": "Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`.\n\n```bash\n## Download and use config file with following git commit id\n--custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96\n```" + }, + "custom_config_base": { + "type": "string", + "description": "Base directory for Institutional configs.", + "default": "https://raw.githubusercontent.com/nf-core/configs/master", + "hidden": true, + "help_text": "If you're running offline, nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell nextflow where to find them with the `custom_config_base` option. For example:\n\n```bash\n## Download and unzip the config files\ncd /path/to/my/configs\nwget https://github.com/nf-core/configs/archive/master.zip\nunzip master.zip\n\n## Run the pipeline\ncd /path/to/my/data\nnextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/\n```\n\n> Note that the nf-core/tools helper package has a `download` command to download all required pipeline files + singularity containers + institutional configs in one go for you, to make this process easier.", + "fa_icon": "fas fa-users-cog" + }, + "hostnames": { + "type": "string", + "description": "Institutional configs hostname.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_description": { + "type": "string", + "description": "Institutional config description.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_contact": { + "type": "string", + "description": "Institutional config contact information.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, + "config_profile_url": { + "type": "string", + "description": "Institutional config URL link.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/input_output_options" + }, + { + "$ref": "#/definitions/reference_genome_options" + }, + { + "$ref": "#/definitions/generic_options" + }, + { + "$ref": "#/definitions/max_job_request_options" + }, + { + "$ref": "#/definitions/institutional_config_options" + } + ] +} From b13fda88b1a05027cde5696cfbf7a115ed6ec830 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 21:57:40 +0100 Subject: [PATCH 099/538] Dummy commit --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index 4497bf105..75f59d89d 100755 --- a/main.nf +++ b/main.nf @@ -557,3 +557,4 @@ workflow.onComplete { //////////////////////////////////////////////////// /* -- THE END -- */ //////////////////////////////////////////////////// + From 85109084e1602ce78e0a43216ab0f8776b55d5e6 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Thu, 30 Jul 2020 22:13:03 +0100 Subject: [PATCH 100/538] Fix markdownlint --- docs/README.md | 4 ++-- docs/usage.md | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 84fa58441..2a650655f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,8 +5,8 @@ The nf-core/chipseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/usage.md b/docs/usage.md index 51efd810b..381ed10d8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -139,11 +139,11 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Docker](https://docker.com/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `conda` * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker or Singularity. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) From 8918c1d7f5feb1b2fe60c0bf63f22826d770fa82 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 09:21:57 +0100 Subject: [PATCH 101/538] Update schema --- main.nf | 7 +-- nextflow_schema.json | 145 ++++++++++++++++--------------------------- 2 files changed, 56 insertions(+), 96 deletions(-) diff --git a/main.nf b/main.nf index 75f59d89d..abad061f5 100755 --- a/main.nf +++ b/main.nf @@ -40,7 +40,7 @@ params.gtf = params.genome ? params.genomes[ params.genome ].gtf ?: false : fals params.gene_bed = params.genome ? params.genomes[ params.genome ].bed12 ?: false : false params.macs_gsize = params.genome ? params.genomes[ params.genome ].macs_gsize ?: false : false params.blacklist = params.genome ? params.genomes[ params.genome ].blacklist ?: false : false -params.anno_readme = params.genome ? params.genomes[ params.genome ].readme ?: false : false +anno_readme = params.genome ? params.genomes[ params.genome ].readme ?: false : false //////////////////////////////////////////////////// /* -- VALIDATE INPUTS -- */ @@ -61,9 +61,9 @@ if (params.fasta) { } // Save AWS IGenomes file containing annotation version -if (params.anno_readme && file(params.anno_readme).exists()) { +if (anno_readme && file(anno_readme).exists()) { file("${params.outdir}/genome/").mkdirs() - file(params.anno_readme).copyTo("${params.outdir}/genome/") + file(anno_readme).copyTo("${params.outdir}/genome/") } // If --gtf is supplied along with --genome @@ -557,4 +557,3 @@ workflow.onComplete { //////////////////////////////////////////////////// /* -- THE END -- */ //////////////////////////////////////////////////// - diff --git a/nextflow_schema.json b/nextflow_schema.json index 5b6cb78fb..fb2fa22c1 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -8,6 +8,11 @@ "input_output_options": { "title": "Input/output options", "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": [ + "input" + ], "properties": { "input": { "type": "string", @@ -19,8 +24,7 @@ "type": "integer", "default": 0, "description": "Estimated fragment size used to extend single-end reads.", - "fa_icon": "fas fa-chart-area", - "help_text": "" + "fa_icon": "fas fa-chart-area" }, "seq_center": { "type": "string", @@ -31,35 +35,32 @@ "type": "string", "description": "Path to the output directory where the results will be saved.", "default": "./results", - "fa_icon": "fas fa-folder-open", - "help_text": "" + "fa_icon": "fas fa-folder-open" }, "email": { "type": "string", "description": "Email address for completion summary.", "fa_icon": "fas fa-envelope", - "help_text": "An email address to send a summary email to when the pipeline is completed.", + "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" } - }, - "required": [ - "input" - ], - "fa_icon": "fas fa-terminal" + } }, "reference_genome_options": { "title": "Reference genome options", "type": "object", + "fa_icon": "fas fa-dna", + "description": "Options for the reference genome indices used to align reads.", "properties": { "genome": { "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`." + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." }, "fasta": { "type": "string", - "description": "Path to Fasta reference file.", + "description": "Path to FASTA genome file.", "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, @@ -72,14 +73,12 @@ "bwa_index": { "type": "string", "description": "Full path to directory containing BWA index including base name. i.e. `/path/to/index/genome.fa`.", - "fa_icon": "fas fa-bezier-curve", - "help_text": "" + "fa_icon": "fas fa-bezier-curve" }, "gene_bed": { "type": "string", "description": "Path to BED file containing gene intervals. This will be created from the GTF file if not specified.", - "fa_icon": "fas fa-procedures", - "help_text": "" + "fa_icon": "fas fa-procedures" }, "macs_gsize": { "type": "string", @@ -95,7 +94,6 @@ }, "save_reference": { "type": "boolean", - "default": false, "description": "If generated by the pipeline save the BWA index in the results directory.", "help_text": "If the BWA index is generated by the pipeline use this parameter to save it to your results folder. These can then be used for future pipeline runs, reducing processing times.", "fa_icon": "fas fa-save" @@ -105,37 +103,33 @@ "description": "Directory / URL base for iGenomes references.", "default": "s3://ngi-igenomes/igenomes/", "fa_icon": "fas fa-cloud-download-alt", - "hidden": true, - "help_text": "" + "hidden": true }, "igenomes_ignore": { "type": "boolean", "description": "Do not load the iGenomes reference config.", "fa_icon": "fas fa-ban", "hidden": true, - "default": false, "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." } - }, - "fa_icon": "fas fa-dna" + } }, "adapter_trimming_options": { "title": "Adapter trimming options", "type": "object", + "fa_icon": "fas fa-cut", "properties": { "clip_r1": { "type": "integer", "default": 0, "description": "Instructs Trim Galore to remove bp from the 5' end of read 1 (or single-end reads).", - "fa_icon": "fas fa-cut", - "help_text": "" + "fa_icon": "fas fa-cut" }, "clip_r2": { "type": "integer", "default": 0, "description": "Instructs Trim Galore to remove bp from the 5' end of read 2 (paired-end reads only).", - "fa_icon": "fas fa-cut", - "help_text": "" + "fa_icon": "fas fa-cut" }, "three_prime_clip_r1": { "type": "integer", @@ -158,34 +152,30 @@ }, "skip_trimming": { "type": "boolean", - "default": false, "description": "Skip the adapter trimming step.", "help_text": "Use this if your input FastQ files have already been trimmed outside of the workflow or if you're very confident that there is no adapter contamination in your data.", "fa_icon": "fas fa-fast-forward" }, "save_trimmed": { "type": "boolean", - "default": false, "description": "Save the trimmed FastQ files in the results directory.", "help_text": "By default, trimmed FastQ files will not be saved to the results directory. Specify this flag (or set to true in your config file) to copy these files to the results directory when complete.", "fa_icon": "fas fa-save" } - }, - "fa_icon": "fas fa-cut" + } }, "alignment_options": { "title": "Alignment options", "type": "object", + "fa_icon": "fas fa-map-signs", "properties": { "keep_dups": { "type": "boolean", - "default": false, "description": "Duplicate reads are not filtered from alignments.", "fa_icon": "fas fa-cart-arrow-down" }, "keep_multi_map": { "type": "boolean", - "default": false, "description": "Reads mapping to multiple locations are not filtered from alignments.", "fa_icon": "fas fa-cart-arrow-down" }, @@ -196,7 +186,6 @@ }, "save_align_intermeds": { "type": "boolean", - "default": false, "description": "Save the intermediate BAM files from the alignment step.", "help_text": "By default, intermediate BAM files will not be saved. The final BAM files created after the appropriate filtering step are always saved to limit storage usage. Set this parameter to also save other intermediate BAM files.", "fa_icon": "fas fa-save" @@ -206,27 +195,24 @@ "default": "$baseDir/assets/bamtools_filter_pe.json", "hidden": true, "description": "BAMTools JSON file with custom filters for paired-end data.", - "fa_icon": "fas fa-cog", - "help_text": "" + "fa_icon": "fas fa-cog" }, "bamtools_filter_se_config": { "type": "string", "default": "$baseDir/assets/bamtools_filter_se.json", "hidden": true, "description": "BAMTools JSON file with custom filters for single-end data.", - "fa_icon": "fas fa-cog", - "help_text": "" + "fa_icon": "fas fa-cog" } - }, - "fa_icon": "fas fa-map-signs" + } }, "peak_calling_options": { "title": "Peak calling options", "type": "object", + "fa_icon": "fas fa-chart-area", "properties": { "narrow_peak": { "type": "boolean", - "default": false, "description": "Run MACS2 in narrowPeak mode.", "help_text": "MACS2 is run by default with the [`--broad`](https://github.com/taoliu/MACS#--broad) flag. Specify this flag to call peaks in narrowPeak mode.", "fa_icon": "fas fa-arrows-alt-h" @@ -256,16 +242,13 @@ }, "save_macs_pileup": { "type": "boolean", - "default": false, "description": "Instruct MACS2 to create bedGraph files normalised to signal per million reads.", - "fa_icon": "fas fa-save", - "help_text": "" + "fa_icon": "fas fa-save" }, "skip_peak_qc": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip MACS2 peak QC plot generation.", - "default": false + "description": "Skip MACS2 peak QC plot generation." }, "skip_peak_annotation": { "type": "boolean", @@ -275,101 +258,89 @@ }, "skip_consensus_peaks": { "type": "boolean", - "default": false, "description": "Skip consensus peak generation, annotation and counting.", - "fa_icon": "fas fa-fast-forward", - "help_text": "" + "fa_icon": "fas fa-fast-forward" } - }, - "fa_icon": "fas fa-chart-area" + } }, "differential_analysis_options": { "title": "Differential analysis options", "type": "object", + "fa_icon": "fas fa-not-equal", "properties": { "deseq2_vst": { "type": "boolean", - "default": false, "description": "Use vst transformation instead of rlog with DESeq2.", "help_text": "See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization).", "fa_icon": "fas fa-dolly" }, "skip_diff_analysis": { "type": "boolean", - "default": false, "description": "Skip differential accessibility analysis.", - "fa_icon": "fas fa-fast-forward", - "help_text": "" + "fa_icon": "fas fa-fast-forward" } - }, - "fa_icon": "fas fa-not-equal" + } }, "process_skipping_options": { "title": "Process skipping options", "type": "object", + "fa_icon": "fas fa-fast-forward", "properties": { "skip_fastqc": { "type": "boolean", - "default": false, "description": "Skip FastQC.", "fa_icon": "fas fa-fast-forward" }, "skip_picard_metrics": { "type": "boolean", - "default": false, "description": "Skip Picard CollectMultipleMetrics.", "fa_icon": "fas fa-fast-forward" }, "skip_preseq": { "type": "boolean", - "default": false, "description": "Skip Preseq.", "fa_icon": "fas fa-fast-forward" }, "skip_plot_profile": { "type": "boolean", - "default": false, "description": "Skip deepTools plotProfile.", "fa_icon": "fas fa-fast-forward" }, "skip_plot_fingerprint": { "type": "boolean", - "default": false, "description": "Skip deepTools plotFingerprint.", "fa_icon": "fas fa-fast-forward" }, "skip_spp": { "type": "boolean", - "default": false, "description": "Skip Phantompeakqualtools.", "fa_icon": "fas fa-fast-forward" }, "skip_igv": { "type": "boolean", - "default": false, "description": "Skip IGV.", "fa_icon": "fas fa-fast-forward" }, "skip_multiqc": { "type": "boolean", - "default": false, "description": "Skip MultiQC.", "fa_icon": "fas fa-fast-forward" } - }, - "fa_icon": "fas fa-fast-forward" + } }, "institutional_config_options": { "title": "Institutional config options", "type": "object", + "fa_icon": "fas fa-university", + "description": "Parameters used to describe centralised config profiles. These should not be edited.", + "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", "properties": { "custom_config_version": { "type": "string", "description": "Git commit id for Institutional configs.", "default": "master", "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "" + "fa_icon": "fas fa-users-cog" }, "custom_config_base": { "type": "string", @@ -383,40 +354,38 @@ "type": "string", "description": "Institutional configs hostname.", "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "" + "fa_icon": "fas fa-users-cog" }, "config_profile_description": { "type": "string", "description": "Institutional config description.", "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "" + "fa_icon": "fas fa-users-cog" }, "config_profile_contact": { "type": "string", "description": "Institutional config contact information.", "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "" + "fa_icon": "fas fa-users-cog" }, "config_profile_url": { "type": "string", "description": "Institutional config URL link.", "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "" + "fa_icon": "fas fa-users-cog" } - }, - "fa_icon": "fas fa-university" + } }, "max_job_request_options": { "title": "Max job request options", "type": "object", + "fa_icon": "fab fa-acquisitions-incorporated", + "description": "Set the top limit for requested resources for any single job.", + "help_text": "If you are running on a smaller system, a pipeline step requesting more resources than are available may cause the Nextflow to stop the run with an error. These options allow you to cap the maximum resources requested by any single job so that the pipeline will run on your system.\n\nNote that you can not _increase_ the resources requested by any job using these options. For that you will need your own configuration file. See [the nf-core website](https://nf-co.re/usage/configuration) for details.", "properties": { "max_cpus": { "type": "integer", - "description": "Maximum number of CPUs that can be requested for any single job.", + "description": "Maximum number of CPUs that can be requested for any single job.", "default": 16, "fa_icon": "fas fa-microchip", "hidden": true, @@ -438,18 +407,19 @@ "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" } - }, - "fa_icon": "fab fa-acquisitions-incorporated" + } }, "generic_options": { "title": "Generic options", "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", "properties": { "help": { "type": "boolean", "description": "Display help text.", "fa_icon": "fas fa-question-circle", - "default": false, "hidden": true }, "fingerprint_bins": { @@ -494,8 +464,6 @@ "type": "boolean", "description": "Send plain-text email instead of HTML.", "fa_icon": "fas fa-remove-format", - "default": false, - "help_text": "", "hidden": true }, "max_multiqc_email_size": { @@ -503,22 +471,18 @@ "description": "File size limit when attaching MultiQC reports to summary emails.", "default": "25.MB", "fa_icon": "fas fa-file-upload", - "help_text": "", "hidden": true }, "monochrome_logs": { "type": "boolean", "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", - "default": false, - "help_text": "", "hidden": true }, "multiqc_config": { "type": "string", "description": "Custom config file to supply to MultiQC.", "fa_icon": "fas fa-cog", - "help_text": "", "hidden": true }, "tracedir": { @@ -526,18 +490,15 @@ "description": "Directory to keep pipeline Nextflow logs and reports.", "default": "${params.outdir}/pipeline_info", "fa_icon": "fas fa-cogs", - "help_text": "", "hidden": true }, "clusterOptions": { "type": "string", "description": "Arguments passed to Nextflow clusterOptions.", "fa_icon": "fas fa-network-wired", - "help_text": "", "hidden": true } - }, - "fa_icon": "fas fa-file-import" + } } }, "allOf": [ From 2fc644458261373ca5538c84754dd47670cf9f53 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 09:52:01 +0100 Subject: [PATCH 102/538] Add missing params --- nextflow_schema.json | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index fb2fa22c1..7f0508616 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -22,7 +22,6 @@ }, "fragment_size": { "type": "integer", - "default": 0, "description": "Estimated fragment size used to extend single-end reads.", "fa_icon": "fas fa-chart-area" }, @@ -50,7 +49,7 @@ "title": "Reference genome options", "type": "object", "fa_icon": "fas fa-dna", - "description": "Options for the reference genome indices used to align reads.", + "description": "Reference genome related files and options required for the workflow.", "properties": { "genome": { "type": "string", @@ -121,31 +120,26 @@ "properties": { "clip_r1": { "type": "integer", - "default": 0, "description": "Instructs Trim Galore to remove bp from the 5' end of read 1 (or single-end reads).", "fa_icon": "fas fa-cut" }, "clip_r2": { "type": "integer", - "default": 0, "description": "Instructs Trim Galore to remove bp from the 5' end of read 2 (paired-end reads only).", "fa_icon": "fas fa-cut" }, "three_prime_clip_r1": { "type": "integer", - "default": 0, "description": "Instructs Trim Galore to remove bp from the 3' end of read 1 AFTER adapter/quality trimming has been performed.", "fa_icon": "fas fa-cut" }, "three_prime_clip_r2": { "type": "integer", - "default": 0, "description": "Instructs Trim Galore to remove bp from the 3' end of read 2 AFTER adapter/quality trimming has been performed.", "fa_icon": "fas fa-cut" }, "trim_nextseq": { "type": "integer", - "default": 0, "description": "Instructs Trim Galore to apply the --nextseq=X option, to trim based on quality after removing poly-G tails.", "help_text": "This enables the option Cutadapt `--nextseq-trim=3'CUTOFF` option via Trim Galore, which will set a quality cutoff (that is normally given with -q instead), but qualities of G bases are ignored. This trimming is in common for the NextSeq- and NovaSeq-platforms, where basecalls without any signal are called as high-quality G bases.", "fa_icon": "fas fa-cut" @@ -162,7 +156,8 @@ "help_text": "By default, trimmed FastQ files will not be saved to the results directory. Specify this flag (or set to true in your config file) to copy these files to the results directory when complete.", "fa_icon": "fas fa-save" } - } + }, + "description": "Options to adjust adapter trimming criteria." }, "alignment_options": { "title": "Alignment options", @@ -204,7 +199,8 @@ "description": "BAMTools JSON file with custom filters for single-end data.", "fa_icon": "fas fa-cog" } - } + }, + "description": "Options to adjust parameters and filtering criteria for read alignments." }, "peak_calling_options": { "title": "Peak calling options", @@ -253,15 +249,15 @@ "skip_peak_annotation": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip annotation of MACS2 and consensus peaks with HOMER.", - "default": false + "description": "Skip annotation of MACS2 and consensus peaks with HOMER." }, "skip_consensus_peaks": { "type": "boolean", "description": "Skip consensus peak generation, annotation and counting.", "fa_icon": "fas fa-fast-forward" } - } + }, + "description": "Options to adjust peak calling criteria." }, "differential_analysis_options": { "title": "Differential analysis options", @@ -279,7 +275,8 @@ "description": "Skip differential accessibility analysis.", "fa_icon": "fas fa-fast-forward" } - } + }, + "description": "Options to adjust differential analysis criteria." }, "process_skipping_options": { "title": "Process skipping options", @@ -326,7 +323,8 @@ "description": "Skip MultiQC.", "fa_icon": "fas fa-fast-forward" } - } + }, + "description": "Options to skip various steps within the workflow." }, "institutional_config_options": { "title": "Institutional config options", @@ -497,6 +495,17 @@ "description": "Arguments passed to Nextflow clusterOptions.", "fa_icon": "fas fa-network-wired", "hidden": true + }, + "conda": { + "type": "boolean", + "description": "Run this workflow with Conda.", + "hidden": true + }, + "modules": { + "type": "string", + "default": "[samplesheet_check:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], fastqc:[args:'--quiet', args2:'', publish_dir:'fastqc', publish_results:'', publish_by_id:false, suffix:''], trimgalore:[args:'--fastqc', args2:'', publish_dir:'trimgalore', publish_results:'', publish_by_id:false, suffix:''], bwa_index:[args:'-a bwtsw', args2:'', publish_dir:'genome/bwa_index', publish_results:'', publish_by_id:false, suffix:''], gtf2bed:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], make_genome_filter:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], get_chrom_sizes:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], bwa_mem:[args:'-M', args2:'-h -F 0x0100 -O BAM', publish_dir:'bwa/library', publish_results:'', publish_by_id:false, suffix:'.Lb'], samtools_sort_lib:[args:'', args2:'', publish_dir:'bwa/library', publish_results:'', publish_by_id:false, suffix:'.Lb.sorted'], picard_mergesamfiles:[args:'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.sorted'], picard_markduplicates:[args:'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.mkD.sorted'], samtools_sort_merged_lib:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.mkD.sorted'], bam_filter:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.flT.sorted'], bam_remove_orphans:[args:'--only_fr_pairs', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], samtools_sort_filter:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.clN.sorted'], picard_collectmultiplemetrics:[args:'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary/picard_metrics', publish_results:'', publish_by_id:false, suffix:'.mLb.clN.sorted'], preseq_lcextrap:[args:'-verbose -bam -seed 1', args2:'', publish_dir:'bwa/mergedLibrary/preseq', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], phantompeakqualtools:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/phantompeakqualtools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], bedtools_genomecov:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/bigwig', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], ucsc_bedgraphtobigwig:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/bigwig', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_computematrix:[args:'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotprofile:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotheatmap:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotfingerprint:[args:'--skipZeros', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], macs2_callpeak:[args:'--keep-dup all', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], plot_macs2_qc:[args:'-o ./ -p macs2_peak', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], homer_annotatepeaks_macs2:[args:'-gid', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:'_peaks'], plot_homer_annotatepeaks:[args:'-o ./ -p macs2_annotatePeaks', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], macs2_consensus:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], homer_annotatepeaks_consensus:[args:'-gid', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:true, suffix:'.consensus_peaks'], subread_featurecounts:[args:'-F SAF -O --fracOverlap 0.2', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], deseq2_featurecounts:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], igv:[args:'', args2:'', publish_dir:'igv', publish_results:'', publish_by_id:false, suffix:''], get_software_versions:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], output_documentation:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], multiqc:[args:'', args2:'', publish_dir:'multiqc', publish_results:'', publish_by_id:false, suffix:'']]", + "description": "Parameter used to supply options to nf-core/modules files. Won't need to be provided on the command-line.", + "hidden": true } } } @@ -533,4 +542,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file From a4ba260994ebea738a220f0f4c8b276c1cf5211c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 09:55:37 +0100 Subject: [PATCH 103/538] Manually reorder descriptions for groups --- nextflow_schema.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 7f0508616..c24063e1c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -117,6 +117,7 @@ "title": "Adapter trimming options", "type": "object", "fa_icon": "fas fa-cut", + "description": "Options to adjust adapter trimming criteria.", "properties": { "clip_r1": { "type": "integer", @@ -156,13 +157,13 @@ "help_text": "By default, trimmed FastQ files will not be saved to the results directory. Specify this flag (or set to true in your config file) to copy these files to the results directory when complete.", "fa_icon": "fas fa-save" } - }, - "description": "Options to adjust adapter trimming criteria." + } }, "alignment_options": { "title": "Alignment options", "type": "object", "fa_icon": "fas fa-map-signs", + "description": "Options to adjust parameters and filtering criteria for read alignments.", "properties": { "keep_dups": { "type": "boolean", @@ -199,13 +200,13 @@ "description": "BAMTools JSON file with custom filters for single-end data.", "fa_icon": "fas fa-cog" } - }, - "description": "Options to adjust parameters and filtering criteria for read alignments." + } }, "peak_calling_options": { "title": "Peak calling options", "type": "object", "fa_icon": "fas fa-chart-area", + "description": "Options to adjust peak calling criteria.", "properties": { "narrow_peak": { "type": "boolean", @@ -256,13 +257,13 @@ "description": "Skip consensus peak generation, annotation and counting.", "fa_icon": "fas fa-fast-forward" } - }, - "description": "Options to adjust peak calling criteria." + } }, "differential_analysis_options": { "title": "Differential analysis options", "type": "object", "fa_icon": "fas fa-not-equal", + "description": "Options to adjust differential analysis criteria.", "properties": { "deseq2_vst": { "type": "boolean", @@ -275,13 +276,13 @@ "description": "Skip differential accessibility analysis.", "fa_icon": "fas fa-fast-forward" } - }, - "description": "Options to adjust differential analysis criteria." + } }, "process_skipping_options": { "title": "Process skipping options", "type": "object", "fa_icon": "fas fa-fast-forward", + "description": "Options to skip various steps within the workflow.", "properties": { "skip_fastqc": { "type": "boolean", @@ -323,8 +324,7 @@ "description": "Skip MultiQC.", "fa_icon": "fas fa-fast-forward" } - }, - "description": "Options to skip various steps within the workflow." + } }, "institutional_config_options": { "title": "Institutional config options", @@ -503,7 +503,7 @@ }, "modules": { "type": "string", - "default": "[samplesheet_check:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], fastqc:[args:'--quiet', args2:'', publish_dir:'fastqc', publish_results:'', publish_by_id:false, suffix:''], trimgalore:[args:'--fastqc', args2:'', publish_dir:'trimgalore', publish_results:'', publish_by_id:false, suffix:''], bwa_index:[args:'-a bwtsw', args2:'', publish_dir:'genome/bwa_index', publish_results:'', publish_by_id:false, suffix:''], gtf2bed:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], make_genome_filter:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], get_chrom_sizes:[args:'', args2:'', publish_dir:'genome', publish_results:'', publish_by_id:false, suffix:''], bwa_mem:[args:'-M', args2:'-h -F 0x0100 -O BAM', publish_dir:'bwa/library', publish_results:'', publish_by_id:false, suffix:'.Lb'], samtools_sort_lib:[args:'', args2:'', publish_dir:'bwa/library', publish_results:'', publish_by_id:false, suffix:'.Lb.sorted'], picard_mergesamfiles:[args:'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.sorted'], picard_markduplicates:[args:'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.mkD.sorted'], samtools_sort_merged_lib:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.mkD.sorted'], bam_filter:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.flT.sorted'], bam_remove_orphans:[args:'--only_fr_pairs', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], samtools_sort_filter:[args:'', args2:'', publish_dir:'bwa/mergedLibrary', publish_results:'', publish_by_id:false, suffix:'.mLb.clN.sorted'], picard_collectmultiplemetrics:[args:'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp', args2:'', publish_dir:'bwa/mergedLibrary/picard_metrics', publish_results:'', publish_by_id:false, suffix:'.mLb.clN.sorted'], preseq_lcextrap:[args:'-verbose -bam -seed 1', args2:'', publish_dir:'bwa/mergedLibrary/preseq', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], phantompeakqualtools:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/phantompeakqualtools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], bedtools_genomecov:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/bigwig', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], ucsc_bedgraphtobigwig:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/bigwig', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_computematrix:[args:'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotprofile:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotheatmap:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], deeptools_plotfingerprint:[args:'--skipZeros', args2:'', publish_dir:'bwa/mergedLibrary/deeptools', publish_results:'', publish_by_id:false, suffix:'.mLb.clN'], macs2_callpeak:[args:'--keep-dup all', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], plot_macs2_qc:[args:'-o ./ -p macs2_peak', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], homer_annotatepeaks_macs2:[args:'-gid', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:'_peaks'], plot_homer_annotatepeaks:[args:'-o ./ -p macs2_annotatePeaks', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], macs2_consensus:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], homer_annotatepeaks_consensus:[args:'-gid', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:true, suffix:'.consensus_peaks'], subread_featurecounts:[args:'-F SAF -O --fracOverlap 0.2', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], deseq2_featurecounts:[args:'', args2:'', publish_dir:'bwa/mergedLibrary/macs2', publish_results:'', publish_by_id:false, suffix:''], igv:[args:'', args2:'', publish_dir:'igv', publish_results:'', publish_by_id:false, suffix:''], get_software_versions:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], output_documentation:[args:'', args2:'', publish_dir:'pipeline_info', publish_results:'', publish_by_id:false, suffix:''], multiqc:[args:'', args2:'', publish_dir:'multiqc', publish_results:'', publish_by_id:false, suffix:'']]", + "default": "", "description": "Parameter used to supply options to nf-core/modules files. Won't need to be provided on the command-line.", "hidden": true } @@ -542,4 +542,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} From c094c1b9a53a01f49b24e6b8b696cd373d0180f0 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 10:42:12 +0100 Subject: [PATCH 104/538] Update software versions script --- bin/scrape_software_versions.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 bin/scrape_software_versions.py diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py old mode 100755 new mode 100644 From 6c7b7a5a497e0cde2b02110d975739891da85c10 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 10:43:47 +0100 Subject: [PATCH 105/538] Update permissions --- bin/scrape_software_versions.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/scrape_software_versions.py diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py old mode 100644 new mode 100755 From a4f0629ef49bc3adac965670f57dd3dbe2a3536e Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 10:47:27 +0100 Subject: [PATCH 106/538] Fix EOF literal sting error --- bin/scrape_software_versions.py | 69 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index d0a512f6e..b294619f9 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -1,35 +1,34 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] -for version_file in version_files: - - software = version_file.replace('.version.txt','') - if software == 'pipeline': - software = 'nf-core/chipseq' - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/chipseq Software Versions' -section_href: 'https://github.com/nf-core/chipseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-''') -for k,v in sorted(results.items()): - print("
{}
{}
".format(k,v)) -print ("
") - -# Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in sorted(results.items()): - f.write("{}\t{}\n".format(k,v)) +#!/usr/bin/env python +from __future__ import print_function +import os + +results = {} +version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] +for version_file in version_files: + + software = version_file.replace('.version.txt','') + if software == 'pipeline': + software = 'nf-core/chipseq' + + with open(version_file) as fin: + version = fin.read().strip() + results[software] = version + +# Dump to YAML +print (''' +id: 'software_versions' +section_name: 'nf-core/chipseq Software Versions' +section_href: 'https://github.com/nf-core/chipseq' +plot_type: 'html' +description: 'are collected at run time from the software output.' +data: | +
+''') +for k,v in sorted(results.items()): + print("
{}
{}
".format(k,v)) +print ("
") + +# Write out regexes as csv file: +with open('software_versions.csv', 'w') as f: + for k,v in sorted(results.items()): + f.write("{}\t{}\n".format(k,v)) From e91a23b9823d5b2b021a6cd6aa09b96dc182ba0c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 10:50:02 +0100 Subject: [PATCH 107/538] Arrrrggghhhh carriage returns --- bin/scrape_software_versions.py | 68 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index b294619f9..e2b87c787 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -1,34 +1,34 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] -for version_file in version_files: - - software = version_file.replace('.version.txt','') - if software == 'pipeline': - software = 'nf-core/chipseq' - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print (''' -id: 'software_versions' -section_name: 'nf-core/chipseq Software Versions' -section_href: 'https://github.com/nf-core/chipseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-''') -for k,v in sorted(results.items()): - print("
{}
{}
".format(k,v)) -print ("
") - -# Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in sorted(results.items()): - f.write("{}\t{}\n".format(k,v)) +#!/usr/bin/env python +from __future__ import print_function +import os + +results = {} +version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] +for version_file in version_files: + + software = version_file.replace('.version.txt','') + if software == 'pipeline': + software = 'nf-core/chipseq' + + with open(version_file) as fin: + version = fin.read().strip() + results[software] = version + +# Dump to YAML +print (''' +id: 'software_versions' +section_name: 'nf-core/chipseq Software Versions' +section_href: 'https://github.com/nf-core/chipseq' +plot_type: 'html' +description: 'are collected at run time from the software output.' +data: | +
+''') +for k,v in sorted(results.items()): + print("
{}
{}
".format(k,v)) +print ("
") + +# Write out regexes as csv file: +with open('software_versions.csv', 'w') as f: + for k,v in sorted(results.items()): + f.write("{}\t{}\n".format(k,v)) From 909fab938558c33274aff0f4cb73b53f52b2378f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 11:01:24 +0100 Subject: [PATCH 108/538] Change file permissions --- modules/local/process/get_software_versions.nf | 0 modules/local/process/multiqc.nf | 0 modules/local/process/output_documentation.nf | 0 modules/local/process/samplesheet_check.nf | 0 modules/nf-core/software/fastqc.nf | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 modules/local/process/get_software_versions.nf mode change 100755 => 100644 modules/local/process/multiqc.nf mode change 100755 => 100644 modules/local/process/output_documentation.nf mode change 100755 => 100644 modules/local/process/samplesheet_check.nf mode change 100755 => 100644 modules/nf-core/software/fastqc.nf diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf old mode 100755 new mode 100644 diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf old mode 100755 new mode 100644 diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf old mode 100755 new mode 100644 diff --git a/modules/local/process/samplesheet_check.nf b/modules/local/process/samplesheet_check.nf old mode 100755 new mode 100644 diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf old mode 100755 new mode 100644 From 0d27926c043c9d1e3e921fa12b4423d31b0e80fc Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 12:09:13 +0100 Subject: [PATCH 109/538] Add in first pass IGV --- conf/modules.config | 3 +- main.nf | 23 ++++++++----- modules/local/process/igv.nf | 64 +++++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6d9425a83..98da7e7ac 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -193,7 +193,8 @@ modules['plot_homer_annotatepeaks'] = modules['macs2_consensus'] = module_options ( - publish_dir : "bwa/mergedLibrary/macs2" + publish_dir : "bwa/mergedLibrary/macs2", + publish_by_id : true ) modules['homer_annotatepeaks_consensus'] = diff --git a/main.nf b/main.nf index abad061f5..3a173dc28 100755 --- a/main.nf +++ b/main.nf @@ -142,7 +142,7 @@ include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' //include { FRIP_SCORE } from './modules/local/process/frip_score' //include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' -//include { IGV } from './modules/local/process/igv' +include { IGV } from './modules/local/process/igv' include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' include { MULTIQC } from './modules/local/process/multiqc' @@ -359,12 +359,12 @@ workflow { params.modules['deeptools_plotfingerprint'] ) + peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' if (params.macs_gsize) { /* * Call peaks */ - peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' @@ -478,12 +478,19 @@ workflow { } - // /* - // * Create IGV session - // */ - // IGV ( - // params.modules['igv'] - // ) + /* + * Create IGV session + */ + IGV ( + ch_fasta, + UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + params.modules['ucsc_bedgraphtobigwig'], + params.modules['macs2_callpeak'], + params.modules['macs2_consensus'], + params.modules['igv'] + ) /* * Pipeline reporting diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf index e1d94bbfb..f7c7bae9b 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/process/igv.nf @@ -1,26 +1,38 @@ -//conda (params.conda ? "${baseDir}/environment.yml" : null) -// /* -// * STEP 8: Create IGV session file -// */ -// process IGV { -// publishDir "${params.outdir}/igv/${PEAK_TYPE}", mode: params.publish_dir_mode -// -// when: -// !params.skip_igv -// -// input: -// path fasta from ch_fasta -// path bigwigs from ch_bigwig_igv.collect().ifEmpty([]) -// path peaks from ch_macs_igv.collect().ifEmpty([]) -// path consensus_peaks from ch_macs_consensus_igv.collect().ifEmpty([]) -// path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) -// -// output: -// path '*.{txt,xml}' -// -// script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ -// """ -// cat *.txt > igv_files.txt -// igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' -// """ -// } +/* + * Create IGV session file + */ +process IGV { + publishDir "${params.outdir}/${options.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (options.publish_results == "none") null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path fasta + path ("${bigwig_options.publish_dir}/*") + path ("${peak_options.publish_dir}/*") + path ("${consensus_options.publish_dir}/*") + val bigwig_options + val peak_options + val consensus_options + // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) + val options + + output: + path "*files.txt", emit: txt + path "*.xml", emit: xml + + script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ + """ + find * -type l -name "*.bigWig" -exec echo -e ""{}"\\t0,0,178" \\; > bigwig.igv.txt + find * -type l -name "*Peak" -exec echo -e ""{}"\\t0,0,178" \\; > peaks.igv.txt + + cat *.txt > igv_files.txt + igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' + """ +} +// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt From 2b4006be820e69e798ff04aa9d2f5d58f6061add Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 12:14:39 +0100 Subject: [PATCH 110/538] Add in SPP process --- main.nf | 2 +- modules/local/process/multiqc.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 3a173dc28..f39e4199f 100755 --- a/main.nf +++ b/main.nf @@ -539,7 +539,7 @@ workflow { PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 0f2572091..6e9003f1a 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -47,7 +47,7 @@ process MULTIQC { path ('preseq/*') path ('deeptools/*') path ('deeptools/*') - // path ('phantompeakqualtools/*') from ch_spp_out_mqc.collect().ifEmpty([]) + path ('phantompeakqualtools/*') // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) From 4e763e1a828f8bc0daa531b35404eb710fde8a53 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 31 Jul 2020 13:19:48 +0200 Subject: [PATCH 111/538] Template update for nf-core/tools version 1.10.2 --- .github/CONTRIBUTING.md | 2 +- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/branch.yml | 1 + .github/workflows/linting.yml | 9 ++++- .github/workflows/push_dockerhub.yml | 53 ++++++++++++++-------------- Dockerfile | 2 +- conf/test_full.config | 2 +- docs/usage.md | 2 +- main.nf | 2 +- 9 files changed, 42 insertions(+), 33 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6ab73766c..cb1a4e6d7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -46,7 +46,7 @@ These tests are run both with the latest available version of `Nextflow` and als ## Patch -: warning: Only in the unlikely and regretful event of a release happening with a bug. +:warning: Only in the unlikely and regretful event of a release happening with a bug. * On your own fork, make a new branch `patch` based on `upstream/master`. * Fix the bug, and bump version (X.Y.Z+1). diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index b6305e000..75a51e5fe 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -21,7 +21,7 @@ jobs: run: conda install -c conda-forge awscli - name: Start AWS batch job # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) + # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command env: diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 492b3ab3d..93e0f4f87 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -17,6 +17,7 @@ jobs: # If the above check failed, post a comment on the PR explaining the failure + # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() uses: mshick/add-pr-comment@v1 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index eb66c1449..8e8d5bbcf 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -57,5 +57,12 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core lint ${GITHUB_WORKSPACE} + run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} + + - name: Upload linting log file artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: linting-log-file + path: lint_log.txt diff --git a/.github/workflows/push_dockerhub.yml b/.github/workflows/push_dockerhub.yml index 96d7636c9..9a9f84a4c 100644 --- a/.github/workflows/push_dockerhub.yml +++ b/.github/workflows/push_dockerhub.yml @@ -8,32 +8,33 @@ on: release: types: [published] -push_dockerhub: - name: Push new Docker image to Docker Hub - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/chipseq' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 +jobs: + push_dockerhub: + name: Push new Docker image to Docker Hub + runs-on: ubuntu-latest + # Only run for the nf-core repo, for releases and merged PRs + if: ${{ github.repository == 'nf-core/chipseq' }} + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 - - name: Build new docker image - run: docker build --no-cache . -t nfcore/chipseq:latest + - name: Build new docker image + run: docker build --no-cache . -t nfcore/chipseq:latest - - name: Push Docker image to DockerHub (dev) - if: ${{ github.event_name == 'push' }} - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker tag nfcore/chipseq:latest nfcore/chipseq:dev - docker push nfcore/chipseq:dev + - name: Push Docker image to DockerHub (dev) + if: ${{ github.event_name == 'push' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker tag nfcore/chipseq:latest nfcore/chipseq:dev + docker push nfcore/chipseq:dev - - name: Push Docker image to DockerHub (release) - if: ${{ github.event_name == 'release' }} - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/chipseq:latest - docker tag nfcore/chipseq:latest nfcore/chipseq:${{ github.event.release.tag_name }} - docker push nfcore/chipseq:${{ github.event.release.tag_name }} + - name: Push Docker image to DockerHub (release) + if: ${{ github.event_name == 'release' }} + run: | + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin + docker push nfcore/chipseq:latest + docker tag nfcore/chipseq:latest nfcore/chipseq:${{ github.event.release.tag_name }} + docker push nfcore/chipseq:${{ github.event.release.tag_name }} diff --git a/Dockerfile b/Dockerfile index 0e2e359d6..b739ba3eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.10.1 +FROM nfcore/base:1.10.2 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" diff --git a/conf/test_full.config b/conf/test_full.config index deedc3a34..5ed014407 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) // TODO nf-core: Give any required params for the test so that command line flags are not needed single_end = false - readPaths = [ + input_paths = [ ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] ] diff --git a/docs/usage.md b/docs/usage.md index ba405e485..ceaa7dd4d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -80,7 +80,7 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U ### `-c` -Specify the path to a specific config file (this is a core NextFlow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. +Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. #### Custom resource requests diff --git a/main.nf b/main.nf index 15a4dfcce..76ded6ac2 100644 --- a/main.nf +++ b/main.nf @@ -127,7 +127,7 @@ def summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision summary['Run Name'] = custom_runName ?: workflow.runName // TODO nf-core: Report custom parameters here -summary['Reads'] = params.input +summary['Input'] = params.input summary['Fasta Ref'] = params.fasta summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" From 2906eb5f1bc4773705d8a83e4835ca811cf9290b Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 14:06:26 +0100 Subject: [PATCH 112/538] Add in first batch of custom MultiQC custom content --- assets/multiqc_config.yaml | 2 + conf/modules.config | 13 +++- main.nf | 71 ++++++++++++------- modules/local/process/frip_score.nf | 30 +++++++- modules/local/process/multiqc.nf | 6 +- .../multiqc_custom_phantompeakqualtools.nf | 33 +++++++++ .../nf-core/software/phantompeakqualtools.nf | 3 +- 7 files changed, 126 insertions(+), 32 deletions(-) create mode 100644 modules/local/process/multiqc_custom_phantompeakqualtools.nf diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 4d795e5da..ba2b7b0e7 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -167,3 +167,5 @@ sp: fn: '*plotFingerprint*' deeptools/plotProfile: fn: '*plotProfile*' + phantompeakqualtools/out: + fn: '*.spp.out' diff --git a/conf/modules.config b/conf/modules.config index 98da7e7ac..cef4d58fe 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -10,7 +10,7 @@ def module_options (Map args) { options.args = args.args ?: '' options.args2 = args.args2 ?: '' options.publish_dir = args.publish_dir ?: '' - options.publish_results = args.publish_results ?: '' + options.publish_results = args.publish_results ?: 'all' options.publish_by_id = args.publish_by_id ?: false options.suffix = args.suffix ?: '' return options @@ -128,6 +128,11 @@ modules['phantompeakqualtools'] = suffix : ".mLb.clN" ) +modules['multiqc_custom_phantompeakqualtools'] = + module_options ( + publish_results : "none" + ) + modules['bedtools_genomecov'] = module_options ( publish_dir : "bwa/mergedLibrary/bigwig", @@ -172,6 +177,12 @@ modules['macs2_callpeak'] = publish_dir : "bwa/mergedLibrary/macs2" ) +modules['frip_score'] = + module_options ( + args : "-bed -c -f 0.20", + publish_results : "none" + ) + modules['plot_macs2_qc'] = module_options ( args : "-o ./ -p macs2_peak", diff --git a/main.nf b/main.nf index f39e4199f..34302e74d 100755 --- a/main.nf +++ b/main.nf @@ -99,17 +99,16 @@ ch_output_docs_images = file("$baseDir/docs/images/", checkIfExists: true) // JSON files required by BAMTools for alignment filtering ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) -//ch_bamtools_filter_config // Header files for MultiQC +ch_spp_nsc_header = file("$baseDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) +ch_spp_rsc_header = file("$baseDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) +ch_spp_correlation_header = file("$baseDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) ch_frip_score_header = file("$baseDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) -ch_spp_correlation_header = file("$baseDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) -ch_spp_nsc_header = file("$baseDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) -ch_spp_rsc_header = file("$baseDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) //////////////////////////////////////////////////// /* -- PARAMETER SUMMARY -- */ @@ -133,22 +132,23 @@ log.info "-\033[2m----------------------------------------------------\033[0m-" /* -- IMPORT LOCAL MODULES/SUBWORKFLOWS -- */ //////////////////////////////////////////////////// -include { GTF2BED } from './modules/local/process/gtf2bed' -include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' -include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' -include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' -include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' -include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' -include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' -//include { FRIP_SCORE } from './modules/local/process/frip_score' -//include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' -include { IGV } from './modules/local/process/igv' -include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' -include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' -include { MULTIQC } from './modules/local/process/multiqc' - -include { INPUT_CHECK } from './modules/local/subworkflow/input_check' -include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' +include { GTF2BED } from './modules/local/process/gtf2bed' +include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' +include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' +include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' +include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' +include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' +include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from './modules/local/process/multiqc_custom_phantompeakqualtools' +include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' +include { FRIP_SCORE } from './modules/local/process/frip_score' +//include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' +include { IGV } from './modules/local/process/igv' +include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' +include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' +include { MULTIQC } from './modules/local/process/multiqc' + +include { INPUT_CHECK } from './modules/local/subworkflow/input_check' +include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' //////////////////////////////////////////////////// /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ @@ -296,6 +296,14 @@ workflow { ) ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + ch_spp_nsc_header, + ch_spp_rsc_header, + ch_spp_correlation_header, + params.modules['multiqc_custom_phantompeakqualtools'] + ) + /* * Coverage tracks */ @@ -384,11 +392,24 @@ workflow { ) ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + + ch_ip_control_bam + .join(MACS2_CALLPEAK.out.peak, by: [0]) + .map { it -> [ it[0], it[1], it[3] ] } + .set { ch_ip_peak } + FRIP_SCORE ( + ch_ip_peak, + params.modules['frip_score'] + ) + //| cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv + params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" PLOT_MACS2_QC ( MACS2_CALLPEAK.out.peak.collect{it[1]}, params.modules['plot_macs2_qc'] ) + // ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) + // ch_frip_score_header = file("$baseDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS_MACS2 ( @@ -405,6 +426,7 @@ workflow { "_peaks.annotatePeaks.txt", params.modules['plot_homer_annotatepeaks'] ) + //ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] @@ -468,13 +490,12 @@ workflow { ) ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) - // FRIP_SCORE ( - // params.modules['frip_score'] - // ) // // DESEQ2_FEATURECOUNTS ( // params.modules['deseq2_featurecounts'] // ) + // ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) } @@ -540,7 +561,9 @@ workflow { DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) diff --git a/modules/local/process/frip_score.nf b/modules/local/process/frip_score.nf index 3ccc18853..5ec357456 100644 --- a/modules/local/process/frip_score.nf +++ b/modules/local/process/frip_score.nf @@ -1,4 +1,28 @@ -conda (params.conda ? "${baseDir}/environment.yml" : null) +process FRIP_SCORE { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (options.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } -READS_IN_PEAKS=\$(intersectBed -a ${ipbam[0]} -b ${ip}_peaks.${PEAK_TYPE} -bed -c -f 0.20 | awk -F '\t' '{sum += \$NF} END {print sum}') -grep 'mapped (' $ipflagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${ip}", a/\$1}' | cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(peak) + val options + + output: + tuple val(meta), path("*.txt"), emit: txt + + script: + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + + """ + READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $options.args | awk -F '\t' '{sum += \$NF} END {print sum}') + samtools flagstat $bam > ${bam}.flagstat + grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt + """ +} diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 6e9003f1a..53a464600 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -48,8 +48,10 @@ process MULTIQC { path ('deeptools/*') path ('deeptools/*') path ('phantompeakqualtools/*') - // path ('phantompeakqualtools/*') from ch_spp_csv_mqc.collect().ifEmpty([]) - + path ('phantompeakqualtools/*') + path ('phantompeakqualtools/*') + path ('phantompeakqualtools/*') + // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) path ('featurecounts/*') diff --git a/modules/local/process/multiqc_custom_phantompeakqualtools.nf b/modules/local/process/multiqc_custom_phantompeakqualtools.nf new file mode 100644 index 000000000..6b79fcc72 --- /dev/null +++ b/modules/local/process/multiqc_custom_phantompeakqualtools.nf @@ -0,0 +1,33 @@ +process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { + tag "$meta.id" + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (options.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(spp), path(rdata) + path nsc_header + path rsc_header + path correlation_header + val options + + output: + tuple val(meta), path("*.spp_nsc_mqc.tsv"), emit: nsc + tuple val(meta), path("*.spp_rsc_mqc.tsv"), emit: rsc + tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation + + script: + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + cp $correlation_header ${prefix}.spp_correlation_mqc.tsv + Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" + + awk -v OFS='\t' '{print "${meta.id}", \$9}' $spp | cat $nsc_header - > ${prefix}.spp_nsc_mqc.tsv + awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv + """ +} diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 8d072bab2..beaf754b0 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -23,6 +23,7 @@ process PHANTOMPEAKQUALTOOLS { output: tuple val(meta), path("*.out"), emit: spp tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.Rdata"), emit: rdata path "*.version.txt", emit: version script: @@ -30,8 +31,6 @@ process PHANTOMPEAKQUALTOOLS { """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus - Rscript -e "load('${prefix}.spp.Rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}_spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" - echo $VERSION > ${SOFTWARE}.version.txt """ } From b0e311c742084e157215d3041036df61288f6d68 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 14:45:47 +0100 Subject: [PATCH 113/538] Add in custom peaks --- conf/modules.config | 5 ++++ main.nf | 20 +++++++++---- modules/local/process/multiqc.nf | 7 +++-- modules/local/process/multiqc_custom_peaks.nf | 28 +++++++++++++++++++ 4 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 modules/local/process/multiqc_custom_peaks.nf diff --git a/conf/modules.config b/conf/modules.config index cef4d58fe..057b30af9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -183,6 +183,11 @@ modules['frip_score'] = publish_results : "none" ) +modules['multiqc_custom_peaks'] = + module_options ( + publish_results : "none" + ) + modules['plot_macs2_qc'] = module_options ( args : "-o ./ -p macs2_peak", diff --git a/main.nf b/main.nf index 34302e74d..3419eaaed 100755 --- a/main.nf +++ b/main.nf @@ -139,6 +139,7 @@ include { BEDTOOLS_GENOMECOV } from './modules/local/process/be include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from './modules/local/process/multiqc_custom_phantompeakqualtools' +include { MULTIQC_CUSTOM_PEAKS } from './modules/local/process/multiqc_custom_peaks' include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' include { FRIP_SCORE } from './modules/local/process/frip_score' //include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' @@ -392,7 +393,6 @@ workflow { ) ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) - ch_ip_control_bam .join(MACS2_CALLPEAK.out.peak, by: [0]) .map { it -> [ it[0], it[1], it[3] ] } @@ -401,15 +401,23 @@ workflow { ch_ip_peak, params.modules['frip_score'] ) - //| cat $frip_score_header - > ${ip}_peaks.FRiP_mqc.tsv + + ch_ip_peak + .join(FRIP_SCORE.out.txt, by: [0]) + .map { it -> [ it[0], it[2], it[3] ] } + .set { ch_ip_peak_frip } + MULTIQC_CUSTOM_PEAKS ( + ch_ip_peak_frip, + ch_peak_count_header, + ch_frip_score_header, + params.modules['multiqc_custom_peaks'] + ) params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" PLOT_MACS2_QC ( MACS2_CALLPEAK.out.peak.collect{it[1]}, params.modules['plot_macs2_qc'] ) - // ch_peak_count_header = file("$baseDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) - // ch_frip_score_header = file("$baseDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" HOMER_ANNOTATEPEAKS_MACS2 ( @@ -426,6 +434,7 @@ workflow { "_peaks.annotatePeaks.txt", params.modules['plot_homer_annotatepeaks'] ) + //cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv //ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) // Create channel: [ meta , [ peaks ] ] @@ -565,7 +574,8 @@ workflow { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) + MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 53a464600..6441d7285 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -51,9 +51,10 @@ process MULTIQC { path ('phantompeakqualtools/*') path ('phantompeakqualtools/*') path ('phantompeakqualtools/*') - - // path ('macs/*') from ch_macs_mqc.collect().ifEmpty([]) - // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) + + path ('macs2/peaks/*') + path ('macs2/peaks/*') + // path ('macs2/annotation*') from ch_macs_qc_mqc.collect().ifEmpty([]) path ('featurecounts/*') // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/process/multiqc_custom_peaks.nf new file mode 100644 index 000000000..a6a918010 --- /dev/null +++ b/modules/local/process/multiqc_custom_peaks.nf @@ -0,0 +1,28 @@ +process MULTIQC_CUSTOM_PEAKS { + tag "$meta.id" + publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + mode: params.publish_dir_mode, + saveAs: { filename -> + if (options.publish_results == "none") null + else if (filename.endsWith('.version.txt')) null + else filename } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(peak), path(frip) + path peak_count_header + path frip_score_header + val options + + output: + tuple val(meta), path("*.peak_count_mqc.tsv"), emit: count + tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip + + script: + prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv + cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv + """ +} From 85570fce21e9d4c9037cc32a98d4027af8e380fd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 15:05:51 +0100 Subject: [PATCH 114/538] Add custom annotatepeaks to MultiQC --- assets/multiqc_config.yaml | 2 ++ main.nf | 7 +++---- modules/local/process/multiqc.nf | 3 ++- modules/local/process/plot_homer_annotatepeaks.nf | 4 ++++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index ba2b7b0e7..6d9df4a06 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -149,6 +149,8 @@ extra_fn_clean_exts: - 'clN' - 'mLb' - '_peaks' + - '.FRiP' + - '.peak' - '_spp' - '.spp' - 'ccurve' diff --git a/main.nf b/main.nf index 3419eaaed..3c392545b 100755 --- a/main.nf +++ b/main.nf @@ -431,11 +431,10 @@ workflow { params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" PLOT_HOMER_ANNOTATEPEAKS ( HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, "_peaks.annotatePeaks.txt", params.modules['plot_homer_annotatepeaks'] ) - //cat $peak_annotation_header macs_annotatePeaks.summary.txt > macs_annotatePeaks.summary_mqc.tsv - //ch_peak_annotation_header = file("$baseDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] @@ -576,8 +575,8 @@ workflow { MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - // path ('macs/*') from ch_macs_qc_mqc.collect().ifEmpty([]) - SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect{it[1]}.ifEmpty([]), + SUBREAD_FEATURECOUNTS.out.summary.collect().ifEmpty([]), // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) params.modules['multiqc'] diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 6441d7285..15b78e953 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -54,7 +54,8 @@ process MULTIQC { path ('macs2/peaks/*') path ('macs2/peaks/*') - // path ('macs2/annotation*') from ch_macs_qc_mqc.collect().ifEmpty([]) + path ('macs2/annotation*') + path ('featurecounts/*') // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index b2e25bd87..d4ec3f196 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -13,12 +13,14 @@ process PLOT_HOMER_ANNOTATEPEAKS { input: path annos + path mqc_header val suffix val options output: path '*.txt', emit: txt path '*.pdf', emit: pdf + path '*.tsv', emit: tsv script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ @@ -26,5 +28,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { -i ${annos.join(',')} \\ -s ${annos.join(',').replaceAll("${suffix}","")} \\ $options.args + + find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv """ } From 454c0dd1c7da85576f7da1837c7971ae6a4b5db3 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Fri, 31 Jul 2020 15:29:27 +0100 Subject: [PATCH 115/538] Fix MultiQC report --- main.nf | 4 ++-- modules/local/process/multiqc.nf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 3c392545b..caf6e30f6 100755 --- a/main.nf +++ b/main.nf @@ -575,8 +575,8 @@ workflow { MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect{it[1]}.ifEmpty([]), - SUBREAD_FEATURECOUNTS.out.summary.collect().ifEmpty([]), + PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) params.modules['multiqc'] diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 15b78e953..15d64be86 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -54,8 +54,8 @@ process MULTIQC { path ('macs2/peaks/*') path ('macs2/peaks/*') - path ('macs2/annotation*') - + path ('macs2/annotation/*') + path ('featurecounts/*') // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) From a4d63b978e2fc7d263db618b730acf24158dafb1 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 10:44:49 +0100 Subject: [PATCH 116/538] Add local functions --- modules/nf-core/software/bwa_index.nf | 46 +++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index 5cdf4c1ba..bade7c393 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -1,20 +1,52 @@ def SOFTWARE = 'bwa' +// Function to initialise default values and to generate a Groovy Map of module options +def init_options (Map args, String publish_dir) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.suffix = args.suffix ?: '' + options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir + options.publish_files = args.publish_files ?: null + options.publish_by_id = args.publish_by_id ?: false + return options +} + +// Function to publish module results + // if publish_files == null - all files are published + // if publish_files == Map [:] - no files are published + // if publish_files == Map [ext:path] - Only files that end with "ext" are published to "path" appended to output directory +def publish_options ( filename, publish_files ) { + if (publish_files instanceof Map) { + if (!publish_files.isEmpty()) { + if (!filename.endsWith('.version.txt')) { + filename + // Loop through extensions and paths here + } + } + } + else { + if (!filename.endsWith('.version.txt')) filename + } +} + process BWA_INDEX { tag "$fasta" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", - mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + //if (module_options.publish_files) { + publishDir "${params.outdir}/${options.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> publish_options( filename, module_options.publish_files ) } + //} container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" conda (params.conda ? "bioconda::bwa=0.7.17" : null) + //echo true + //cache false + input: path fasta val options @@ -24,7 +56,9 @@ process BWA_INDEX { path "*.version.txt", emit: version script: + def module_options = init_options(options, SOFTWARE) """ + echo $module_options bwa index $options.args $fasta echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ From bded91f86322a4a901b9e14fd73324c7b57e5abd Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 16:15:08 +0100 Subject: [PATCH 117/538] Use groovy funcs for publishing --- conf/modules.config | 414 ++++++-------- main.nf | 786 +++++++++++++------------- modules/nf-core/software/bwa_index.nf | 49 +- 3 files changed, 570 insertions(+), 679 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 057b30af9..7131e68f4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -2,255 +2,171 @@ * ------------------------------------------------- * Nextflow config file for module specific-options * ------------------------------------------------- + * + * Available keys to override module options: + * args = Additional arguments appended to command in module. + * args2 = Second set of arguments appended to command in module (multi-tool modules). + * publish_by_id = Publish results in separate folders by meta.id value. + * publish_dir = Directory to publish results. + * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results + * for a particular file extension. The value of "directory" is appended to the standard + * "publish_dir" path as defined above. + * suffix = File name suffix for output files */ -// Function to initialise default values and to generate a Groovy Map of module options -def module_options (Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_dir = args.publish_dir ?: '' - options.publish_results = args.publish_results ?: 'all' - options.publish_by_id = args.publish_by_id ?: false - options.suffix = args.suffix ?: '' - return options +params { + modules { + 'samplesheet_check' { + publish_dir = "pipeline_info" + } + 'fastqc' { + args = "--quiet" + } + 'trimgalore' { + args = "--fastqc" + } + 'bwa_index' { + args = "-a bwtsw" + publish_dir = "genome/bwa_index" + } + 'gtf2bed' { + publish_dir = "genome" + } + 'make_genome_filter' { + publish_dir = "genome" + } + 'get_chrom_sizes' { + publish_dir = "genome" + } + 'bwa_mem' { + args = "-M" + args2 = "-h -F 0x0100 -O BAM" + publish_dir = "bwa/library" + suffix = ".Lb" + } + 'samtools_sort_lib' { + publish_dir = "bwa/library" + suffix = ".Lb.sorted" + } + 'picard_mergesamfiles' { + args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.sorted" + } + 'picard_markduplicates' { + args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" + } + 'samtools_sort_merged_lib' { + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" + } + 'bam_filter' { + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.flT.sorted" + } + 'bam_remove_orphans' { + args = "--only_fr_pairs" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN" + } + 'samtools_sort_filter' { + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN.sorted" + } + 'picard_collectmultiplemetrics' { + args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary/picard_metrics" + suffix = ".mLb.clN.sorted" + } + 'preseq_lcextrap' { + args = "-verbose -bam -seed 1" + publish_dir = "bwa/mergedLibrary/preseq" + suffix = ".mLb.clN" + } + 'phantompeakqualtools' { + publish_dir = "bwa/mergedLibrary/phantompeakqualtools" + suffix = ".mLb.clN" + } + 'multiqc_custom_phantompeakqualtools' { + publish_files = [:] + } + 'bedtools_genomecov' { + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" + } + 'ucsc_bedgraphtobigwig' { + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" + } + 'deeptools_computematrix' { + args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" + } + 'deeptools_plotprofile' { + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" + } + 'deeptools_plotheatmap' { + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" + } + 'deeptools_plotfingerprint' { + args = "--skipZeros" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" + } + 'macs2_callpeak' { + args = "--keep-dup all" + publish_dir = "bwa/mergedLibrary/macs2" + } + 'frip_score' { + args = "-bed -c -f 0.20" + publish_files = [:] + } + 'multiqc_custom_peaks' { + publish_files = [:] + } + 'plot_macs2_qc' { + args = "-o ./ -p macs2_peak" + publish_dir = "bwa/mergedLibrary/macs2" + } + 'homer_annotatepeaks_macs2' { + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + suffix = "_peaks" + } + 'plot_homer_annotatepeaks' { + args = "-o ./ -p macs2_annotatePeaks" + publish_dir = "bwa/mergedLibrary/macs2" + } + 'macs2_consensus' { + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true + } + 'homer_annotatepeaks_consensus' { + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true, + suffix = ".consensus_peaks" + } + 'subread_featurecounts' { + args = "-F SAF -O --fracOverlap 0.2" + publish_dir = "bwa/mergedLibrary/macs2" + } + 'deseq2_featurecounts' { + publish_dir = "bwa/mergedLibrary/macs2" + } + 'igv' { + publish_dir = "igv" + } + 'get_software_versions' { + publish_dir = "pipeline_info" + } + 'output_documentation' { + publish_dir = "pipeline_info" + } + } } - -def Map modules = [:] -modules['samplesheet_check'] = - module_options ( - publish_dir : "pipeline_info" - ) - -modules['fastqc'] = - module_options ( - args : "--quiet", - publish_dir : "fastqc" - ) - -modules['trimgalore'] = - module_options ( - args : "--fastqc", - publish_dir : "trimgalore" - ) - -modules['bwa_index'] = - module_options ( - args : "-a bwtsw", - publish_dir : "genome/bwa_index" - ) - -modules['gtf2bed'] = - module_options ( - publish_dir : "genome" - ) - -modules['make_genome_filter'] = - module_options ( - publish_dir : "genome" - ) - -modules['get_chrom_sizes'] = - module_options ( - publish_dir : "genome" - ) - -modules['bwa_mem'] = - module_options ( - args : "-M", - args2 : "-h -F 0x0100 -O BAM", - publish_dir : "bwa/library", - suffix : ".Lb" - ) - -modules['samtools_sort_lib'] = - module_options ( - publish_dir : "bwa/library", - suffix : ".Lb.sorted" - ) - -modules['picard_mergesamfiles'] = - module_options ( - args : "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.sorted" - ) - -modules['picard_markduplicates'] = - module_options ( - args : "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.mkD.sorted" - ) - -modules['samtools_sort_merged_lib'] = - module_options ( - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.mkD.sorted" - ) - -modules['bam_filter'] = - module_options ( - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.flT.sorted" - ) - -modules['bam_remove_orphans'] = - module_options ( - args : "--only_fr_pairs", - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.clN" - ) - -modules['samtools_sort_filter'] = - module_options ( - publish_dir : "bwa/mergedLibrary", - suffix : ".mLb.clN.sorted" - ) - -modules['picard_collectmultiplemetrics'] = - module_options ( - args : "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp", - publish_dir : "bwa/mergedLibrary/picard_metrics", - suffix : ".mLb.clN.sorted" - ) - -modules['preseq_lcextrap'] = - module_options ( - args : "-verbose -bam -seed 1", - publish_dir : "bwa/mergedLibrary/preseq", - suffix : ".mLb.clN" - ) - -modules['phantompeakqualtools'] = - module_options ( - publish_dir : "bwa/mergedLibrary/phantompeakqualtools", - suffix : ".mLb.clN" - ) - -modules['multiqc_custom_phantompeakqualtools'] = - module_options ( - publish_results : "none" - ) - -modules['bedtools_genomecov'] = - module_options ( - publish_dir : "bwa/mergedLibrary/bigwig", - suffix : ".mLb.clN" - ) - -modules['ucsc_bedgraphtobigwig'] = - module_options ( - publish_dir : "bwa/mergedLibrary/bigwig", - suffix : ".mLb.clN" - ) - -modules['deeptools_computematrix'] = - module_options ( - args : "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels", - publish_dir : "bwa/mergedLibrary/deeptools", - suffix : ".mLb.clN" - ) - -modules['deeptools_plotprofile'] = - module_options ( - publish_dir : "bwa/mergedLibrary/deeptools", - suffix : ".mLb.clN" - ) - -modules['deeptools_plotheatmap'] = - module_options ( - publish_dir : "bwa/mergedLibrary/deeptools", - suffix : ".mLb.clN" - ) - -modules['deeptools_plotfingerprint'] = - module_options ( - args : "--skipZeros", - publish_dir : "bwa/mergedLibrary/deeptools", - suffix : ".mLb.clN" - ) - -modules['macs2_callpeak'] = - module_options ( - args : "--keep-dup all", - publish_dir : "bwa/mergedLibrary/macs2" - ) - -modules['frip_score'] = - module_options ( - args : "-bed -c -f 0.20", - publish_results : "none" - ) - -modules['multiqc_custom_peaks'] = - module_options ( - publish_results : "none" - ) - -modules['plot_macs2_qc'] = - module_options ( - args : "-o ./ -p macs2_peak", - publish_dir : "bwa/mergedLibrary/macs2" - ) - -modules['homer_annotatepeaks_macs2'] = - module_options ( - args : "-gid", - publish_dir : "bwa/mergedLibrary/macs2", - suffix : "_peaks" - ) - -modules['plot_homer_annotatepeaks'] = - module_options ( - args : "-o ./ -p macs2_annotatePeaks", - publish_dir : "bwa/mergedLibrary/macs2", - ) - -modules['macs2_consensus'] = - module_options ( - publish_dir : "bwa/mergedLibrary/macs2", - publish_by_id : true - ) - -modules['homer_annotatepeaks_consensus'] = - module_options ( - args : "-gid", - publish_dir : "bwa/mergedLibrary/macs2", - publish_by_id : true, - suffix : ".consensus_peaks" - ) - -modules['subread_featurecounts'] = - module_options ( - args : "-F SAF -O --fracOverlap 0.2", - publish_dir : "bwa/mergedLibrary/macs2", - suffix : "" - ) - -modules['deseq2_featurecounts'] = - module_options ( - publish_dir : "bwa/mergedLibrary/macs2" - ) - -modules['igv'] = - module_options ( - publish_dir : "igv" - ) - -modules['get_software_versions'] = - module_options ( - publish_dir : "pipeline_info" - ) - -modules['output_documentation'] = - module_options ( - publish_dir : "pipeline_info" - ) - -modules['multiqc'] = - module_options ( - publish_dir : "multiqc" - ) - -params.modules = modules diff --git a/main.nf b/main.nf index caf6e30f6..c13a5fd8b 100755 --- a/main.nf +++ b/main.nf @@ -192,395 +192,403 @@ workflow { /* * Prepare genome files */ - ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - - if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } - - MAKE_GENOME_FILTER ( - GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, - ch_blacklist.ifEmpty([]), - params.modules['make_genome_filter'] - ) - ch_software_versions = Channel.empty() - ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) - - /* - * Read QC & trimming - */ - nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - params.modules['trimgalore'].args += nextseq - FASTQC_TRIMGALORE ( - INPUT_CHECK.out.reads, - params.skip_fastqc, - params.skip_trimming, - params.modules['fastqc'], - params.modules['trimgalore'] - ) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) - - /* - * Map reads & BAM QC - */ - score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - params.modules['bwa_mem'].args += score - MAP_BWA_MEM ( - FASTQC_TRIMGALORE.out.reads, - ch_index, - ch_fasta, - params.modules['bwa_mem'], - params.modules['samtools_sort_lib'] - ) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) - - /* - * Merge resequenced BAM files - */ - MAP_BWA_MEM - .out - .bam - .map { - meta, bam -> - fmeta = meta.findAll { it.key != 'read_group' } - fmeta.id = fmeta.id.split('_')[0..-2].join('_') - [ fmeta, bam ] } - .groupTuple(by: [0]) - .map { it -> [ it[0], it[1].flatten() ] } - .set { ch_sort_bam } - - PICARD_MERGESAMFILES ( - ch_sort_bam, - params.modules['picard_mergesamfiles'] - ) - ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) - - /* - * Mark duplicates & filter BAM files - */ - MARK_DUPLICATES_PICARD ( - PICARD_MERGESAMFILES.out.bam, - params.modules['picard_markduplicates'], - params.modules['samtools_sort_merged_lib'] - ) - - // Fix getting name sorted BAM here for PE/SE - BAM_CLEAN ( - MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - MAKE_GENOME_FILTER.out.bed.collect(), - ch_bamtools_filter_se_config, - ch_bamtools_filter_pe_config, - params.modules['bam_filter'], - params.modules['bam_remove_orphans'], - params.modules['samtools_sort_filter'] - ) - ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) - - /* - * Post alignment QC - */ - PICARD_COLLECTMULTIPLEMETRICS ( - BAM_CLEAN.out.bam, - ch_fasta, - params.modules['picard_collectmultiplemetrics'] - ) - - PRESEQ_LCEXTRAP ( - BAM_CLEAN.out.bam, - params.modules['preseq_lcextrap'] - ) - ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) - - PHANTOMPEAKQUALTOOLS ( - BAM_CLEAN.out.bam, - params.modules['phantompeakqualtools'] - ) - ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) - - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( - PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), - ch_spp_nsc_header, - ch_spp_rsc_header, - ch_spp_correlation_header, - params.modules['multiqc_custom_phantompeakqualtools'] - ) - - /* - * Coverage tracks - */ - BEDTOOLS_GENOMECOV ( - BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), - params.modules['bedtools_genomecov'] - ) - - UCSC_BEDRAPHTOBIGWIG ( - BEDTOOLS_GENOMECOV.out.bedgraph, - GET_CHROM_SIZES.out.sizes, - params.modules['ucsc_bedgraphtobigwig'] - ) - ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) - - /* - * Coverage plots - */ - DEEPTOOLS_COMPUTEMATRIX ( - UCSC_BEDRAPHTOBIGWIG.out.bigwig, - ch_gene_bed, - params.modules['deeptools_computematrix'] - ) - ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) - - DEEPTOOLS_PLOTPROFILE ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix, - params.modules['deeptools_plotprofile'] - ) - - DEEPTOOLS_PLOTHEATMAP ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix, - params.modules['deeptools_plotheatmap'] - ) - - /* - * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] - */ - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - .set { ch_control_bam_bai } - - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - .combine(ch_control_bam_bai, by: 0) - .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - .set { ch_ip_control_bam_bai } - - /* - * plotFingerprint for IP and control together - */ - params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" - DEEPTOOLS_PLOTFINGERPRINT ( - ch_ip_control_bam_bai, - params.modules['deeptools_plotfingerprint'] - ) - - peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - if (params.macs_gsize) { - - /* - * Call peaks - */ - broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" - pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' - fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' - pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' - params.modules['macs2_callpeak'].publish_dir += "/$peakType" - params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" - - // Create channel: [ val(meta), ip_bam, control_bam ] - ch_ip_control_bam_bai - .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - .set { ch_ip_control_bam } - - MACS2_CALLPEAK ( - ch_ip_control_bam, - params.macs_gsize, - params.modules['macs2_callpeak'] - ) - ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) - - ch_ip_control_bam - .join(MACS2_CALLPEAK.out.peak, by: [0]) - .map { it -> [ it[0], it[1], it[3] ] } - .set { ch_ip_peak } - FRIP_SCORE ( - ch_ip_peak, - params.modules['frip_score'] - ) - - ch_ip_peak - .join(FRIP_SCORE.out.txt, by: [0]) - .map { it -> [ it[0], it[2], it[3] ] } - .set { ch_ip_peak_frip } - MULTIQC_CUSTOM_PEAKS ( - ch_ip_peak_frip, - ch_peak_count_header, - ch_frip_score_header, - params.modules['multiqc_custom_peaks'] - ) - - params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" - PLOT_MACS2_QC ( - MACS2_CALLPEAK.out.peak.collect{it[1]}, - params.modules['plot_macs2_qc'] - ) - - params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" - HOMER_ANNOTATEPEAKS_MACS2 ( - MACS2_CALLPEAK.out.peak, - ch_fasta, - ch_gtf, - params.modules['homer_annotatepeaks_macs2'] - ) - ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) - - params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt", - params.modules['plot_homer_annotatepeaks'] - ) - - // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - MACS2_CALLPEAK - .out - .peak - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - .groupTuple() - .map { - antibody, groups, peaks -> - [ antibody, - groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - peaks ] } - .map { - antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } - .set { ch_antibody_peaks } - - params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" - MACS2_CONSENSUS ( - ch_antibody_peaks, - params.modules['macs2_consensus'] - ) - - params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" - HOMER_ANNOTATEPEAKS_CONSENSUS ( - MACS2_CONSENSUS.out.bed, - ch_fasta, - ch_gtf, - params.modules['homer_annotatepeaks_consensus'] - ) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - - // Create channel: [ val(meta), ip_bam ] - MACS2_CONSENSUS - .out - .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .combine(ch_ip_saf) - .map { - it -> - fmeta = it[1] - fmeta['replicates_exist'] = it[4]['replicates_exist'] - fmeta['multiple_groups'] = it[4]['multiple_groups'] - [ fmeta, it[2], it[5] ] } - .set { ch_ip_bam } - - params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" - SUBREAD_FEATURECOUNTS ( - ch_ip_bam, - params.modules['subread_featurecounts'] - ) - ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) - - // - // DESEQ2_FEATURECOUNTS ( - // params.modules['deseq2_featurecounts'] - // ) - // ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - - } - - /* - * Create IGV session - */ - IGV ( - ch_fasta, - UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - params.modules['ucsc_bedgraphtobigwig'], - params.modules['macs2_callpeak'], - params.modules['macs2_consensus'], - params.modules['igv'] - ) - - /* - * Pipeline reporting - */ - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect(), - params.modules['get_software_versions'] - ) - - OUTPUT_DOCUMENTATION ( - ch_output_docs, - ch_output_docs_images, - params.modules['output_documentation'] - ) - - /* - * MultiQC - */ - workflow_summary = Schema.params_mqc_summary(summary) - ch_workflow_summary = Channel.value(workflow_summary) - params.modules['multiqc'].publish_dir += "/$peakType" - MULTIQC ( - ch_multiqc_config, - ch_multiqc_custom_config.collect().ifEmpty([]), - GET_SOFTWARE_VERSIONS.out.yaml.collect(), - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - - FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - - MAP_BWA_MEM.out.stats.collect{it[1]}, - MAP_BWA_MEM.out.flagstat.collect{it[1]}, - MAP_BWA_MEM.out.idxstats.collect{it[1]}, - - MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), - - BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), - PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), - - PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - - MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), - // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - - params.modules['multiqc'] - ) + //ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index + + //BWA_INDEX ( ch_fasta, { args : "-a bwtsw", publish_dir: "genome/bwa_index" } ) + def file_map = [ann:'', bwt:'test'] + //println(file_map) + //println(file_map ?: null) + def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: file_map] + //def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: "test"] + BWA_INDEX ( ch_fasta, index_options ) + + // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } + // + // MAKE_GENOME_FILTER ( + // GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, + // ch_blacklist.ifEmpty([]), + // params.modules['make_genome_filter'] + // ) + // ch_software_versions = Channel.empty() + // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) + // + // /* + // * Read QC & trimming + // */ + // nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' + // params.modules['trimgalore'].args += nextseq + // FASTQC_TRIMGALORE ( + // INPUT_CHECK.out.reads, + // params.skip_fastqc, + // params.skip_trimming, + // params.modules['fastqc'], + // params.modules['trimgalore'] + // ) + // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) + // + // /* + // * Map reads & BAM QC + // */ + // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + // params.modules['bwa_mem'].args += score + // MAP_BWA_MEM ( + // FASTQC_TRIMGALORE.out.reads, + // ch_index, + // ch_fasta, + // params.modules['bwa_mem'], + // params.modules['samtools_sort_lib'] + // ) + // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) + // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) + // + // /* + // * Merge resequenced BAM files + // */ + // MAP_BWA_MEM + // .out + // .bam + // .map { + // meta, bam -> + // fmeta = meta.findAll { it.key != 'read_group' } + // fmeta.id = fmeta.id.split('_')[0..-2].join('_') + // [ fmeta, bam ] } + // .groupTuple(by: [0]) + // .map { it -> [ it[0], it[1].flatten() ] } + // .set { ch_sort_bam } + // + // PICARD_MERGESAMFILES ( + // ch_sort_bam, + // params.modules['picard_mergesamfiles'] + // ) + // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) + // + // /* + // * Mark duplicates & filter BAM files + // */ + // MARK_DUPLICATES_PICARD ( + // PICARD_MERGESAMFILES.out.bam, + // params.modules['picard_markduplicates'], + // params.modules['samtools_sort_merged_lib'] + // ) + // + // // Fix getting name sorted BAM here for PE/SE + // BAM_CLEAN ( + // MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), + // MAKE_GENOME_FILTER.out.bed.collect(), + // ch_bamtools_filter_se_config, + // ch_bamtools_filter_pe_config, + // params.modules['bam_filter'], + // params.modules['bam_remove_orphans'], + // params.modules['samtools_sort_filter'] + // ) + // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) + // + // /* + // * Post alignment QC + // */ + // PICARD_COLLECTMULTIPLEMETRICS ( + // BAM_CLEAN.out.bam, + // ch_fasta, + // params.modules['picard_collectmultiplemetrics'] + // ) + // + // PRESEQ_LCEXTRAP ( + // BAM_CLEAN.out.bam, + // params.modules['preseq_lcextrap'] + // ) + // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + // + // PHANTOMPEAKQUALTOOLS ( + // BAM_CLEAN.out.bam, + // params.modules['phantompeakqualtools'] + // ) + // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + // + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + // PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + // ch_spp_nsc_header, + // ch_spp_rsc_header, + // ch_spp_correlation_header, + // params.modules['multiqc_custom_phantompeakqualtools'] + // ) + // + // /* + // * Coverage tracks + // */ + // BEDTOOLS_GENOMECOV ( + // BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), + // params.modules['bedtools_genomecov'] + // ) + // + // UCSC_BEDRAPHTOBIGWIG ( + // BEDTOOLS_GENOMECOV.out.bedgraph, + // GET_CHROM_SIZES.out.sizes, + // params.modules['ucsc_bedgraphtobigwig'] + // ) + // ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) + // + // /* + // * Coverage plots + // */ + // DEEPTOOLS_COMPUTEMATRIX ( + // UCSC_BEDRAPHTOBIGWIG.out.bigwig, + // ch_gene_bed, + // params.modules['deeptools_computematrix'] + // ) + // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) + // + // DEEPTOOLS_PLOTPROFILE ( + // DEEPTOOLS_COMPUTEMATRIX.out.matrix, + // params.modules['deeptools_plotprofile'] + // ) + // + // DEEPTOOLS_PLOTHEATMAP ( + // DEEPTOOLS_COMPUTEMATRIX.out.matrix, + // params.modules['deeptools_plotheatmap'] + // ) + // + // /* + // * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // */ + // BAM_CLEAN + // .out + // .bam + // .join ( BAM_CLEAN.out.bai, by: [0] ) + // .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } + // .set { ch_control_bam_bai } + // + // BAM_CLEAN + // .out + // .bam + // .join ( BAM_CLEAN.out.bai, by: [0] ) + // .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } + // .combine(ch_control_bam_bai, by: 0) + // .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + // .set { ch_ip_control_bam_bai } + // + // /* + // * plotFingerprint for IP and control together + // */ + // params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" + // DEEPTOOLS_PLOTFINGERPRINT ( + // ch_ip_control_bam_bai, + // params.modules['deeptools_plotfingerprint'] + // ) + // + // peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + // if (params.macs_gsize) { + // + // /* + // * Call peaks + // */ + // broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" + // pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' + // fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' + // pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + // params.modules['macs2_callpeak'].publish_dir += "/$peakType" + // params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" + // + // // Create channel: [ val(meta), ip_bam, control_bam ] + // ch_ip_control_bam_bai + // .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + // .set { ch_ip_control_bam } + // + // MACS2_CALLPEAK ( + // ch_ip_control_bam, + // params.macs_gsize, + // params.modules['macs2_callpeak'] + // ) + // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + // + // ch_ip_control_bam + // .join(MACS2_CALLPEAK.out.peak, by: [0]) + // .map { it -> [ it[0], it[1], it[3] ] } + // .set { ch_ip_peak } + // FRIP_SCORE ( + // ch_ip_peak, + // params.modules['frip_score'] + // ) + // + // ch_ip_peak + // .join(FRIP_SCORE.out.txt, by: [0]) + // .map { it -> [ it[0], it[2], it[3] ] } + // .set { ch_ip_peak_frip } + // MULTIQC_CUSTOM_PEAKS ( + // ch_ip_peak_frip, + // ch_peak_count_header, + // ch_frip_score_header, + // params.modules['multiqc_custom_peaks'] + // ) + // + // params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" + // PLOT_MACS2_QC ( + // MACS2_CALLPEAK.out.peak.collect{it[1]}, + // params.modules['plot_macs2_qc'] + // ) + // + // params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" + // HOMER_ANNOTATEPEAKS_MACS2 ( + // MACS2_CALLPEAK.out.peak, + // ch_fasta, + // ch_gtf, + // params.modules['homer_annotatepeaks_macs2'] + // ) + // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) + // + // params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" + // PLOT_HOMER_ANNOTATEPEAKS ( + // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + // ch_peak_annotation_header, + // "_peaks.annotatePeaks.txt", + // params.modules['plot_homer_annotatepeaks'] + // ) + // + // // Create channel: [ meta , [ peaks ] ] + // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + // MACS2_CALLPEAK + // .out + // .peak + // .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + // .groupTuple() + // .map { + // antibody, groups, peaks -> + // [ antibody, + // groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + // peaks ] } + // .map { + // antibody, groups, peaks -> + // def meta = [:] + // meta.id = antibody + // meta.multiple_groups = groups.size() > 1 + // meta.replicates_exist = groups.max { groups.value }.value > 1 + // [ meta, peaks ] } + // .set { ch_antibody_peaks } + // + // params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" + // MACS2_CONSENSUS ( + // ch_antibody_peaks, + // params.modules['macs2_consensus'] + // ) + // + // params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" + // HOMER_ANNOTATEPEAKS_CONSENSUS ( + // MACS2_CONSENSUS.out.bed, + // ch_fasta, + // ch_gtf, + // params.modules['homer_annotatepeaks_consensus'] + // ) + // // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + // + // // Create channel: [ val(meta), ip_bam ] + // MACS2_CONSENSUS + // .out + // .saf + // .map { meta, saf -> [ meta.id, meta, saf ] } + // .set { ch_ip_saf } + // + // ch_ip_control_bam + // .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + // .combine(ch_ip_saf) + // .map { + // it -> + // fmeta = it[1] + // fmeta['replicates_exist'] = it[4]['replicates_exist'] + // fmeta['multiple_groups'] = it[4]['multiple_groups'] + // [ fmeta, it[2], it[5] ] } + // .set { ch_ip_bam } + // + // params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" + // SUBREAD_FEATURECOUNTS ( + // ch_ip_bam, + // params.modules['subread_featurecounts'] + // ) + // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + // + // // + // // DESEQ2_FEATURECOUNTS ( + // // params.modules['deseq2_featurecounts'] + // // ) + // // ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // // ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + // + // } + // + // /* + // * Create IGV session + // */ + // IGV ( + // ch_fasta, + // UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + // params.modules['ucsc_bedgraphtobigwig'], + // params.modules['macs2_callpeak'], + // params.modules['macs2_consensus'], + // params.modules['igv'] + // ) + // + // /* + // * Pipeline reporting + // */ + // GET_SOFTWARE_VERSIONS ( + // ch_software_versions.map { it }.collect(), + // params.modules['get_software_versions'] + // ) + // + // OUTPUT_DOCUMENTATION ( + // ch_output_docs, + // ch_output_docs_images, + // params.modules['output_documentation'] + // ) + // + // /* + // * MultiQC + // */ + // workflow_summary = Schema.params_mqc_summary(summary) + // ch_workflow_summary = Channel.value(workflow_summary) + // params.modules['multiqc'].publish_dir += "/$peakType" + // MULTIQC ( + // ch_multiqc_config, + // ch_multiqc_custom_config.collect().ifEmpty([]), + // GET_SOFTWARE_VERSIONS.out.yaml.collect(), + // ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + // + // FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + // FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + // FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + // + // MAP_BWA_MEM.out.stats.collect{it[1]}, + // MAP_BWA_MEM.out.flagstat.collect{it[1]}, + // MAP_BWA_MEM.out.idxstats.collect{it[1]}, + // + // MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + // + // BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), + // BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), + // BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), + // PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + // + // PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + // DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + // DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + // PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), + // + // MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), + // PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + // SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + // + // params.modules['multiqc'] + // ) } //////////////////////////////////////////////////// diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index bade7c393..e7f455e0c 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -1,52 +1,20 @@ -def SOFTWARE = 'bwa' - -// Function to initialise default values and to generate a Groovy Map of module options -def init_options (Map args, String publish_dir) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.suffix = args.suffix ?: '' - options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir - options.publish_files = args.publish_files ?: null - options.publish_by_id = args.publish_by_id ?: false - return options -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' -// Function to publish module results - // if publish_files == null - all files are published - // if publish_files == Map [:] - no files are published - // if publish_files == Map [ext:path] - Only files that end with "ext" are published to "path" appended to output directory -def publish_options ( filename, publish_files ) { - if (publish_files instanceof Map) { - if (!publish_files.isEmpty()) { - if (!filename.endsWith('.version.txt')) { - filename - // Loop through extensions and paths here - } - } - } - else { - if (!filename.endsWith('.version.txt')) filename - } -} +def SOFTWARE = 'bwa' process BWA_INDEX { tag "$fasta" label 'process_high' - //if (module_options.publish_files) { - publishDir "${params.outdir}/${options.publish_dir}", - mode: params.publish_dir_mode, - saveAs: { filename -> publish_options( filename, module_options.publish_files ) } - //} + publishDir "${params.outdir}/${options.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" conda (params.conda ? "bioconda::bwa=0.7.17" : null) - //echo true - //cache false - input: path fasta val options @@ -56,10 +24,9 @@ process BWA_INDEX { path "*.version.txt", emit: version script: - def module_options = init_options(options, SOFTWARE) + def module_options = initOptions(options, SOFTWARE) """ - echo $module_options - bwa index $options.args $fasta + bwa index $module_options.args $fasta echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } From 40138f451bc2ca6f0d7b12b654002240223c946f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 16:15:30 +0100 Subject: [PATCH 118/538] Add general module functions --- modules/nf-core/software/functions.nf | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 modules/nf-core/software/functions.nf diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf new file mode 100644 index 000000000..40f226d00 --- /dev/null +++ b/modules/nf-core/software/functions.nf @@ -0,0 +1,38 @@ +/* + * Function to initialise default values and to generate a Groovy Map of module options + */ +def initOptions(Map args, String publish_dir) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Function to save/publish module results + * if publish_files == null : All files are published + * if publish_files == Map [:] : No files are published + * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) + */ +def saveFiles(filename, options, publish_dir) { + if (!filename.endsWith('.version.txt')) { + def publish_files = initOptions(options, publish_dir).publish_files + if (publish_files instanceof Map) { + for (ext in publish_files) { + if (filename.endsWith(ext.key)) { + if (ext.value) { + return "${ext.value}/$filename" + } else { + return filename + } + } + } + } else { + return filename + } + } +} From d46f07761e2fe6d4659e6d0f51b0def00e4116bb Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 17:09:06 +0100 Subject: [PATCH 119/538] Update publishdir logic --- modules/nf-core/software/bwa_index.nf | 4 ++-- modules/nf-core/software/bwa_mem.nf | 15 ++++++++------- .../nf-core/software/deeptools_computematrix.nf | 13 +++++++------ .../software/deeptools_plotfingerprint.nf | 13 +++++++------ .../nf-core/software/deeptools_plotheatmap.nf | 13 +++++++------ .../nf-core/software/deeptools_plotprofile.nf | 13 +++++++------ modules/nf-core/software/fastqc.nf | 15 ++++++++------- modules/nf-core/software/homer_annotatepeaks.nf | 13 +++++++------ modules/nf-core/software/macs2_callpeak.nf | 16 +++++++--------- modules/nf-core/software/phantompeakqualtools.nf | 11 ++++++----- .../software/picard_collectmultiplemetrics.nf | 13 +++++++------ .../nf-core/software/picard_markduplicates.nf | 13 +++++++------ modules/nf-core/software/picard_mergesamfiles.nf | 13 +++++++------ modules/nf-core/software/preseq_lcextrap.nf | 8 ++++---- modules/nf-core/software/samtools_flagstat.nf | 8 ++++---- modules/nf-core/software/samtools_idxstats.nf | 8 ++++---- modules/nf-core/software/samtools_index.nf | 8 ++++---- modules/nf-core/software/samtools_sort.nf | 13 +++++++------ modules/nf-core/software/samtools_stats.nf | 8 ++++---- .../nf-core/software/subread_featurecounts.nf | 13 +++++++------ modules/nf-core/software/trimgalore.nf | 15 ++++++++------- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 11 ++++++----- 22 files changed, 135 insertions(+), 122 deletions(-) diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index e7f455e0c..53371e411 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -24,9 +24,9 @@ process BWA_INDEX { path "*.version.txt", emit: version script: - def module_options = initOptions(options, SOFTWARE) + def ioptions = initOptions(options, SOFTWARE) """ - bwa index $module_options.args $fasta + bwa index $ioptions.args $fasta echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 8f4e826ba..1110f9f75 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'bwa' process BWA_MEM { @@ -5,10 +8,7 @@ process BWA_MEM { label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" @@ -26,16 +26,17 @@ process BWA_MEM { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" rg = meta.read_group ? "-R ${meta.read_group}" : "" """ bwa mem \\ - $options.args \\ + $ioptions.args \\ $rg \\ -t $task.cpus \\ $fasta \\ $reads \\ - | samtools view $options.args2 -@ $task.cpus -bS -o ${prefix}.bam - + | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt """ diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 895afeb21..f82752d5d 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'deeptools' process DEEPTOOLS_COMPUTEMATRIX { @@ -5,10 +8,7 @@ process DEEPTOOLS_COMPUTEMATRIX { label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -26,10 +26,11 @@ process DEEPTOOLS_COMPUTEMATRIX { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ computeMatrix \\ - $options.args \\ + $ioptions.args \\ --regionsFileName $bed \\ --scoreFileName $bigwig \\ --outFileName ${prefix}.computeMatrix.mat.gz \\ diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 0b0663a51..2bf044a9d 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTFINGERPRINT { @@ -5,10 +8,7 @@ process DEEPTOOLS_PLOTFINGERPRINT { label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -26,11 +26,12 @@ process DEEPTOOLS_PLOTFINGERPRINT { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ plotFingerprint \\ - $options.args \\ + $ioptions.args \\ $extend \\ --bamfiles ${bams.join(' ')} \\ --plotFile ${prefix}.plotFingerprint.pdf \\ diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 5ded02db2..da7762092 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTHEATMAP { @@ -5,10 +8,7 @@ process DEEPTOOLS_PLOTHEATMAP { label 'process_low' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -25,10 +25,11 @@ process DEEPTOOLS_PLOTHEATMAP { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotHeatmap \\ - $options.args \\ + $ioptions.args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 3932e0e66..b477b6758 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'deeptools' process DEEPTOOLS_PLOTPROFILE { @@ -5,10 +8,7 @@ process DEEPTOOLS_PLOTPROFILE { label 'process_low' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -25,10 +25,11 @@ process DEEPTOOLS_PLOTPROFILE { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotProfile \\ - $options.args \\ + $ioptions.args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index 8d5f49825..d5db7b00b 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'fastqc' process FASTQC { @@ -5,10 +8,7 @@ process FASTQC { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" @@ -26,18 +26,19 @@ process FASTQC { script: // Add soft-links to original FastQs for consistent naming in pipeline - prefix = options.suffix ? "${meta.id}.${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz + fastqc $ioptions.args --threads $task.cpus ${prefix}.fastq.gz fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + fastqc $ioptions.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index c65a9ea49..d501f5aab 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'homer' def VERSION = '4.11' @@ -6,10 +9,7 @@ process HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" @@ -27,12 +27,13 @@ process HOMER_ANNOTATEPEAKS { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ annotatePeaks.pl \\ $peak \\ $fasta \\ - $options.args \\ + $ioptions.args \\ -gtf $gtf \\ -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 20e2a93f0..2cd311918 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'macs2' process MACS2_CALLPEAK { @@ -5,10 +8,7 @@ process MACS2_CALLPEAK { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" @@ -29,13 +29,14 @@ process MACS2_CALLPEAK { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" format = meta.single_end ? 'BAM' : 'BAMPE' control = controlbam ? "--control $controlbam" : '' """ macs2 \\ callpeak \\ - $options.args \\ + $ioptions.args \\ --gsize $macs2_gsize \\ --format $format \\ --name $prefix \\ @@ -45,6 +46,3 @@ process MACS2_CALLPEAK { macs2 --version | sed -e "s/macs2 //g" > ${SOFTWARE}.version.txt """ } -// cat ${ip}_peaks.${PEAK_TYPE} | wc -l | awk -v OFS='\t' '{ print "${ip}", \$1 }' | cat $peak_count_header - > ${ip}_peaks.count_mqc.tsv -// -// find * -type f -name "*.${PEAK_TYPE}" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/"{}"\\t0,0,178" \\; > ${ip}_peaks.igv.txt diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index beaf754b0..d3332cd13 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'phantompeakqualtools' def VERSION = '1.2.2' @@ -6,10 +9,7 @@ process PHANTOMPEAKQUALTOOLS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" @@ -27,7 +27,8 @@ process PHANTOMPEAKQUALTOOLS { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 80e0eacc2..fd1661bc7 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'picard' process PICARD_COLLECTMULTIPLEMETRICS { @@ -5,10 +8,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -26,7 +26,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -37,7 +38,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard \\ -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ - $options.args \\ + $ioptions.args \\ INPUT=$bam \\ OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 13abdd901..9d01ab7f9 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'picard' process PICARD_MARKDUPLICATES { @@ -5,10 +8,7 @@ process PICARD_MARKDUPLICATES { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -25,7 +25,8 @@ process PICARD_MARKDUPLICATES { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -36,7 +37,7 @@ process PICARD_MARKDUPLICATES { picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ - $options.args \\ + $ioptions.args \\ INPUT=$bam \\ OUTPUT=${prefix}.bam \\ METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 5e81b5a52..c02adb8a2 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'picard' process PICARD_MERGESAMFILES { @@ -5,10 +8,7 @@ process PICARD_MERGESAMFILES { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -24,7 +24,8 @@ process PICARD_MERGESAMFILES { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" bam_files = bams.sort() def avail_mem = 3 if (!task.memory) { @@ -37,7 +38,7 @@ process PICARD_MERGESAMFILES { picard \\ -Xmx${avail_mem}g \\ MergeSamFiles \\ - $options.args \\ + $ioptions.args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ OUTPUT=${prefix}.bam echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index b5189911d..2fbfc745b 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'preseq' process PRESEQ_LCEXTRAP { @@ -6,10 +9,7 @@ process PRESEQ_LCEXTRAP { label 'error_ignore' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index b7f066653..c277b9f40 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -1,13 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'samtools' process SAMTOOLS_FLAGSTAT { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 2462c0a21..8caf272eb 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -1,13 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'samtools' process SAMTOOLS_IDXSTATS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 7baafd525..fb737e9ec 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -1,13 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'samtools' process SAMTOOLS_INDEX { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 8e665bb17..577378bdf 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'samtools' process SAMTOOLS_SORT { @@ -5,10 +8,7 @@ process SAMTOOLS_SORT { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -24,9 +24,10 @@ process SAMTOOLS_SORT { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt """ } diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 1a8d84d07..54d485ca4 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -1,13 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'samtools' process SAMTOOLS_STATS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 36d38da01..5d87630c8 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'subread' process SUBREAD_FEATURECOUNTS { @@ -5,10 +8,7 @@ process SUBREAD_FEATURECOUNTS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" @@ -25,11 +25,12 @@ process SUBREAD_FEATURECOUNTS { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-p' """ featureCounts \\ - $options.args \\ + $ioptions.args \\ $pe \\ -T $task.cpus \\ -a $annotation \\ diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 130bc90ee..8f538f4f4 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'trimgalore' process TRIMGALORE { @@ -5,10 +8,7 @@ process TRIMGALORE { label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" @@ -45,12 +45,13 @@ process TRIMGALORE { tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz trim_galore \\ - $options.args \\ + $ioptions.args \\ --cores $cores \\ --gzip \\ $c_r1 \\ @@ -63,7 +64,7 @@ process TRIMGALORE { [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz trim_galore \\ - $options.args \\ + $ioptions.args \\ --cores $cores \\ --paired \\ --gzip \\ diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 43b9b16ce..09863f2ae 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + def SOFTWARE = 'ucsc' def VERSION = '377' @@ -6,10 +9,7 @@ process UCSC_BEDRAPHTOBIGWIG { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" @@ -26,7 +26,8 @@ process UCSC_BEDRAPHTOBIGWIG { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, SOFTWARE) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig echo $VERSION > ${SOFTWARE}.version.txt From d85e3064801e0fa273456a4d6d653fd654905478 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 17:09:27 +0100 Subject: [PATCH 120/538] Update modules config --- conf/modules.config | 168 ++++++++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7131e68f4..f21bdca23 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -4,169 +4,169 @@ * ------------------------------------------------- * * Available keys to override module options: - * args = Additional arguments appended to command in module. - * args2 = Second set of arguments appended to command in module (multi-tool modules). - * publish_by_id = Publish results in separate folders by meta.id value. - * publish_dir = Directory to publish results. - * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results - * for a particular file extension. The value of "directory" is appended to the standard - * "publish_dir" path as defined above. - * suffix = File name suffix for output files + * args = Additional arguments appended to command in module. + * args2 = Second set of arguments appended to command in module (multi-tool modules). + * publish_by_id = Publish results in separate folders by meta.id value. + * publish_dir = Directory to publish results. + * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results + * for a particular file extension. The value of "directory" is appended to the standard + * "publish_dir" path as defined above. + * suffix = File name suffix for output files */ params { modules { 'samplesheet_check' { - publish_dir = "pipeline_info" + publish_dir = "pipeline_info" } 'fastqc' { - args = "--quiet" + args = "--quiet" } 'trimgalore' { - args = "--fastqc" + args = "--fastqc" } 'bwa_index' { - args = "-a bwtsw" - publish_dir = "genome/bwa_index" + args = "-a bwtsw" + publish_dir = "genome/bwa_index" } 'gtf2bed' { - publish_dir = "genome" + publish_dir = "genome" } 'make_genome_filter' { - publish_dir = "genome" + publish_dir = "genome" } 'get_chrom_sizes' { - publish_dir = "genome" + publish_dir = "genome" } 'bwa_mem' { - args = "-M" - args2 = "-h -F 0x0100 -O BAM" - publish_dir = "bwa/library" - suffix = ".Lb" + args = "-M" + args2 = "-h -F 0x0100 -O BAM" + publish_dir = "bwa/library" + suffix = ".Lb" } 'samtools_sort_lib' { - publish_dir = "bwa/library" - suffix = ".Lb.sorted" + publish_dir = "bwa/library" + suffix = ".Lb.sorted" } 'picard_mergesamfiles' { - args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.sorted" + args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.sorted" } 'picard_markduplicates' { - args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.mkD.sorted" + args = "ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" } 'samtools_sort_merged_lib' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.mkD.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" } 'bam_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.flT.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.flT.sorted" } 'bam_remove_orphans' { - args = "--only_fr_pairs" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN" + args = "--only_fr_pairs" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN" } 'samtools_sort_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN.sorted" } 'picard_collectmultiplemetrics' { - args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary/picard_metrics" - suffix = ".mLb.clN.sorted" + args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary/picard_metrics" + suffix = ".mLb.clN.sorted" } 'preseq_lcextrap' { - args = "-verbose -bam -seed 1" - publish_dir = "bwa/mergedLibrary/preseq" - suffix = ".mLb.clN" + args = "-verbose -bam -seed 1" + publish_dir = "bwa/mergedLibrary/preseq" + suffix = ".mLb.clN" } 'phantompeakqualtools' { - publish_dir = "bwa/mergedLibrary/phantompeakqualtools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/phantompeakqualtools" + suffix = ".mLb.clN" } 'multiqc_custom_phantompeakqualtools' { - publish_files = [:] + publish_files = [:] } 'bedtools_genomecov' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" } 'ucsc_bedgraphtobigwig' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" } 'deeptools_computematrix' { - args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotprofile' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotheatmap' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotfingerprint' { - args = "--skipZeros" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + args = "--skipZeros" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'macs2_callpeak' { - args = "--keep-dup all" - publish_dir = "bwa/mergedLibrary/macs2" + args = "--keep-dup all" + publish_dir = "bwa/mergedLibrary/macs2" } 'frip_score' { - args = "-bed -c -f 0.20" - publish_files = [:] + args = "-bed -c -f 0.20" + publish_files = [:] } 'multiqc_custom_peaks' { - publish_files = [:] + publish_files = [:] } 'plot_macs2_qc' { - args = "-o ./ -p macs2_peak" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-o ./ -p macs2_peak" + publish_dir = "bwa/mergedLibrary/macs2" } 'homer_annotatepeaks_macs2' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - suffix = "_peaks" + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + suffix = "_peaks" } 'plot_homer_annotatepeaks' { - args = "-o ./ -p macs2_annotatePeaks" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-o ./ -p macs2_annotatePeaks" + publish_dir = "bwa/mergedLibrary/macs2" } 'macs2_consensus' { - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true } 'homer_annotatepeaks_consensus' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true, - suffix = ".consensus_peaks" + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true + suffix = ".consensus_peaks" } 'subread_featurecounts' { - args = "-F SAF -O --fracOverlap 0.2" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-F SAF -O --fracOverlap 0.2" + publish_dir = "bwa/mergedLibrary/macs2" } 'deseq2_featurecounts' { - publish_dir = "bwa/mergedLibrary/macs2" + publish_dir = "bwa/mergedLibrary/macs2" } 'igv' { - publish_dir = "igv" + publish_dir = "igv" } 'get_software_versions' { - publish_dir = "pipeline_info" + publish_dir = "pipeline_info" } 'output_documentation' { - publish_dir = "pipeline_info" + publish_dir = "pipeline_info" } } } From 61507397d01b09f6b8b20f9b80e4769aaef6ddc5 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 17:09:38 +0100 Subject: [PATCH 121/538] Comment out for testing --- main.nf | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/main.nf b/main.nf index c13a5fd8b..605c0f7d9 100755 --- a/main.nf +++ b/main.nf @@ -192,15 +192,7 @@ workflow { /* * Prepare genome files */ - //ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - - //BWA_INDEX ( ch_fasta, { args : "-a bwtsw", publish_dir: "genome/bwa_index" } ) - def file_map = [ann:'', bwt:'test'] - //println(file_map) - //println(file_map ?: null) - def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: file_map] - //def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: "test"] - BWA_INDEX ( ch_fasta, index_options ) + ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } // From 8c4a41fc83eec9485076a3983082f3658474dde3 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 17:41:35 +0100 Subject: [PATCH 122/538] Use task.process --- main.nf | 10 +++++++++- modules/nf-core/software/bwa_index.nf | 9 ++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 605c0f7d9..c13a5fd8b 100755 --- a/main.nf +++ b/main.nf @@ -192,7 +192,15 @@ workflow { /* * Prepare genome files */ - ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index + //ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index + + //BWA_INDEX ( ch_fasta, { args : "-a bwtsw", publish_dir: "genome/bwa_index" } ) + def file_map = [ann:'', bwt:'test'] + //println(file_map) + //println(file_map ?: null) + def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: file_map] + //def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: "test"] + BWA_INDEX ( ch_fasta, index_options ) // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } // diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index 53371e411..c5a92e529 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'bwa' - process BWA_INDEX { tag "$fasta" label 'process_high' publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" @@ -24,9 +22,10 @@ process BWA_INDEX { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) """ bwa index $ioptions.args $fasta - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt """ } From 00f1f69e51f2d5a278f95550b970b773da0a402f Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 18:05:29 +0100 Subject: [PATCH 123/538] Use task.process everywhere --- modules/nf-core/software/bwa_mem.nf | 9 ++++----- modules/nf-core/software/deeptools_computematrix.nf | 9 ++++----- .../nf-core/software/deeptools_plotfingerprint.nf | 11 +++++------ modules/nf-core/software/deeptools_plotheatmap.nf | 9 ++++----- modules/nf-core/software/deeptools_plotprofile.nf | 9 ++++----- modules/nf-core/software/fastqc.nf | 11 +++++------ modules/nf-core/software/homer_annotatepeaks.nf | 8 ++++---- modules/nf-core/software/macs2_callpeak.nf | 9 ++++----- modules/nf-core/software/phantompeakqualtools.nf | 8 ++++---- .../software/picard_collectmultiplemetrics.nf | 9 ++++----- modules/nf-core/software/picard_markduplicates.nf | 9 ++++----- modules/nf-core/software/picard_mergesamfiles.nf | 11 +++++------ modules/nf-core/software/preseq_lcextrap.nf | 12 ++++++------ modules/nf-core/software/samtools_flagstat.nf | 7 +++---- modules/nf-core/software/samtools_idxstats.nf | 7 +++---- modules/nf-core/software/samtools_index.nf | 7 +++---- modules/nf-core/software/samtools_sort.nf | 11 +++++------ modules/nf-core/software/samtools_stats.nf | 7 +++---- modules/nf-core/software/subread_featurecounts.nf | 11 +++++------ modules/nf-core/software/trimgalore.nf | 11 +++++------ modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 8 ++++---- 21 files changed, 88 insertions(+), 105 deletions(-) diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 1110f9f75..0a749e402 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'bwa' - process BWA_MEM { tag "$meta.id" label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" @@ -26,7 +24,8 @@ process BWA_MEM { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" rg = meta.read_group ? "-R ${meta.read_group}" : "" """ @@ -38,6 +37,6 @@ process BWA_MEM { $reads \\ | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${SOFTWARE}.version.txt + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index f82752d5d..86be86dec 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'deeptools' - process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -26,7 +24,8 @@ process DEEPTOOLS_COMPUTEMATRIX { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ computeMatrix \\ @@ -37,6 +36,6 @@ process DEEPTOOLS_COMPUTEMATRIX { --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ --numberOfProcessors $task.cpus - computeMatrix --version | sed -e "s/computeMatrix //g" > ${SOFTWARE}.version.txt + computeMatrix --version | sed -e "s/computeMatrix //g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 2bf044a9d..9326dd586 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -1,15 +1,13 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'deeptools' - process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } - + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -26,7 +24,8 @@ process DEEPTOOLS_PLOTFINGERPRINT { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ @@ -39,6 +38,6 @@ process DEEPTOOLS_PLOTFINGERPRINT { --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ --numberOfProcessors $task.cpus - plotFingerprint --version | sed -e "s/plotFingerprint //g" > ${SOFTWARE}.version.txt + plotFingerprint --version | sed -e "s/plotFingerprint //g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index da7762092..68dcfcc90 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'deeptools' - process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -25,7 +23,8 @@ process DEEPTOOLS_PLOTHEATMAP { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotHeatmap \\ @@ -34,6 +33,6 @@ process DEEPTOOLS_PLOTHEATMAP { --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab - plotHeatmap --version | sed -e "s/plotHeatmap //g" > ${SOFTWARE}.version.txt + plotHeatmap --version | sed -e "s/plotHeatmap //g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index b477b6758..457b55a38 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'deeptools' - process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -25,7 +23,8 @@ process DEEPTOOLS_PLOTPROFILE { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotProfile \\ @@ -34,6 +33,6 @@ process DEEPTOOLS_PLOTPROFILE { --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab - plotProfile --version | sed -e "s/plotProfile //g" > ${SOFTWARE}.version.txt + plotProfile --version | sed -e "s/plotProfile //g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index d5db7b00b..e3c8f0d04 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'fastqc' - process FASTQC { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" @@ -26,20 +24,21 @@ process FASTQC { script: // Add soft-links to original FastQs for consistent naming in pipeline - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz fastqc $ioptions.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz fastqc $ioptions.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${SOFTWARE}.version.txt + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt """ } } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index d501f5aab..0697dac94 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -1,7 +1,6 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'homer' def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { @@ -9,7 +8,7 @@ process HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" @@ -27,7 +26,8 @@ process HOMER_ANNOTATEPEAKS { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ annotatePeaks.pl \\ @@ -38,6 +38,6 @@ process HOMER_ANNOTATEPEAKS { -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt - echo $VERSION > ${SOFTWARE}.version.txt + echo $VERSION > ${software}.version.txt """ } diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 2cd311918..dcd89ea63 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'macs2' - process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" @@ -29,7 +27,8 @@ process MACS2_CALLPEAK { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" format = meta.single_end ? 'BAM' : 'BAMPE' control = controlbam ? "--control $controlbam" : '' @@ -43,6 +42,6 @@ process MACS2_CALLPEAK { --treatment $ipbam \\ $control - macs2 --version | sed -e "s/macs2 //g" > ${SOFTWARE}.version.txt + macs2 --version | sed -e "s/macs2 //g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index d3332cd13..d3e9bee54 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -1,7 +1,6 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'phantompeakqualtools' def VERSION = '1.2.2' process PHANTOMPEAKQUALTOOLS { @@ -9,7 +8,7 @@ process PHANTOMPEAKQUALTOOLS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" @@ -27,11 +26,12 @@ process PHANTOMPEAKQUALTOOLS { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus - echo $VERSION > ${SOFTWARE}.version.txt + echo $VERSION > ${software}.version.txt """ } diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index fd1661bc7..084dde433 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'picard' - process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -26,7 +24,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { @@ -43,6 +42,6 @@ process PICARD_COLLECTMULTIPLEMETRICS { OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta - echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt + echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 9d01ab7f9..deee9411f 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'picard' - process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -25,7 +23,8 @@ process PICARD_MARKDUPLICATES { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { @@ -42,6 +41,6 @@ process PICARD_MARKDUPLICATES { OUTPUT=${prefix}.bam \\ METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt - echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt + echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index c02adb8a2..78522731c 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'picard' - process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -24,7 +22,8 @@ process PICARD_MERGESAMFILES { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" bam_files = bams.sort() def avail_mem = 3 @@ -41,12 +40,12 @@ process PICARD_MERGESAMFILES { $ioptions.args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ OUTPUT=${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt """ } else { """ ln -s ${bam_files[0]} ${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${SOFTWARE}.version.txt + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt """ } } diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 2fbfc745b..2fb445f7e 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -1,15 +1,13 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'preseq' - process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" @@ -26,17 +24,19 @@ process PRESEQ_LCEXTRAP { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pe' """ preseq \\ lc_extrap \\ - $options.args \\ + $ioptions.args \\ $pe \\ -output ${prefix}.ccurve.txt \\ $bam cp .command.err ${prefix}.command.log - echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${SOFTWARE}.version.txt + echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index c277b9f40..349612b33 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -1,13 +1,11 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'samtools' - process SAMTOOLS_FLAGSTAT { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -23,8 +21,9 @@ process SAMTOOLS_FLAGSTAT { path "*.version.txt", emit: version script: + def software = task.process.tokenize('_')[0].toLowerCase() """ samtools flagstat $bam > ${bam}.flagstat - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 8caf272eb..9eb578efd 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -1,13 +1,11 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'samtools' - process SAMTOOLS_IDXSTATS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -23,8 +21,9 @@ process SAMTOOLS_IDXSTATS { path "*.version.txt", emit: version script: + def software = task.process.tokenize('_')[0].toLowerCase() """ samtools idxstats $bam > ${bam}.idxstats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index fb737e9ec..95f28ebe2 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -1,13 +1,11 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'samtools' - process SAMTOOLS_INDEX { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -23,8 +21,9 @@ process SAMTOOLS_INDEX { path "*.version.txt", emit: version script: + def software = task.process.tokenize('_')[0].toLowerCase() """ samtools index $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 577378bdf..7aff6a57d 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -1,15 +1,13 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'samtools' - process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } - + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -24,10 +22,11 @@ process SAMTOOLS_SORT { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 54d485ca4..e30228e75 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -1,13 +1,11 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'samtools' - process SAMTOOLS_STATS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -23,8 +21,9 @@ process SAMTOOLS_STATS { path "*.version.txt", emit: version script: + def software = task.process.tokenize('_')[0].toLowerCase() """ samtools stats $bam > ${bam}.stats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 5d87630c8..5104b5d94 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,15 +1,13 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'subread' - process SUBREAD_FEATURECOUNTS { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } - + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" @@ -25,7 +23,8 @@ process SUBREAD_FEATURECOUNTS { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-p' """ @@ -37,6 +36,6 @@ process SUBREAD_FEATURECOUNTS { -o ${prefix}.featureCounts.txt \\ ${bams.join(' ')} - echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${SOFTWARE}.version.txt + echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${software}.version.txt """ } diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 8f538f4f4..e430ef738 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -1,14 +1,12 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'trimgalore' - process TRIMGALORE { tag "$meta.id" label 'process_high' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" @@ -45,7 +43,8 @@ process TRIMGALORE { tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ @@ -57,7 +56,7 @@ process TRIMGALORE { $c_r1 \\ $tpc_r1 \\ ${prefix}.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${SOFTWARE}.version.txt + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt """ } else { """ @@ -74,7 +73,7 @@ process TRIMGALORE { $tpc_r2 \\ ${prefix}_1.fastq.gz \\ ${prefix}_2.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${SOFTWARE}.version.txt + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt """ } } diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 09863f2ae..6f5126e5e 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -1,7 +1,6 @@ // Import generic module functions include { initOptions; saveFiles } from './functions' -def SOFTWARE = 'ucsc' def VERSION = '377' process UCSC_BEDRAPHTOBIGWIG { @@ -9,7 +8,7 @@ process UCSC_BEDRAPHTOBIGWIG { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, SOFTWARE) } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" @@ -26,10 +25,11 @@ process UCSC_BEDRAPHTOBIGWIG { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, SOFTWARE) + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig - echo $VERSION > ${SOFTWARE}.version.txt + echo $VERSION > ${software}.version.txt """ } From e7eabcfa438644564b491b1d06e69b018ce558af Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 18:37:56 +0100 Subject: [PATCH 124/538] Add in save files --- modules/local/process/bam_filter.nf | 11 ++++++----- modules/local/process/bam_remove_orphans.nf | 12 +++++++----- modules/local/process/bedtools_genomecov.nf | 14 +++++++------- modules/local/process/frip_score.nf | 14 +++++++------- modules/local/process/get_chrom_sizes.nf | 10 +++++----- modules/local/process/get_software_versions.nf | 12 ++++++------ modules/local/process/gtf2bed.nf | 7 ++++--- modules/local/process/igv.nf | 7 ++++--- modules/local/process/macs2_consensus.nf | 11 +++++++---- modules/local/process/make_genome_filter.nf | 12 ++++++------ modules/local/process/multiqc.nf | 11 ++++++----- modules/local/process/multiqc_custom_peaks.nf | 12 +++++++----- .../process/multiqc_custom_phantompeakqualtools.nf | 12 +++++++----- modules/local/process/output_documentation.nf | 7 ++++--- modules/local/process/plot_homer_annotatepeaks.nf | 11 +++++++---- modules/local/process/plot_macs2_qc.nf | 11 +++++++---- modules/local/process/samplesheet_check.nf | 7 ++++--- 17 files changed, 101 insertions(+), 80 deletions(-) diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index 7edfd3339..0d6ec5876 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Filter BAM file */ @@ -6,10 +9,7 @@ process BAM_FILTER { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -25,7 +25,8 @@ process BAM_FILTER { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, task.process.toLowerCase()) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' dup_params = params.keep_dups ? '' : '-F 0x0400' multimap_params = params.keep_multi_map ? '' : '-q 1' diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index 65b30d241..f17f0d1fa 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Remove orphan reads from paired-end BAM file */ @@ -6,9 +9,7 @@ process BAM_REMOVE_ORPHANS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -20,11 +21,12 @@ process BAM_REMOVE_ORPHANS { tuple val(meta), path("${prefix}.bam"), emit: bam script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def ioptions = initOptions(options, task.process.toLowerCase()) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam - bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $options.args + bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $ioptions.args """ } else { """ diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 5e60e76e5..115902c9f 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -1,14 +1,12 @@ -def SOFTWARE = 'bedtools' +// Import generic module functions +include { initOptions; saveFiles } from './functions' process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" @@ -25,7 +23,9 @@ process BEDTOOLS_GENOMECOV { path "*.version.txt", emit: version script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pc' extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' """ @@ -41,6 +41,6 @@ process BEDTOOLS_GENOMECOV { $extend \\ | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph - bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt """ } diff --git a/modules/local/process/frip_score.nf b/modules/local/process/frip_score.nf index 5ec357456..d5e382d78 100644 --- a/modules/local/process/frip_score.nf +++ b/modules/local/process/frip_score.nf @@ -1,12 +1,12 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + process FRIP_SCORE { tag "$meta.id" label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -18,10 +18,10 @@ process FRIP_SCORE { tuple val(meta), path("*.txt"), emit: txt script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" - + def ioptions = initOptions(options, task.process.tokenize('_')[0].toLowerCase()) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ - READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $options.args | awk -F '\t' '{sum += \$NF} END {print sum}') + READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $ioptions.args | awk -F '\t' '{sum += \$NF} END {print sum}') samtools flagstat $bam > ${bam}.flagstat grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt """ diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 9424b046e..a76e2cfdd 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -1,4 +1,5 @@ -def SOFTWARE = 'samtools' +// Import generic module functions +include { initOptions; saveFiles } from './functions' /* * Get chromosome sizes from a fasta file @@ -7,9 +8,7 @@ process GET_CHROM_SIZES { tag "$fasta" publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, "genome") } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -26,9 +25,10 @@ process GET_CHROM_SIZES { path "*.version.txt", emit: version script: + def software = 'samtools' """ samtools faidx $fasta cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${SOFTWARE}.version.txt + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt """ } diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index 3dff31d87..a097e9408 100644 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -1,13 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Parse software version numbers */ process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}/${options.publish_dir}", - mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.yaml')) null - else filename } + publishDir "${params.outdir}/${options.publish_dir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } input: path versions diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index a10b57102..0f2533773 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Convert GTF file to BED format */ @@ -6,9 +9,7 @@ process GTF2BED { label 'process_low' publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, "genome") } container "quay.io/biocontainers/perl:5.26.2" //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf index f7c7bae9b..0e95f7062 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/process/igv.nf @@ -1,12 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Create IGV session file */ process IGV { publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index ed26a5a86..be6d85d23 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts */ @@ -6,9 +9,7 @@ process MACS2_CONSENSUS { label 'process_long' publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -25,7 +26,9 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - prefix = options.suffix ? "${meta.id}${options.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index bc9b5a98f..215e88d8a 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -1,4 +1,5 @@ -def SOFTWARE = 'bedtools' +// Import generic module functions +include { initOptions; saveFiles } from './functions' /* * Prepare genome intervals for filtering by removing regions in blacklist file @@ -7,9 +8,7 @@ process MAKE_GENOME_FILTER { tag "$sizes" publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, "genome") } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" @@ -26,16 +25,17 @@ process MAKE_GENOME_FILTER { path "*.version.txt", emit: version script: + def software = 'bedtools' file_out = "${sizes.simpleName}.include_regions.bed" if (params.blacklist) { """ sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out - bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt """ } else { """ awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out - bedtools --version | sed -e "s/bedtools v//g" > ${SOFTWARE}.version.txt + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt """ } } diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 15d64be86..395dd0c5e 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -1,4 +1,5 @@ -def SOFTWARE = 'multiqc' +// Import generic module functions +include { initOptions; saveFiles } from './functions' // Has the run name been specified by the user? // this has the bonus effect of catching both -name and --name @@ -11,9 +12,7 @@ process MULTIQC { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" @@ -66,10 +65,12 @@ process MULTIQC { path "*_data", emit: data script: + def software = task.process.toLowerCase() + def ioptions = initOptions(options, software) rtitle = custom_runName ? "--title \"$custom_runName\"" : '' rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' """ - multiqc -f $options.args $rtitle $rfilename $custom_config_file . + multiqc -f $ioptions.args $rtitle $rfilename $custom_config_file . """ } diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/process/multiqc_custom_peaks.nf index a6a918010..7c5d4bad2 100644 --- a/modules/local/process/multiqc_custom_peaks.nf +++ b/modules/local/process/multiqc_custom_peaks.nf @@ -1,11 +1,11 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + process MULTIQC_CUSTOM_PEAKS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -20,7 +20,9 @@ process MULTIQC_CUSTOM_PEAKS { tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv diff --git a/modules/local/process/multiqc_custom_phantompeakqualtools.nf b/modules/local/process/multiqc_custom_phantompeakqualtools.nf index 6b79fcc72..3dc7ef9be 100644 --- a/modules/local/process/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/process/multiqc_custom_phantompeakqualtools.nf @@ -1,11 +1,11 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tag "$meta.id" publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else if (filename.endsWith('.version.txt')) null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -22,7 +22,9 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation script: - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def software = task.process.tokenize('_')[0].toLowerCase() + def ioptions = initOptions(options, software) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index 0f8cecd5c..80e18d14f 100644 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -1,12 +1,13 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Output Markdown documentation to HTML */ process OUTPUT_DOCUMENTATION { publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index d4ec3f196..4d5665756 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Aggregated QC plots for peak-to-gene annotation */ @@ -5,9 +8,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[1].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -23,11 +24,13 @@ process PLOT_HOMER_ANNOTATEPEAKS { path '*.tsv', emit: tsv script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def software = task.process.tokenize('_')[1].toLowerCase() + def ioptions = initOptions(options, software) """ plot_homer_annotatepeaks.r \\ -i ${annos.join(',')} \\ -s ${annos.join(',').replaceAll("${suffix}","")} \\ - $options.args + $ioptions.args find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv """ diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index fe17c6b7f..9ecb4a944 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Aggregated QC plots for peaks */ @@ -5,9 +8,7 @@ process PLOT_MACS2_QC { label 'process_medium' publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[1].toLowerCase()) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -20,11 +21,13 @@ process PLOT_MACS2_QC { path '*.pdf', emit: pdf script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def software = task.process.tokenize('_')[1].toLowerCase() + def ioptions = initOptions(options, software) peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' """ plot_macs2_qc.r \\ -i ${peaks.join(',')} \\ -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ - $options.args + $ioptions.args """ } diff --git a/modules/local/process/samplesheet_check.nf b/modules/local/process/samplesheet_check.nf index 29d43e718..35c4e3bda 100644 --- a/modules/local/process/samplesheet_check.nf +++ b/modules/local/process/samplesheet_check.nf @@ -1,3 +1,6 @@ +// Import generic module functions +include { initOptions; saveFiles } from './functions' + /* * Reformat design file, check validitiy and create IP vs control mappings */ @@ -5,9 +8,7 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" publishDir "${params.outdir}/${options.publish_dir}", mode: params.publish_dir_mode, - saveAs: { filename -> - if (options.publish_results == "none") null - else filename } + saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } conda (params.conda ? "${baseDir}/environment.yml" : null) From bed40b335daf3a05f41818d84a8fd87788c1a136 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 18:39:31 +0100 Subject: [PATCH 125/538] Update all modules --- conf/modules.config | 5 +--- main.nf | 10 +------- modules/local/process/functions.nf | 38 ++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 modules/local/process/functions.nf diff --git a/conf/modules.config b/conf/modules.config index f21bdca23..af73d74a5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -29,9 +29,6 @@ params { args = "-a bwtsw" publish_dir = "genome/bwa_index" } - 'gtf2bed' { - publish_dir = "genome" - } 'make_genome_filter' { publish_dir = "genome" } @@ -163,7 +160,7 @@ params { publish_dir = "igv" } 'get_software_versions' { - publish_dir = "pipeline_info" + publish_files = ['csv':''] } 'output_documentation' { publish_dir = "pipeline_info" diff --git a/main.nf b/main.nf index c13a5fd8b..605c0f7d9 100755 --- a/main.nf +++ b/main.nf @@ -192,15 +192,7 @@ workflow { /* * Prepare genome files */ - //ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - - //BWA_INDEX ( ch_fasta, { args : "-a bwtsw", publish_dir: "genome/bwa_index" } ) - def file_map = [ann:'', bwt:'test'] - //println(file_map) - //println(file_map ?: null) - def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: file_map] - //def index_options = [args: "-a bwtsw", publish_dir: "genome/bwa_index", publish_files: "test"] - BWA_INDEX ( ch_fasta, index_options ) + ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } // diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf new file mode 100644 index 000000000..40f226d00 --- /dev/null +++ b/modules/local/process/functions.nf @@ -0,0 +1,38 @@ +/* + * Function to initialise default values and to generate a Groovy Map of module options + */ +def initOptions(Map args, String publish_dir) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Function to save/publish module results + * if publish_files == null : All files are published + * if publish_files == Map [:] : No files are published + * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) + */ +def saveFiles(filename, options, publish_dir) { + if (!filename.endsWith('.version.txt')) { + def publish_files = initOptions(options, publish_dir).publish_files + if (publish_files instanceof Map) { + for (ext in publish_files) { + if (filename.endsWith(ext.key)) { + if (ext.value) { + return "${ext.value}/$filename" + } else { + return filename + } + } + } + } else { + return filename + } + } +} From cdb59d9e425cfd915a5061b1a189d1cbccbed728 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 19:17:51 +0100 Subject: [PATCH 126/538] Get pipeline working from end-to-end again. Woohoooooo --- conf/modules.config | 30 +- main.nf | 774 ++++++++++++++++++++++---------------------- 2 files changed, 409 insertions(+), 395 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index af73d74a5..3d7125b92 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -4,14 +4,17 @@ * ------------------------------------------------- * * Available keys to override module options: - * args = Additional arguments appended to command in module. - * args2 = Second set of arguments appended to command in module (multi-tool modules). - * publish_by_id = Publish results in separate folders by meta.id value. - * publish_dir = Directory to publish results. - * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results - * for a particular file extension. The value of "directory" is appended to the standard - * "publish_dir" path as defined above. - * suffix = File name suffix for output files + * MANDATORY + * publish_dir = Directory to publish results. + * + * OPTIONAL + * args = Additional arguments appended to command in module. + * args2 = Second set of arguments appended to command in module (multi-tool modules). + * publish_by_id = Publish results in separate folders by meta.id value. + * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results + * for a particular file extension. The value of "directory" is appended to the standard + * "publish_dir" path as defined above. + * suffix = File name suffix for output files */ params { @@ -21,14 +24,19 @@ params { } 'fastqc' { args = "--quiet" + publish_dir = "fastqc" } 'trimgalore' { args = "--fastqc" + publish_dir = "trimgalore" } 'bwa_index' { args = "-a bwtsw" publish_dir = "genome/bwa_index" } + 'gtf2bed' { + publish_dir = "genome" + } 'make_genome_filter' { publish_dir = "genome" } @@ -87,6 +95,7 @@ params { suffix = ".mLb.clN" } 'multiqc_custom_phantompeakqualtools' { + publish_dir = "multiqc" publish_files = [:] } 'bedtools_genomecov' { @@ -121,9 +130,11 @@ params { } 'frip_score' { args = "-bed -c -f 0.20" + publish_dir = "frip" publish_files = [:] } 'multiqc_custom_peaks' { + publish_dir = "multiqc" publish_files = [:] } 'plot_macs2_qc' { @@ -165,5 +176,8 @@ params { 'output_documentation' { publish_dir = "pipeline_info" } + 'multiqc' { + publish_dir = "multiqc" + } } } diff --git a/main.nf b/main.nf index 605c0f7d9..caf6e30f6 100755 --- a/main.nf +++ b/main.nf @@ -194,393 +194,393 @@ workflow { */ ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } - // - // MAKE_GENOME_FILTER ( - // GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, - // ch_blacklist.ifEmpty([]), - // params.modules['make_genome_filter'] - // ) - // ch_software_versions = Channel.empty() - // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) - // - // /* - // * Read QC & trimming - // */ - // nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - // params.modules['trimgalore'].args += nextseq - // FASTQC_TRIMGALORE ( - // INPUT_CHECK.out.reads, - // params.skip_fastqc, - // params.skip_trimming, - // params.modules['fastqc'], - // params.modules['trimgalore'] - // ) - // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) - // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) - // - // /* - // * Map reads & BAM QC - // */ - // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - // params.modules['bwa_mem'].args += score - // MAP_BWA_MEM ( - // FASTQC_TRIMGALORE.out.reads, - // ch_index, - // ch_fasta, - // params.modules['bwa_mem'], - // params.modules['samtools_sort_lib'] - // ) - // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) - // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) - // - // /* - // * Merge resequenced BAM files - // */ - // MAP_BWA_MEM - // .out - // .bam - // .map { - // meta, bam -> - // fmeta = meta.findAll { it.key != 'read_group' } - // fmeta.id = fmeta.id.split('_')[0..-2].join('_') - // [ fmeta, bam ] } - // .groupTuple(by: [0]) - // .map { it -> [ it[0], it[1].flatten() ] } - // .set { ch_sort_bam } - // - // PICARD_MERGESAMFILES ( - // ch_sort_bam, - // params.modules['picard_mergesamfiles'] - // ) - // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) - // - // /* - // * Mark duplicates & filter BAM files - // */ - // MARK_DUPLICATES_PICARD ( - // PICARD_MERGESAMFILES.out.bam, - // params.modules['picard_markduplicates'], - // params.modules['samtools_sort_merged_lib'] - // ) - // - // // Fix getting name sorted BAM here for PE/SE - // BAM_CLEAN ( - // MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - // MAKE_GENOME_FILTER.out.bed.collect(), - // ch_bamtools_filter_se_config, - // ch_bamtools_filter_pe_config, - // params.modules['bam_filter'], - // params.modules['bam_remove_orphans'], - // params.modules['samtools_sort_filter'] - // ) - // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) - // - // /* - // * Post alignment QC - // */ - // PICARD_COLLECTMULTIPLEMETRICS ( - // BAM_CLEAN.out.bam, - // ch_fasta, - // params.modules['picard_collectmultiplemetrics'] - // ) - // - // PRESEQ_LCEXTRAP ( - // BAM_CLEAN.out.bam, - // params.modules['preseq_lcextrap'] - // ) - // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) - // - // PHANTOMPEAKQUALTOOLS ( - // BAM_CLEAN.out.bam, - // params.modules['phantompeakqualtools'] - // ) - // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) - // - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( - // PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), - // ch_spp_nsc_header, - // ch_spp_rsc_header, - // ch_spp_correlation_header, - // params.modules['multiqc_custom_phantompeakqualtools'] - // ) - // - // /* - // * Coverage tracks - // */ - // BEDTOOLS_GENOMECOV ( - // BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), - // params.modules['bedtools_genomecov'] - // ) - // - // UCSC_BEDRAPHTOBIGWIG ( - // BEDTOOLS_GENOMECOV.out.bedgraph, - // GET_CHROM_SIZES.out.sizes, - // params.modules['ucsc_bedgraphtobigwig'] - // ) - // ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) - // - // /* - // * Coverage plots - // */ - // DEEPTOOLS_COMPUTEMATRIX ( - // UCSC_BEDRAPHTOBIGWIG.out.bigwig, - // ch_gene_bed, - // params.modules['deeptools_computematrix'] - // ) - // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) - // - // DEEPTOOLS_PLOTPROFILE ( - // DEEPTOOLS_COMPUTEMATRIX.out.matrix, - // params.modules['deeptools_plotprofile'] - // ) - // - // DEEPTOOLS_PLOTHEATMAP ( - // DEEPTOOLS_COMPUTEMATRIX.out.matrix, - // params.modules['deeptools_plotheatmap'] - // ) - // - // /* - // * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] - // */ - // BAM_CLEAN - // .out - // .bam - // .join ( BAM_CLEAN.out.bai, by: [0] ) - // .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - // .set { ch_control_bam_bai } - // - // BAM_CLEAN - // .out - // .bam - // .join ( BAM_CLEAN.out.bai, by: [0] ) - // .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - // .combine(ch_control_bam_bai, by: 0) - // .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - // .set { ch_ip_control_bam_bai } - // - // /* - // * plotFingerprint for IP and control together - // */ - // params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" - // DEEPTOOLS_PLOTFINGERPRINT ( - // ch_ip_control_bam_bai, - // params.modules['deeptools_plotfingerprint'] - // ) - // - // peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - // if (params.macs_gsize) { - // - // /* - // * Call peaks - // */ - // broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" - // pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' - // fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' - // pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' - // params.modules['macs2_callpeak'].publish_dir += "/$peakType" - // params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" - // - // // Create channel: [ val(meta), ip_bam, control_bam ] - // ch_ip_control_bam_bai - // .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - // .set { ch_ip_control_bam } - // - // MACS2_CALLPEAK ( - // ch_ip_control_bam, - // params.macs_gsize, - // params.modules['macs2_callpeak'] - // ) - // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) - // - // ch_ip_control_bam - // .join(MACS2_CALLPEAK.out.peak, by: [0]) - // .map { it -> [ it[0], it[1], it[3] ] } - // .set { ch_ip_peak } - // FRIP_SCORE ( - // ch_ip_peak, - // params.modules['frip_score'] - // ) - // - // ch_ip_peak - // .join(FRIP_SCORE.out.txt, by: [0]) - // .map { it -> [ it[0], it[2], it[3] ] } - // .set { ch_ip_peak_frip } - // MULTIQC_CUSTOM_PEAKS ( - // ch_ip_peak_frip, - // ch_peak_count_header, - // ch_frip_score_header, - // params.modules['multiqc_custom_peaks'] - // ) - // - // params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" - // PLOT_MACS2_QC ( - // MACS2_CALLPEAK.out.peak.collect{it[1]}, - // params.modules['plot_macs2_qc'] - // ) - // - // params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" - // HOMER_ANNOTATEPEAKS_MACS2 ( - // MACS2_CALLPEAK.out.peak, - // ch_fasta, - // ch_gtf, - // params.modules['homer_annotatepeaks_macs2'] - // ) - // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) - // - // params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" - // PLOT_HOMER_ANNOTATEPEAKS ( - // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - // ch_peak_annotation_header, - // "_peaks.annotatePeaks.txt", - // params.modules['plot_homer_annotatepeaks'] - // ) - // - // // Create channel: [ meta , [ peaks ] ] - // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - // MACS2_CALLPEAK - // .out - // .peak - // .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - // .groupTuple() - // .map { - // antibody, groups, peaks -> - // [ antibody, - // groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - // peaks ] } - // .map { - // antibody, groups, peaks -> - // def meta = [:] - // meta.id = antibody - // meta.multiple_groups = groups.size() > 1 - // meta.replicates_exist = groups.max { groups.value }.value > 1 - // [ meta, peaks ] } - // .set { ch_antibody_peaks } - // - // params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" - // MACS2_CONSENSUS ( - // ch_antibody_peaks, - // params.modules['macs2_consensus'] - // ) - // - // params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" - // HOMER_ANNOTATEPEAKS_CONSENSUS ( - // MACS2_CONSENSUS.out.bed, - // ch_fasta, - // ch_gtf, - // params.modules['homer_annotatepeaks_consensus'] - // ) - // // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - // - // // Create channel: [ val(meta), ip_bam ] - // MACS2_CONSENSUS - // .out - // .saf - // .map { meta, saf -> [ meta.id, meta, saf ] } - // .set { ch_ip_saf } - // - // ch_ip_control_bam - // .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - // .combine(ch_ip_saf) - // .map { - // it -> - // fmeta = it[1] - // fmeta['replicates_exist'] = it[4]['replicates_exist'] - // fmeta['multiple_groups'] = it[4]['multiple_groups'] - // [ fmeta, it[2], it[5] ] } - // .set { ch_ip_bam } - // - // params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" - // SUBREAD_FEATURECOUNTS ( - // ch_ip_bam, - // params.modules['subread_featurecounts'] - // ) - // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) - // - // // - // // DESEQ2_FEATURECOUNTS ( - // // params.modules['deseq2_featurecounts'] - // // ) - // // ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // // ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - // - // } - // - // /* - // * Create IGV session - // */ - // IGV ( - // ch_fasta, - // UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - // params.modules['ucsc_bedgraphtobigwig'], - // params.modules['macs2_callpeak'], - // params.modules['macs2_consensus'], - // params.modules['igv'] - // ) - // - // /* - // * Pipeline reporting - // */ - // GET_SOFTWARE_VERSIONS ( - // ch_software_versions.map { it }.collect(), - // params.modules['get_software_versions'] - // ) - // - // OUTPUT_DOCUMENTATION ( - // ch_output_docs, - // ch_output_docs_images, - // params.modules['output_documentation'] - // ) - // - // /* - // * MultiQC - // */ - // workflow_summary = Schema.params_mqc_summary(summary) - // ch_workflow_summary = Channel.value(workflow_summary) - // params.modules['multiqc'].publish_dir += "/$peakType" - // MULTIQC ( - // ch_multiqc_config, - // ch_multiqc_custom_config.collect().ifEmpty([]), - // GET_SOFTWARE_VERSIONS.out.yaml.collect(), - // ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - // - // FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - // FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - // FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - // - // MAP_BWA_MEM.out.stats.collect{it[1]}, - // MAP_BWA_MEM.out.flagstat.collect{it[1]}, - // MAP_BWA_MEM.out.idxstats.collect{it[1]}, - // - // MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), - // - // BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), - // BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), - // BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), - // PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), - // - // PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - // DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - // DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - // PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - // - // MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - // PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - // SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), - // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - // - // params.modules['multiqc'] - // ) + if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } + + MAKE_GENOME_FILTER ( + GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, + ch_blacklist.ifEmpty([]), + params.modules['make_genome_filter'] + ) + ch_software_versions = Channel.empty() + ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) + + /* + * Read QC & trimming + */ + nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' + params.modules['trimgalore'].args += nextseq + FASTQC_TRIMGALORE ( + INPUT_CHECK.out.reads, + params.skip_fastqc, + params.skip_trimming, + params.modules['fastqc'], + params.modules['trimgalore'] + ) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) + + /* + * Map reads & BAM QC + */ + score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + params.modules['bwa_mem'].args += score + MAP_BWA_MEM ( + FASTQC_TRIMGALORE.out.reads, + ch_index, + ch_fasta, + params.modules['bwa_mem'], + params.modules['samtools_sort_lib'] + ) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) + + /* + * Merge resequenced BAM files + */ + MAP_BWA_MEM + .out + .bam + .map { + meta, bam -> + fmeta = meta.findAll { it.key != 'read_group' } + fmeta.id = fmeta.id.split('_')[0..-2].join('_') + [ fmeta, bam ] } + .groupTuple(by: [0]) + .map { it -> [ it[0], it[1].flatten() ] } + .set { ch_sort_bam } + + PICARD_MERGESAMFILES ( + ch_sort_bam, + params.modules['picard_mergesamfiles'] + ) + ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) + + /* + * Mark duplicates & filter BAM files + */ + MARK_DUPLICATES_PICARD ( + PICARD_MERGESAMFILES.out.bam, + params.modules['picard_markduplicates'], + params.modules['samtools_sort_merged_lib'] + ) + + // Fix getting name sorted BAM here for PE/SE + BAM_CLEAN ( + MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), + MAKE_GENOME_FILTER.out.bed.collect(), + ch_bamtools_filter_se_config, + ch_bamtools_filter_pe_config, + params.modules['bam_filter'], + params.modules['bam_remove_orphans'], + params.modules['samtools_sort_filter'] + ) + ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) + + /* + * Post alignment QC + */ + PICARD_COLLECTMULTIPLEMETRICS ( + BAM_CLEAN.out.bam, + ch_fasta, + params.modules['picard_collectmultiplemetrics'] + ) + + PRESEQ_LCEXTRAP ( + BAM_CLEAN.out.bam, + params.modules['preseq_lcextrap'] + ) + ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + + PHANTOMPEAKQUALTOOLS ( + BAM_CLEAN.out.bam, + params.modules['phantompeakqualtools'] + ) + ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + ch_spp_nsc_header, + ch_spp_rsc_header, + ch_spp_correlation_header, + params.modules['multiqc_custom_phantompeakqualtools'] + ) + + /* + * Coverage tracks + */ + BEDTOOLS_GENOMECOV ( + BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), + params.modules['bedtools_genomecov'] + ) + + UCSC_BEDRAPHTOBIGWIG ( + BEDTOOLS_GENOMECOV.out.bedgraph, + GET_CHROM_SIZES.out.sizes, + params.modules['ucsc_bedgraphtobigwig'] + ) + ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) + + /* + * Coverage plots + */ + DEEPTOOLS_COMPUTEMATRIX ( + UCSC_BEDRAPHTOBIGWIG.out.bigwig, + ch_gene_bed, + params.modules['deeptools_computematrix'] + ) + ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) + + DEEPTOOLS_PLOTPROFILE ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotprofile'] + ) + + DEEPTOOLS_PLOTHEATMAP ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotheatmap'] + ) + + /* + * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + */ + BAM_CLEAN + .out + .bam + .join ( BAM_CLEAN.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } + .set { ch_control_bam_bai } + + BAM_CLEAN + .out + .bam + .join ( BAM_CLEAN.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } + .combine(ch_control_bam_bai, by: 0) + .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + .set { ch_ip_control_bam_bai } + + /* + * plotFingerprint for IP and control together + */ + params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" + DEEPTOOLS_PLOTFINGERPRINT ( + ch_ip_control_bam_bai, + params.modules['deeptools_plotfingerprint'] + ) + + peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + if (params.macs_gsize) { + + /* + * Call peaks + */ + broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" + pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' + fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' + pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + params.modules['macs2_callpeak'].publish_dir += "/$peakType" + params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" + + // Create channel: [ val(meta), ip_bam, control_bam ] + ch_ip_control_bam_bai + .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + .set { ch_ip_control_bam } + + MACS2_CALLPEAK ( + ch_ip_control_bam, + params.macs_gsize, + params.modules['macs2_callpeak'] + ) + ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + + ch_ip_control_bam + .join(MACS2_CALLPEAK.out.peak, by: [0]) + .map { it -> [ it[0], it[1], it[3] ] } + .set { ch_ip_peak } + FRIP_SCORE ( + ch_ip_peak, + params.modules['frip_score'] + ) + + ch_ip_peak + .join(FRIP_SCORE.out.txt, by: [0]) + .map { it -> [ it[0], it[2], it[3] ] } + .set { ch_ip_peak_frip } + MULTIQC_CUSTOM_PEAKS ( + ch_ip_peak_frip, + ch_peak_count_header, + ch_frip_score_header, + params.modules['multiqc_custom_peaks'] + ) + + params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" + PLOT_MACS2_QC ( + MACS2_CALLPEAK.out.peak.collect{it[1]}, + params.modules['plot_macs2_qc'] + ) + + params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" + HOMER_ANNOTATEPEAKS_MACS2 ( + MACS2_CALLPEAK.out.peak, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_macs2'] + ) + ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) + + params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt", + params.modules['plot_homer_annotatepeaks'] + ) + + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + MACS2_CALLPEAK + .out + .peak + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" + MACS2_CONSENSUS ( + ch_antibody_peaks, + params.modules['macs2_consensus'] + ) + + params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_consensus'] + ) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .combine(ch_ip_saf) + .map { + it -> + fmeta = it[1] + fmeta['replicates_exist'] = it[4]['replicates_exist'] + fmeta['multiple_groups'] = it[4]['multiple_groups'] + [ fmeta, it[2], it[5] ] } + .set { ch_ip_bam } + + params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" + SUBREAD_FEATURECOUNTS ( + ch_ip_bam, + params.modules['subread_featurecounts'] + ) + ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + + // + // DESEQ2_FEATURECOUNTS ( + // params.modules['deseq2_featurecounts'] + // ) + // ch_deseq2_pca_header = file("$baseDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // ch_deseq2_clustering_header = file("$baseDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + + } + + /* + * Create IGV session + */ + IGV ( + ch_fasta, + UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + params.modules['ucsc_bedgraphtobigwig'], + params.modules['macs2_callpeak'], + params.modules['macs2_consensus'], + params.modules['igv'] + ) + + /* + * Pipeline reporting + */ + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect(), + params.modules['get_software_versions'] + ) + + OUTPUT_DOCUMENTATION ( + ch_output_docs, + ch_output_docs_images, + params.modules['output_documentation'] + ) + + /* + * MultiQC + */ + workflow_summary = Schema.params_mqc_summary(summary) + ch_workflow_summary = Channel.value(workflow_summary) + params.modules['multiqc'].publish_dir += "/$peakType" + MULTIQC ( + ch_multiqc_config, + ch_multiqc_custom_config.collect().ifEmpty([]), + GET_SOFTWARE_VERSIONS.out.yaml.collect(), + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + + FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + + MAP_BWA_MEM.out.stats.collect{it[1]}, + MAP_BWA_MEM.out.flagstat.collect{it[1]}, + MAP_BWA_MEM.out.idxstats.collect{it[1]}, + + MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + + BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), + PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + + PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), + + MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), + PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + + params.modules['multiqc'] + ) } //////////////////////////////////////////////////// From 630905ed43690f55003cf8ddc41d817a050ffb32 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 3 Aug 2020 20:00:34 +0100 Subject: [PATCH 127/538] Add publishDir --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 3d7125b92..e2a7f7287 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -171,6 +171,7 @@ params { publish_dir = "igv" } 'get_software_versions' { + publish_dir = "pipeline_info" publish_files = ['csv':''] } 'output_documentation' { From 8cbfafb3ed23c8e230fa716b5fa1338c166cb456 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 13:23:38 +0100 Subject: [PATCH 128/538] Update saveFiles logic --- modules/nf-core/software/bwa_index.nf | 10 ++--- modules/nf-core/software/bwa_mem.nf | 10 ++--- .../software/deeptools_computematrix.nf | 10 ++--- .../software/deeptools_plotfingerprint.nf | 12 +++--- .../nf-core/software/deeptools_plotheatmap.nf | 8 ++-- .../nf-core/software/deeptools_plotprofile.nf | 8 ++-- modules/nf-core/software/fastqc.nf | 12 +++--- modules/nf-core/software/functions.nf | 42 +++++++++++++------ .../nf-core/software/homer_annotatepeaks.nf | 8 ++-- modules/nf-core/software/macs2_callpeak.nf | 8 ++-- .../nf-core/software/phantompeakqualtools.nf | 6 +-- .../software/picard_collectmultiplemetrics.nf | 8 ++-- .../nf-core/software/picard_markduplicates.nf | 8 ++-- .../nf-core/software/picard_mergesamfiles.nf | 8 ++-- modules/nf-core/software/preseq_lcextrap.nf | 8 ++-- modules/nf-core/software/samtools_flagstat.nf | 8 ++-- modules/nf-core/software/samtools_idxstats.nf | 8 ++-- modules/nf-core/software/samtools_index.nf | 8 ++-- modules/nf-core/software/samtools_sort.nf | 6 +-- modules/nf-core/software/samtools_stats.nf | 8 ++-- .../nf-core/software/subread_featurecounts.nf | 6 +-- modules/nf-core/software/trimgalore.nf | 8 ++-- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 8 ++-- 23 files changed, 123 insertions(+), 103 deletions(-) diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index c5a92e529..a698d211f 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process BWA_INDEX { tag "$fasta" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id='') } container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" @@ -22,8 +22,8 @@ process BWA_INDEX { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) """ bwa index $ioptions.args $fasta echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 0a749e402..0fe737959 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process BWA_MEM { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" @@ -24,8 +24,8 @@ process BWA_MEM { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" rg = meta.read_group ? "-R ${meta.read_group}" : "" """ diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 86be86dec..7151b1b51 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -24,8 +24,8 @@ process DEEPTOOLS_COMPUTEMATRIX { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ computeMatrix \\ diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 9326dd586..dd2896817 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -24,8 +24,8 @@ process DEEPTOOLS_PLOTFINGERPRINT { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 68dcfcc90..8bd5b2a4c 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 457b55a38..7db9ba698 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index e3c8f0d04..c8e483fb7 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" @@ -22,9 +22,11 @@ process FASTQC { tuple val(meta), path("*.zip"), emit: zip path "*.version.txt", emit: version + echo true + script: // Add soft-links to original FastQs for consistent naming in pipeline - def software = task.process.toLowerCase() + def software = getSoftwareName(task.process) def ioptions = initOptions(options, software) prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf index 40f226d00..691904fbd 100644 --- a/modules/nf-core/software/functions.nf +++ b/modules/nf-core/software/functions.nf @@ -1,38 +1,56 @@ +/* + * Extract name of software from nf-core/modules process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + /* * Function to initialise default values and to generate a Groovy Map of module options */ -def initOptions(Map args, String publish_dir) { +def initOptions(Map args) { def Map options = [:] options.args = args.args ?: '' options.args2 = args.args2 ?: '' options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir + options.publish_dir = args.publish_dir ?: '' options.publish_files = args.publish_files ?: null options.suffix = args.suffix ?: '' return options } +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + /* * Function to save/publish module results * if publish_files == null : All files are published * if publish_files == Map [:] : No files are published * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) */ -def saveFiles(filename, options, publish_dir) { +def saveFiles(filename, options, publish_dir='', publish_id='') { if (!filename.endsWith('.version.txt')) { - def publish_files = initOptions(options, publish_dir).publish_files - if (publish_files instanceof Map) { - for (ext in publish_files) { + def ioptions = initOptions(options) + def path_list = [ ioptions.publish_dir ?: publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { if (filename.endsWith(ext.key)) { - if (ext.value) { - return "${ext.value}/$filename" - } else { - return filename - } + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "/${getPathFromList(ext_list)}/$filename" } } } else { - return filename + return "/${getPathFromList(path_list)}/$filename" } } } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 0697dac94..927affd61 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -1,15 +1,15 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' def VERSION = '4.11' process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index dcd89ea63..963f2bb06 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index d3e9bee54..c18892df7 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -1,14 +1,14 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' def VERSION = '1.2.2' process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 084dde433..6cbf65cf3 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index deee9411f..c8645ec65 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 78522731c..283ac1a72 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 2fb445f7e..39e859403 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -1,14 +1,14 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index 349612b33..2f1c830cb 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SAMTOOLS_FLAGSTAT { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 9eb578efd..7c4ac39ad 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SAMTOOLS_IDXSTATS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 95f28ebe2..1ff7a7d85 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SAMTOOLS_INDEX { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 7aff6a57d..40f54a768 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index e30228e75..34feac667 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SAMTOOLS_STATS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 5104b5d94..eb7606090 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process SUBREAD_FEATURECOUNTS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index e430ef738..726794aca 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process TRIMGALORE { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index 6f5126e5e..a642205bd 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -1,15 +1,15 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' def VERSION = '377' process UCSC_BEDRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" From 7bfae43f887b85e5192674b0891f4356f9793708 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 13:32:15 +0100 Subject: [PATCH 129/538] Use updated logic to publish file --- modules/nf-core/software/deeptools_plotheatmap.nf | 6 +++--- modules/nf-core/software/deeptools_plotprofile.nf | 6 +++--- modules/nf-core/software/fastqc.nf | 6 ++---- modules/nf-core/software/homer_annotatepeaks.nf | 6 +++--- modules/nf-core/software/macs2_callpeak.nf | 6 +++--- modules/nf-core/software/phantompeakqualtools.nf | 4 ++-- modules/nf-core/software/picard_collectmultiplemetrics.nf | 6 +++--- modules/nf-core/software/picard_markduplicates.nf | 6 +++--- modules/nf-core/software/picard_mergesamfiles.nf | 6 +++--- modules/nf-core/software/preseq_lcextrap.nf | 6 +++--- modules/nf-core/software/samtools_flagstat.nf | 4 ++-- modules/nf-core/software/samtools_idxstats.nf | 4 ++-- modules/nf-core/software/samtools_index.nf | 4 ++-- modules/nf-core/software/samtools_sort.nf | 6 +++--- modules/nf-core/software/samtools_stats.nf | 4 ++-- modules/nf-core/software/subread_featurecounts.nf | 6 +++--- modules/nf-core/software/trimgalore.nf | 6 +++--- modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 6 +++--- 18 files changed, 48 insertions(+), 50 deletions(-) diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 8bd5b2a4c..10ce9ae66 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -7,7 +7,7 @@ process DEEPTOOLS_PLOTHEATMAP { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -23,8 +23,8 @@ process DEEPTOOLS_PLOTHEATMAP { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotHeatmap \\ diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 7db9ba698..3cea35525 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -7,7 +7,7 @@ process DEEPTOOLS_PLOTPROFILE { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" @@ -23,8 +23,8 @@ process DEEPTOOLS_PLOTPROFILE { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotProfile \\ diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index c8e483fb7..f3864eea1 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -7,7 +7,7 @@ process FASTQC { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" @@ -22,12 +22,10 @@ process FASTQC { tuple val(meta), path("*.zip"), emit: zip path "*.version.txt", emit: version - echo true - script: // Add soft-links to original FastQs for consistent naming in pipeline def software = getSoftwareName(task.process) - def ioptions = initOptions(options, software) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 927affd61..9958fe75f 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -9,7 +9,7 @@ process HOMER_ANNOTATEPEAKS { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" @@ -26,8 +26,8 @@ process HOMER_ANNOTATEPEAKS { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ annotatePeaks.pl \\ diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 963f2bb06..b38efc5c6 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -7,7 +7,7 @@ process MACS2_CALLPEAK { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" @@ -27,8 +27,8 @@ process MACS2_CALLPEAK { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" format = meta.single_end ? 'BAM' : 'BAMPE' control = controlbam ? "--control $controlbam" : '' diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index c18892df7..2c164e3a2 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -26,8 +26,8 @@ process PHANTOMPEAKQUALTOOLS { path "*.version.txt", emit: version script: - def software = task.process.toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ RUN_SPP=`which run_spp.R` diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 6cbf65cf3..acb2a6275 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -7,7 +7,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -24,8 +24,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index c8645ec65..cfbfed58f 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -7,7 +7,7 @@ process PICARD_MARKDUPLICATES { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -23,8 +23,8 @@ process PICARD_MARKDUPLICATES { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index 283ac1a72..f957ddaa2 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -7,7 +7,7 @@ process PICARD_MERGESAMFILES { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" @@ -22,8 +22,8 @@ process PICARD_MERGESAMFILES { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" bam_files = bams.sort() def avail_mem = 3 diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 39e859403..ec80e684a 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -8,7 +8,7 @@ process PRESEQ_LCEXTRAP { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" @@ -24,8 +24,8 @@ process PRESEQ_LCEXTRAP { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pe' """ diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index 2f1c830cb..d04c205b9 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -6,7 +6,7 @@ process SAMTOOLS_FLAGSTAT { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -21,7 +21,7 @@ process SAMTOOLS_FLAGSTAT { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() + def software = getSoftwareName(task.process) """ samtools flagstat $bam > ${bam}.flagstat echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 7c4ac39ad..419971e11 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -6,7 +6,7 @@ process SAMTOOLS_IDXSTATS { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -21,7 +21,7 @@ process SAMTOOLS_IDXSTATS { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() + def software = getSoftwareName(task.process) """ samtools idxstats $bam > ${bam}.idxstats echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index 1ff7a7d85..f8f749fd0 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -6,7 +6,7 @@ process SAMTOOLS_INDEX { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -21,7 +21,7 @@ process SAMTOOLS_INDEX { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() + def software = getSoftwareName(task.process) """ samtools index $bam echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 40f54a768..fca94ef3d 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -7,7 +7,7 @@ process SAMTOOLS_SORT { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -22,8 +22,8 @@ process SAMTOOLS_SORT { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 34feac667..8fbf22e98 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -6,7 +6,7 @@ process SAMTOOLS_STATS { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" @@ -21,7 +21,7 @@ process SAMTOOLS_STATS { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() + def software = getSoftwareName(task.process) """ samtools stats $bam > ${bam}.stats echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index eb7606090..8e7cc0177 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -7,7 +7,7 @@ process SUBREAD_FEATURECOUNTS { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" @@ -23,8 +23,8 @@ process SUBREAD_FEATURECOUNTS { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-p' """ diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index 726794aca..a2bcdf6e0 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -7,7 +7,7 @@ process TRIMGALORE { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" @@ -43,8 +43,8 @@ process TRIMGALORE { tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - def software = task.process.toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index a642205bd..ed9ba99e0 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -9,7 +9,7 @@ process UCSC_BEDRAPHTOBIGWIG { publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } - + container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" @@ -25,8 +25,8 @@ process UCSC_BEDRAPHTOBIGWIG { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig From a8da381e7449ef996ee14a7d2ae0884fb38b085b Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 14:29:57 +0100 Subject: [PATCH 130/538] Use updated functions.nf --- modules/local/process/bam_filter.nf | 6 +-- modules/local/process/bam_remove_orphans.nf | 6 +-- modules/local/process/bedtools_genomecov.nf | 10 ++--- modules/local/process/frip_score.nf | 6 +-- modules/local/process/functions.nf | 42 +++++++++++++------ modules/local/process/get_chrom_sizes.nf | 6 +-- .../local/process/get_software_versions.nf | 6 +-- modules/local/process/gtf2bed.nf | 6 +-- modules/local/process/igv.nf | 6 +-- modules/local/process/macs2_consensus.nf | 10 ++--- modules/local/process/make_genome_filter.nf | 6 +-- modules/local/process/multiqc.nf | 10 ++--- modules/local/process/multiqc_custom_peaks.nf | 10 ++--- .../multiqc_custom_phantompeakqualtools.nf | 10 ++--- modules/local/process/output_documentation.nf | 6 +-- .../local/process/plot_homer_annotatepeaks.nf | 9 ++-- modules/local/process/plot_macs2_qc.nf | 7 ++-- modules/local/process/samplesheet_check.nf | 6 +-- 18 files changed, 92 insertions(+), 76 deletions(-) diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index 0d6ec5876..fd4b6d570 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -7,9 +7,9 @@ include { initOptions; saveFiles } from './functions' process BAM_FILTER { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -25,7 +25,7 @@ process BAM_FILTER { path "*.version.txt", emit: version script: - def ioptions = initOptions(options, task.process.toLowerCase()) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' dup_params = params.keep_dups ? '' : '-F 0x0400' diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index f17f0d1fa..de9efc737 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -7,9 +7,9 @@ include { initOptions; saveFiles } from './functions' process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -21,7 +21,7 @@ process BAM_REMOVE_ORPHANS { tuple val(meta), path("${prefix}.bam"), emit: bam script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def ioptions = initOptions(options, task.process.toLowerCase()) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (!meta.single_end) { """ diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 115902c9f..9eac32aab 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -1,12 +1,12 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" @@ -23,8 +23,8 @@ process BEDTOOLS_GENOMECOV { path "*.version.txt", emit: version script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" pe = meta.single_end ? '' : '-pc' extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' diff --git a/modules/local/process/frip_score.nf b/modules/local/process/frip_score.nf index d5e382d78..9399851d4 100644 --- a/modules/local/process/frip_score.nf +++ b/modules/local/process/frip_score.nf @@ -4,9 +4,9 @@ include { initOptions; saveFiles } from './functions' process FRIP_SCORE { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -18,7 +18,7 @@ process FRIP_SCORE { tuple val(meta), path("*.txt"), emit: txt script: - def ioptions = initOptions(options, task.process.tokenize('_')[0].toLowerCase()) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $ioptions.args | awk -F '\t' '{sum += \$NF} END {print sum}') diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index 40f226d00..691904fbd 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -1,38 +1,56 @@ +/* + * Extract name of software from nf-core/modules process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + /* * Function to initialise default values and to generate a Groovy Map of module options */ -def initOptions(Map args, String publish_dir) { +def initOptions(Map args) { def Map options = [:] options.args = args.args ?: '' options.args2 = args.args2 ?: '' options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ? args.publish_dir : publish_dir + options.publish_dir = args.publish_dir ?: '' options.publish_files = args.publish_files ?: null options.suffix = args.suffix ?: '' return options } +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + /* * Function to save/publish module results * if publish_files == null : All files are published * if publish_files == Map [:] : No files are published * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) */ -def saveFiles(filename, options, publish_dir) { +def saveFiles(filename, options, publish_dir='', publish_id='') { if (!filename.endsWith('.version.txt')) { - def publish_files = initOptions(options, publish_dir).publish_files - if (publish_files instanceof Map) { - for (ext in publish_files) { + def ioptions = initOptions(options) + def path_list = [ ioptions.publish_dir ?: publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { if (filename.endsWith(ext.key)) { - if (ext.value) { - return "${ext.value}/$filename" - } else { - return filename - } + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "/${getPathFromList(ext_list)}/$filename" } } } else { - return filename + return "/${getPathFromList(path_list)}/$filename" } } } diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index a76e2cfdd..99e22122b 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -1,14 +1,14 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Get chromosome sizes from a fasta file */ process GET_CHROM_SIZES { tag "$fasta" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "genome") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index a097e9408..1163b2681 100644 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Parse software version numbers */ process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } input: path versions diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 0f2533773..063b220fe 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Convert GTF file to BED format @@ -7,9 +7,9 @@ include { initOptions; saveFiles } from './functions' process GTF2BED { tag "$gtf" label 'process_low' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "genome") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } container "quay.io/biocontainers/perl:5.26.2" //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf index 0e95f7062..7e7faca2c 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/process/igv.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Create IGV session file */ process IGV { - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index be6d85d23..18cef6e54 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' /* * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts @@ -7,9 +7,9 @@ include { initOptions; saveFiles } from './functions' process MACS2_CONSENSUS { tag "$meta.id" label 'process_long' - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -26,8 +26,8 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 215e88d8a..1910d6f2d 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -1,14 +1,14 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Prepare genome intervals for filtering by removing regions in blacklist file */ process MAKE_GENOME_FILTER { tag "$sizes" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "genome") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index 395dd0c5e..f90de009f 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' // Has the run name been specified by the user? // this has the bonus effect of catching both -name and --name @@ -10,9 +10,9 @@ if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { process MULTIQC { label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id='') } container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" @@ -65,8 +65,8 @@ process MULTIQC { path "*_data", emit: data script: - def software = task.process.toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) rtitle = custom_runName ? "--title \"$custom_runName\"" : '' rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/process/multiqc_custom_peaks.nf index 7c5d4bad2..8e10a1bd6 100644 --- a/modules/local/process/multiqc_custom_peaks.nf +++ b/modules/local/process/multiqc_custom_peaks.nf @@ -1,11 +1,11 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process MULTIQC_CUSTOM_PEAKS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir} ", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -20,8 +20,8 @@ process MULTIQC_CUSTOM_PEAKS { tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv diff --git a/modules/local/process/multiqc_custom_phantompeakqualtools.nf b/modules/local/process/multiqc_custom_phantompeakqualtools.nf index 3dc7ef9be..cbd38c255 100644 --- a/modules/local/process/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/process/multiqc_custom_phantompeakqualtools.nf @@ -1,11 +1,11 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { initOptions; saveFiles; getSoftwareName } from './functions' process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tag "$meta.id" - publishDir "${params.outdir}/${options.publish_dir}${options.publish_by_id ? "/${meta.id}" : ''}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[0].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -22,8 +22,8 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation script: - def software = task.process.tokenize('_')[0].toLowerCase() - def ioptions = initOptions(options, software) + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index 80e18d14f..a07c9e973 100644 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -1,13 +1,13 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Output Markdown documentation to HTML */ process OUTPUT_DOCUMENTATION { - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index 4d5665756..649a0cfd3 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -6,10 +6,10 @@ include { initOptions; saveFiles } from './functions' */ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[1].toLowerCase()) } - + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } + conda (params.conda ? "${baseDir}/environment.yml" : null) input: @@ -24,8 +24,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { path '*.tsv', emit: tsv script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def software = task.process.tokenize('_')[1].toLowerCase() - def ioptions = initOptions(options, software) + def ioptions = initOptions(options) """ plot_homer_annotatepeaks.r \\ -i ${annos.join(',')} \\ diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index 9ecb4a944..d40a8d954 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -6,9 +6,9 @@ include { initOptions; saveFiles } from './functions' */ process PLOT_MACS2_QC { label 'process_medium' - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, task.process.tokenize('_')[1].toLowerCase()) } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -21,8 +21,7 @@ process PLOT_MACS2_QC { path '*.pdf', emit: pdf script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def software = task.process.tokenize('_')[1].toLowerCase() - def ioptions = initOptions(options, software) + def ioptions = initOptions(options) peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' """ plot_macs2_qc.r \\ diff --git a/modules/local/process/samplesheet_check.nf b/modules/local/process/samplesheet_check.nf index 35c4e3bda..5c393ed39 100644 --- a/modules/local/process/samplesheet_check.nf +++ b/modules/local/process/samplesheet_check.nf @@ -1,14 +1,14 @@ // Import generic module functions -include { initOptions; saveFiles } from './functions' +include { saveFiles } from './functions' /* * Reformat design file, check validitiy and create IP vs control mappings */ process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}/${options.publish_dir}", + publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename, options, "pipeline_info") } + saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } conda (params.conda ? "${baseDir}/environment.yml" : null) From f71daa5635a54e31ed98ceeb168c76bc2bd0f05a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 14:39:06 +0100 Subject: [PATCH 131/538] Remove starting slash --- modules/local/process/functions.nf | 4 ++-- modules/nf-core/software/functions.nf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index 691904fbd..dfeab8a87 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -46,11 +46,11 @@ def saveFiles(filename, options, publish_dir='', publish_id='') { if (filename.endsWith(ext.key)) { def ext_list = path_list.collect() ext_list.add(ext.value) - return "/${getPathFromList(ext_list)}/$filename" + return "${getPathFromList(ext_list)}/$filename" } } } else { - return "/${getPathFromList(path_list)}/$filename" + return "${getPathFromList(path_list)}/$filename" } } } diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf index 691904fbd..dfeab8a87 100644 --- a/modules/nf-core/software/functions.nf +++ b/modules/nf-core/software/functions.nf @@ -46,11 +46,11 @@ def saveFiles(filename, options, publish_dir='', publish_id='') { if (filename.endsWith(ext.key)) { def ext_list = path_list.collect() ext_list.add(ext.value) - return "/${getPathFromList(ext_list)}/$filename" + return "${getPathFromList(ext_list)}/$filename" } } } else { - return "/${getPathFromList(path_list)}/$filename" + return "${getPathFromList(path_list)}/$filename" } } } From 79b00f4cd5b15c8a31c7a02b231b8dea49d3ab93 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 14:50:12 +0100 Subject: [PATCH 132/538] Add some docs --- conf/modules.config | 6 ++---- modules/local/process/functions.nf | 2 +- modules/nf-core/software/functions.nf | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e2a7f7287..e95dfaf50 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -4,17 +4,15 @@ * ------------------------------------------------- * * Available keys to override module options: - * MANDATORY - * publish_dir = Directory to publish results. - * - * OPTIONAL * args = Additional arguments appended to command in module. * args2 = Second set of arguments appended to command in module (multi-tool modules). * publish_by_id = Publish results in separate folders by meta.id value. + * publish_dir = Directory to publish results. * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results * for a particular file extension. The value of "directory" is appended to the standard * "publish_dir" path as defined above. * suffix = File name suffix for output files + * */ params { diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index dfeab8a87..2bc9b8a08 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -6,7 +6,7 @@ def getSoftwareName(task_process) { } /* - * Function to initialise default values and to generate a Groovy Map of module options + * Function to initialise default values and to generate a Groovy Map of nf-core module options */ def initOptions(Map args) { def Map options = [:] diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf index dfeab8a87..2bc9b8a08 100644 --- a/modules/nf-core/software/functions.nf +++ b/modules/nf-core/software/functions.nf @@ -6,7 +6,7 @@ def getSoftwareName(task_process) { } /* - * Function to initialise default values and to generate a Groovy Map of module options + * Function to initialise default values and to generate a Groovy Map of nf-core module options */ def initOptions(Map args) { def Map options = [:] From 3bc6332ba367e573c6df7cd2afa82152af051e63 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 14:52:28 +0100 Subject: [PATCH 133/538] Update help --- conf/modules.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e95dfaf50..4587ddb1e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,7 +1,7 @@ /* - * ------------------------------------------------- - * Nextflow config file for module specific-options - * ------------------------------------------------- + * -------------------------------------------------- + * Config file for defining DSL2 per module options + * -------------------------------------------------- * * Available keys to override module options: * args = Additional arguments appended to command in module. From e282df2b645e318e2c8893ea37f35d94db1e8579 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 15:02:28 +0100 Subject: [PATCH 134/538] Add more docs annotation --- conf/modules.config | 2 ++ modules/local/process/functions.nf | 13 ++++++++----- modules/nf-core/software/functions.nf | 13 ++++++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 4587ddb1e..8ed9b7729 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -11,6 +11,8 @@ * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results * for a particular file extension. The value of "directory" is appended to the standard * "publish_dir" path as defined above. + * If publish_files == null (unspecified) - All files are published. + * If publish_files == Map [:] (empty map) - No files are published. * suffix = File name suffix for output files * */ diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index 2bc9b8a08..a2c0d6ce1 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -1,12 +1,18 @@ /* - * Extract name of software from nf-core/modules process name using $task.process + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process */ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } /* - * Function to initialise default values and to generate a Groovy Map of nf-core module options + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules */ def initOptions(Map args) { def Map options = [:] @@ -30,9 +36,6 @@ def getPathFromList(path_list) { /* * Function to save/publish module results - * if publish_files == null : All files are published - * if publish_files == Map [:] : No files are published - * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) */ def saveFiles(filename, options, publish_dir='', publish_id='') { if (!filename.endsWith('.version.txt')) { diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf index 2bc9b8a08..a2c0d6ce1 100644 --- a/modules/nf-core/software/functions.nf +++ b/modules/nf-core/software/functions.nf @@ -1,12 +1,18 @@ /* - * Extract name of software from nf-core/modules process name using $task.process + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process */ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } /* - * Function to initialise default values and to generate a Groovy Map of nf-core module options + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules */ def initOptions(Map args) { def Map options = [:] @@ -30,9 +36,6 @@ def getPathFromList(path_list) { /* * Function to save/publish module results - * if publish_files == null : All files are published - * if publish_files == Map [:] : No files are published - * if publish_files == Map [ext:path] : Only files that end with "ext" are published to "path" (appended to output directory) */ def saveFiles(filename, options, publish_dir='', publish_id='') { if (!filename.endsWith('.version.txt')) { From b3d4943013ec8a61929bec6d458d615d358ae33d Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 15:28:15 +0100 Subject: [PATCH 135/538] Remove options if default value alreadty --- conf/modules.config | 20 -------------------- main.nf | 12 ++++++------ 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8ed9b7729..f7bb77dd5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -19,30 +19,16 @@ params { modules { - 'samplesheet_check' { - publish_dir = "pipeline_info" - } 'fastqc' { args = "--quiet" - publish_dir = "fastqc" } 'trimgalore' { args = "--fastqc" - publish_dir = "trimgalore" } 'bwa_index' { args = "-a bwtsw" publish_dir = "genome/bwa_index" } - 'gtf2bed' { - publish_dir = "genome" - } - 'make_genome_filter' { - publish_dir = "genome" - } - 'get_chrom_sizes' { - publish_dir = "genome" - } 'bwa_mem' { args = "-M" args2 = "-h -F 0x0100 -O BAM" @@ -167,16 +153,10 @@ params { 'deseq2_featurecounts' { publish_dir = "bwa/mergedLibrary/macs2" } - 'igv' { - publish_dir = "igv" - } 'get_software_versions' { publish_dir = "pipeline_info" publish_files = ['csv':''] } - 'output_documentation' { - publish_dir = "pipeline_info" - } 'multiqc' { publish_dir = "multiqc" } diff --git a/main.nf b/main.nf index caf6e30f6..114dac5ec 100755 --- a/main.nf +++ b/main.nf @@ -186,7 +186,7 @@ workflow { INPUT_CHECK ( ch_input, params.seq_center, - params.modules['samplesheet_check'] + [:] ) /* @@ -194,12 +194,12 @@ workflow { */ ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, params.modules['gtf2bed'] ) } + if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, [:] ) } MAKE_GENOME_FILTER ( - GET_CHROM_SIZES ( ch_fasta, params.modules['get_chrom_sizes'] ).sizes, + GET_CHROM_SIZES ( ch_fasta, [:] ).sizes, ch_blacklist.ifEmpty([]), - params.modules['make_genome_filter'] + [:] ) ch_software_versions = Channel.empty() ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) @@ -518,7 +518,7 @@ workflow { params.modules['ucsc_bedgraphtobigwig'], params.modules['macs2_callpeak'], params.modules['macs2_consensus'], - params.modules['igv'] + [:] ) /* @@ -532,7 +532,7 @@ workflow { OUTPUT_DOCUMENTATION ( ch_output_docs, ch_output_docs_images, - params.modules['output_documentation'] + [:] ) /* From f1eef741026ad119b914b00e723115309568f6de Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 16:52:23 +0100 Subject: [PATCH 136/538] Replace = with : --- modules/nf-core/software/bwa_index.nf | 2 +- modules/nf-core/software/bwa_mem.nf | 2 +- .../software/deeptools_computematrix.nf | 2 +- .../software/deeptools_plotfingerprint.nf | 2 +- .../nf-core/software/deeptools_plotheatmap.nf | 2 +- .../nf-core/software/deeptools_plotprofile.nf | 2 +- modules/nf-core/software/fastqc.nf | 2 +- modules/nf-core/software/functions.nf | 22 +++++++++---------- .../nf-core/software/homer_annotatepeaks.nf | 2 +- modules/nf-core/software/macs2_callpeak.nf | 2 +- .../nf-core/software/phantompeakqualtools.nf | 2 +- .../software/picard_collectmultiplemetrics.nf | 2 +- .../nf-core/software/picard_markduplicates.nf | 2 +- .../nf-core/software/picard_mergesamfiles.nf | 2 +- modules/nf-core/software/preseq_lcextrap.nf | 2 +- modules/nf-core/software/samtools_flagstat.nf | 2 +- modules/nf-core/software/samtools_idxstats.nf | 2 +- modules/nf-core/software/samtools_index.nf | 2 +- modules/nf-core/software/samtools_sort.nf | 2 +- modules/nf-core/software/samtools_stats.nf | 2 +- .../nf-core/software/subread_featurecounts.nf | 2 +- modules/nf-core/software/trimgalore.nf | 2 +- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 2 +- 23 files changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf index a698d211f..38b86c1fb 100644 --- a/modules/nf-core/software/bwa_index.nf +++ b/modules/nf-core/software/bwa_index.nf @@ -6,7 +6,7 @@ process BWA_INDEX { label 'process_high' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:'') } container "biocontainers/bwa:v0.7.17_cv1" //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 0fe737959..1b231240f 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -6,7 +6,7 @@ process BWA_MEM { label 'process_high' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 7151b1b51..0c505e419 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -6,7 +6,7 @@ process DEEPTOOLS_COMPUTEMATRIX { label 'process_high' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index dd2896817..9304e836c 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -6,7 +6,7 @@ process DEEPTOOLS_PLOTFINGERPRINT { label 'process_high' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 10ce9ae66..3e8f78d77 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -6,7 +6,7 @@ process DEEPTOOLS_PLOTHEATMAP { label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf index 3cea35525..a822066b8 100644 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ b/modules/nf-core/software/deeptools_plotprofile.nf @@ -6,7 +6,7 @@ process DEEPTOOLS_PLOTPROFILE { label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/deeptools:3.4.3--py_0" //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index f3864eea1..8b66fd360 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -6,7 +6,7 @@ process FASTQC { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/fastqc:0.11.9--0" //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf index a2c0d6ce1..75553cdf5 100644 --- a/modules/nf-core/software/functions.nf +++ b/modules/nf-core/software/functions.nf @@ -29,31 +29,31 @@ def initOptions(Map args) { * Tidy up and join elements of a list to return a path string */ def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') } /* * Function to save/publish module results */ -def saveFiles(filename, options, publish_dir='', publish_id='') { - if (!filename.endsWith('.version.txt')) { - def ioptions = initOptions(options) - def path_list = [ ioptions.publish_dir ?: publish_dir ] +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] if (ioptions.publish_by_id) { - path_list.add(publish_id) + path_list.add(args.publish_id) } if (ioptions.publish_files instanceof Map) { for (ext in ioptions.publish_files) { - if (filename.endsWith(ext.key)) { + if (args.filename.endsWith(ext.key)) { def ext_list = path_list.collect() ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$filename" + return "${getPathFromList(ext_list)}/$args.filename" } } } else { - return "${getPathFromList(path_list)}/$filename" + return "${getPathFromList(path_list)}/$args.filename" } } } diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 9958fe75f..6045fc587 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -8,7 +8,7 @@ process HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index b38efc5c6..83537a6f2 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -6,7 +6,7 @@ process MACS2_CALLPEAK { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 2c164e3a2..88dc6493f 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -8,7 +8,7 @@ process PHANTOMPEAKQUALTOOLS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index acb2a6275..09bdefeda 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -6,7 +6,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index cfbfed58f..7a466324d 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -6,7 +6,7 @@ process PICARD_MARKDUPLICATES { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index f957ddaa2..ca50913a4 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -6,7 +6,7 @@ process PICARD_MERGESAMFILES { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/picard:2.23.2--0" //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index ec80e684a..9461acc96 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -7,7 +7,7 @@ process PRESEQ_LCEXTRAP { label 'error_ignore' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf index d04c205b9..4c14a41ae 100644 --- a/modules/nf-core/software/samtools_flagstat.nf +++ b/modules/nf-core/software/samtools_flagstat.nf @@ -5,7 +5,7 @@ process SAMTOOLS_FLAGSTAT { tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf index 419971e11..9805bb141 100644 --- a/modules/nf-core/software/samtools_idxstats.nf +++ b/modules/nf-core/software/samtools_idxstats.nf @@ -5,7 +5,7 @@ process SAMTOOLS_IDXSTATS { tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf index f8f749fd0..456e2663d 100644 --- a/modules/nf-core/software/samtools_index.nf +++ b/modules/nf-core/software/samtools_index.nf @@ -5,7 +5,7 @@ process SAMTOOLS_INDEX { tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index fca94ef3d..8c038054c 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -6,7 +6,7 @@ process SAMTOOLS_SORT { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf index 8fbf22e98..52d5e2d74 100644 --- a/modules/nf-core/software/samtools_stats.nf +++ b/modules/nf-core/software/samtools_stats.nf @@ -5,7 +5,7 @@ process SAMTOOLS_STATS { tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 8e7cc0177..974ae2814 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -6,7 +6,7 @@ process SUBREAD_FEATURECOUNTS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index a2bcdf6e0..be9b961c3 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -6,7 +6,7 @@ process TRIMGALORE { label 'process_high' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/trim-galore:0.6.5--0" //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index ed9ba99e0..ca12ff0d9 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -8,7 +8,7 @@ process UCSC_BEDRAPHTOBIGWIG { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" From 78f1b733af198de5f90ffbe2f5570beafff6e0a8 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 17:00:53 +0100 Subject: [PATCH 137/538] Add def everywhere --- modules/nf-core/software/bwa_mem.nf | 4 ++-- modules/nf-core/software/deeptools_computematrix.nf | 2 +- modules/nf-core/software/deeptools_plotfingerprint.nf | 4 ++-- modules/nf-core/software/deeptools_plotheatmap.nf | 2 +- modules/nf-core/software/fastqc.nf | 2 +- modules/nf-core/software/homer_annotatepeaks.nf | 2 +- modules/nf-core/software/macs2_callpeak.nf | 6 +++--- modules/nf-core/software/phantompeakqualtools.nf | 2 +- .../nf-core/software/picard_collectmultiplemetrics.nf | 6 +++--- modules/nf-core/software/picard_markduplicates.nf | 6 +++--- modules/nf-core/software/picard_mergesamfiles.nf | 8 ++++---- modules/nf-core/software/preseq_lcextrap.nf | 4 ++-- modules/nf-core/software/samtools_sort.nf | 2 +- modules/nf-core/software/subread_featurecounts.nf | 4 ++-- modules/nf-core/software/trimgalore.nf | 10 +++++----- modules/nf-core/software/ucsc_bedgraphtobigwig.nf | 2 +- 16 files changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf index 1b231240f..127bc7003 100644 --- a/modules/nf-core/software/bwa_mem.nf +++ b/modules/nf-core/software/bwa_mem.nf @@ -26,8 +26,8 @@ process BWA_MEM { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - rg = meta.read_group ? "-R ${meta.read_group}" : "" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def rg = meta.read_group ? "-R ${meta.read_group}" : "" """ bwa mem \\ $ioptions.args \\ diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf index 0c505e419..f53662e3e 100644 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ b/modules/nf-core/software/deeptools_computematrix.nf @@ -26,7 +26,7 @@ process DEEPTOOLS_COMPUTEMATRIX { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ computeMatrix \\ $ioptions.args \\ diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf index 9304e836c..ede8a041a 100644 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ b/modules/nf-core/software/deeptools_plotfingerprint.nf @@ -26,8 +26,8 @@ process DEEPTOOLS_PLOTFINGERPRINT { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ plotFingerprint \\ $ioptions.args \\ diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf index 3e8f78d77..9cc740e2d 100644 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ b/modules/nf-core/software/deeptools_plotheatmap.nf @@ -25,7 +25,7 @@ process DEEPTOOLS_PLOTHEATMAP { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ plotHeatmap \\ $ioptions.args \\ diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf index 8b66fd360..7f882525e 100644 --- a/modules/nf-core/software/fastqc.nf +++ b/modules/nf-core/software/fastqc.nf @@ -26,7 +26,7 @@ process FASTQC { // Add soft-links to original FastQs for consistent naming in pipeline def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf index 6045fc587..496f5cc49 100644 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ b/modules/nf-core/software/homer_annotatepeaks.nf @@ -28,7 +28,7 @@ process HOMER_ANNOTATEPEAKS { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ annotatePeaks.pl \\ $peak \\ diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf index 83537a6f2..454f0fb66 100644 --- a/modules/nf-core/software/macs2_callpeak.nf +++ b/modules/nf-core/software/macs2_callpeak.nf @@ -29,9 +29,9 @@ process MACS2_CALLPEAK { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - format = meta.single_end ? 'BAM' : 'BAMPE' - control = controlbam ? "--control $controlbam" : '' + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def format = meta.single_end ? 'BAM' : 'BAMPE' + def control = controlbam ? "--control $controlbam" : '' """ macs2 \\ callpeak \\ diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf index 88dc6493f..7777e1328 100644 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ b/modules/nf-core/software/phantompeakqualtools.nf @@ -28,7 +28,7 @@ process PHANTOMPEAKQUALTOOLS { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf index 09bdefeda..8850d534c 100644 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ b/modules/nf-core/software/picard_collectmultiplemetrics.nf @@ -24,9 +24,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "*.version.txt", emit: version script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf index 7a466324d..8bfed2565 100644 --- a/modules/nf-core/software/picard_markduplicates.nf +++ b/modules/nf-core/software/picard_markduplicates.nf @@ -23,9 +23,9 @@ process PICARD_MARKDUPLICATES { path "*.version.txt", emit: version script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf index ca50913a4..062bbfc85 100644 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ b/modules/nf-core/software/picard_mergesamfiles.nf @@ -22,10 +22,10 @@ process PICARD_MERGESAMFILES { path "*.version.txt", emit: version script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - bam_files = bams.sort() + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def bam_files = bams.sort() def avail_mem = 3 if (!task.memory) { log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf index 9461acc96..26ed3829f 100644 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ b/modules/nf-core/software/preseq_lcextrap.nf @@ -26,8 +26,8 @@ process PRESEQ_LCEXTRAP { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - pe = meta.single_end ? '' : '-pe' + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-pe' """ preseq \\ lc_extrap \\ diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf index 8c038054c..9467e2aea 100644 --- a/modules/nf-core/software/samtools_sort.nf +++ b/modules/nf-core/software/samtools_sort.nf @@ -24,7 +24,7 @@ process SAMTOOLS_SORT { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf index 974ae2814..e8a9667f3 100644 --- a/modules/nf-core/software/subread_featurecounts.nf +++ b/modules/nf-core/software/subread_featurecounts.nf @@ -25,8 +25,8 @@ process SUBREAD_FEATURECOUNTS { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - pe = meta.single_end ? '' : '-p' + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-p' """ featureCounts \\ $ioptions.args \\ diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf index be9b961c3..219b3e659 100644 --- a/modules/nf-core/software/trimgalore.nf +++ b/modules/nf-core/software/trimgalore.nf @@ -37,15 +37,15 @@ process TRIMGALORE { } // Clipping presets have to be evaluated in the context of SE/PE - c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' - c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' - tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' - tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' + def c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' + def c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' + def tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' + def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf index ca12ff0d9..4da63fe1f 100644 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf @@ -27,7 +27,7 @@ process UCSC_BEDRAPHTOBIGWIG { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig echo $VERSION > ${software}.version.txt From 45652afbac053fe1c8ec6cb400c1d8ff7cbaf435 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 17:11:45 +0100 Subject: [PATCH 138/538] Add def everywhere --- modules/local/process/bam_filter.nf | 16 +++++++------- modules/local/process/bam_remove_orphans.nf | 4 ++-- modules/local/process/bedtools_genomecov.nf | 8 +++---- modules/local/process/frip_score.nf | 4 ++-- modules/local/process/functions.nf | 22 +++++++++---------- modules/local/process/get_chrom_sizes.nf | 2 +- .../local/process/get_software_versions.nf | 2 +- modules/local/process/gtf2bed.nf | 2 +- modules/local/process/igv.nf | 2 +- modules/local/process/macs2_consensus.nf | 16 +++++++------- modules/local/process/make_genome_filter.nf | 4 ++-- modules/local/process/multiqc.nf | 14 ++++++------ modules/local/process/multiqc_custom_peaks.nf | 4 ++-- .../multiqc_custom_phantompeakqualtools.nf | 4 ++-- modules/local/process/output_documentation.nf | 2 +- .../local/process/plot_homer_annotatepeaks.nf | 2 +- modules/local/process/plot_macs2_qc.nf | 6 ++--- modules/local/process/samplesheet_check.nf | 2 +- 18 files changed, 58 insertions(+), 58 deletions(-) diff --git a/modules/local/process/bam_filter.nf b/modules/local/process/bam_filter.nf index fd4b6d570..a72f54125 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/process/bam_filter.nf @@ -9,7 +9,7 @@ process BAM_FILTER { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -25,13 +25,13 @@ process BAM_FILTER { path "*.version.txt", emit: version script: - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' - dup_params = params.keep_dups ? '' : '-F 0x0400' - multimap_params = params.keep_multi_map ? '' : '-q 1' - blacklist_params = params.blacklist ? "-L $bed" : '' - config = meta.single_end ? bamtools_filter_se_config : bamtools_filter_pe_config + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' + def dup_params = params.keep_dups ? '' : '-F 0x0400' + def multimap_params = params.keep_multi_map ? '' : '-q 1' + def blacklist_params = params.blacklist ? "-L $bed" : '' + def config = meta.single_end ? bamtools_filter_se_config : bamtools_filter_pe_config """ samtools view \\ $filter_params \\ diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index de9efc737..d37432e9b 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -9,7 +9,7 @@ process BAM_REMOVE_ORPHANS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -22,7 +22,7 @@ process BAM_REMOVE_ORPHANS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/process/bedtools_genomecov.nf index 9eac32aab..21464e905 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/process/bedtools_genomecov.nf @@ -6,7 +6,7 @@ process BEDTOOLS_GENOMECOV { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" @@ -25,9 +25,9 @@ process BEDTOOLS_GENOMECOV { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - pe = meta.single_end ? '' : '-pc' - extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-pc' + def extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' """ SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt diff --git a/modules/local/process/frip_score.nf b/modules/local/process/frip_score.nf index 9399851d4..1fd0a7b41 100644 --- a/modules/local/process/frip_score.nf +++ b/modules/local/process/frip_score.nf @@ -6,7 +6,7 @@ process FRIP_SCORE { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -19,7 +19,7 @@ process FRIP_SCORE { script: def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $ioptions.args | awk -F '\t' '{sum += \$NF} END {print sum}') samtools flagstat $bam > ${bam}.flagstat diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index a2c0d6ce1..75553cdf5 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -29,31 +29,31 @@ def initOptions(Map args) { * Tidy up and join elements of a list to return a path string */ def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') } /* * Function to save/publish module results */ -def saveFiles(filename, options, publish_dir='', publish_id='') { - if (!filename.endsWith('.version.txt')) { - def ioptions = initOptions(options) - def path_list = [ ioptions.publish_dir ?: publish_dir ] +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] if (ioptions.publish_by_id) { - path_list.add(publish_id) + path_list.add(args.publish_id) } if (ioptions.publish_files instanceof Map) { for (ext in ioptions.publish_files) { - if (filename.endsWith(ext.key)) { + if (args.filename.endsWith(ext.key)) { def ext_list = path_list.collect() ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$filename" + return "${getPathFromList(ext_list)}/$args.filename" } } } else { - return "${getPathFromList(path_list)}/$filename" + return "${getPathFromList(path_list)}/$args.filename" } } } diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/process/get_chrom_sizes.nf index 99e22122b..e929db2d4 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/process/get_chrom_sizes.nf @@ -8,7 +8,7 @@ process GET_CHROM_SIZES { tag "$fasta" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } container "quay.io/biocontainers/samtools:1.10--h9402c20_2" //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf index 1163b2681..db1cab64a 100644 --- a/modules/local/process/get_software_versions.nf +++ b/modules/local/process/get_software_versions.nf @@ -7,7 +7,7 @@ include { saveFiles } from './functions' process GET_SOFTWARE_VERSIONS { publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } input: path versions diff --git a/modules/local/process/gtf2bed.nf b/modules/local/process/gtf2bed.nf index 063b220fe..4258b2379 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/process/gtf2bed.nf @@ -9,7 +9,7 @@ process GTF2BED { label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } container "quay.io/biocontainers/perl:5.26.2" //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" diff --git a/modules/local/process/igv.nf b/modules/local/process/igv.nf index 7e7faca2c..c13aa3503 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/process/igv.nf @@ -7,7 +7,7 @@ include { saveFiles } from './functions' process IGV { publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/process/macs2_consensus.nf index 18cef6e54..b3ba35ff4 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/process/macs2_consensus.nf @@ -9,7 +9,7 @@ process MACS2_CONSENSUS { label 'process_long' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -26,13 +26,13 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" - peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') - collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') - expandparam = params.narrow_peak ? '--is_narrow_peak' : '' + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') + def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') + def expandparam = params.narrow_peak ? '--is_narrow_peak' : '' """ sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/process/make_genome_filter.nf index 1910d6f2d..042fcdc49 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/process/make_genome_filter.nf @@ -8,7 +8,7 @@ process MAKE_GENOME_FILTER { tag "$sizes" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="genome", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" @@ -26,7 +26,7 @@ process MAKE_GENOME_FILTER { script: def software = 'bedtools' - file_out = "${sizes.simpleName}.include_regions.bed" + def file_out = "${sizes.simpleName}.include_regions.bed" if (params.blacklist) { """ sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out diff --git a/modules/local/process/multiqc.nf b/modules/local/process/multiqc.nf index f90de009f..3a9865f8e 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/process/multiqc.nf @@ -12,7 +12,7 @@ process MULTIQC { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:'') } container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" //container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" @@ -65,12 +65,12 @@ process MULTIQC { path "*_data", emit: data script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' - custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def rtitle = custom_runName ? "--title \"$custom_runName\"" : '' + def rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + def custom_config = params.multiqc_config ? "--config $mqc_custom_config" : '' """ - multiqc -f $ioptions.args $rtitle $rfilename $custom_config_file . + multiqc -f $ioptions.args $rtitle $rfilename $custom_config . """ } diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/process/multiqc_custom_peaks.nf index 8e10a1bd6..0d152242b 100644 --- a/modules/local/process/multiqc_custom_peaks.nf +++ b/modules/local/process/multiqc_custom_peaks.nf @@ -5,7 +5,7 @@ process MULTIQC_CUSTOM_PEAKS { tag "$meta.id" publishDir "${params.outdir} ", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -22,7 +22,7 @@ process MULTIQC_CUSTOM_PEAKS { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv diff --git a/modules/local/process/multiqc_custom_phantompeakqualtools.nf b/modules/local/process/multiqc_custom_phantompeakqualtools.nf index cbd38c255..a49fbf17c 100644 --- a/modules/local/process/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/process/multiqc_custom_phantompeakqualtools.nf @@ -5,7 +5,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=getSoftwareName(task.process), publish_id=meta.id) } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -24,7 +24,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" diff --git a/modules/local/process/output_documentation.nf b/modules/local/process/output_documentation.nf index a07c9e973..86aaae1bd 100644 --- a/modules/local/process/output_documentation.nf +++ b/modules/local/process/output_documentation.nf @@ -7,7 +7,7 @@ include { saveFiles } from './functions' process OUTPUT_DOCUMENTATION { publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/process/plot_homer_annotatepeaks.nf index 649a0cfd3..c474cfc66 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/process/plot_homer_annotatepeaks.nf @@ -8,7 +8,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } conda (params.conda ? "${baseDir}/environment.yml" : null) diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/process/plot_macs2_qc.nf index d40a8d954..ee3065f03 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/process/plot_macs2_qc.nf @@ -8,7 +8,7 @@ process PLOT_MACS2_QC { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir=task.process.toLowerCase(), publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } conda (params.conda ? "${baseDir}/environment.yml" : null) @@ -21,8 +21,8 @@ process PLOT_MACS2_QC { path '*.pdf', emit: pdf script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def ioptions = initOptions(options) - peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def ioptions = initOptions(options) + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' """ plot_macs2_qc.r \\ -i ${peaks.join(',')} \\ diff --git a/modules/local/process/samplesheet_check.nf b/modules/local/process/samplesheet_check.nf index 5c393ed39..c4057e977 100644 --- a/modules/local/process/samplesheet_check.nf +++ b/modules/local/process/samplesheet_check.nf @@ -8,7 +8,7 @@ process SAMPLESHEET_CHECK { tag "$samplesheet" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename=filename, options=options, publish_dir="pipeline_info", publish_id='') } + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } conda (params.conda ? "${baseDir}/environment.yml" : null) From 67bb690d4a8e7394615df067ef3ec133bd9367d6 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 17:14:28 +0100 Subject: [PATCH 139/538] Update CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3168b40b..2a1170ab0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Added` * Move template boilerplate code to Groovy `lib/` -* Implement pipeline in DSL 2 +* Implement pipeline in DSL2 +* Update template to tools `1.10.2` ### `Fixed` From 00a431a2659986a6806b6cdb46605a2ff90416e9 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 4 Aug 2020 17:32:03 +0100 Subject: [PATCH 140/538] Remove def because prefix required in output section of process --- modules/local/process/bam_remove_orphans.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/process/bam_remove_orphans.nf index d37432e9b..9d6e001ef 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/process/bam_remove_orphans.nf @@ -22,7 +22,7 @@ process BAM_REMOVE_ORPHANS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam From 6d57fd2f97d121525cc473c484d75088e922e57c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 17:54:44 +0100 Subject: [PATCH 141/538] Remove initial nf-core modules --- modules/nf-core/software/bwa_index.nf | 31 -------- modules/nf-core/software/bwa_mem.nf | 42 ---------- .../software/deeptools_computematrix.nf | 41 ---------- .../software/deeptools_plotfingerprint.nf | 43 ---------- .../nf-core/software/deeptools_plotheatmap.nf | 38 --------- .../nf-core/software/deeptools_plotprofile.nf | 38 --------- modules/nf-core/software/fastqc.nf | 44 ----------- modules/nf-core/software/functions.nf | 59 -------------- .../nf-core/software/homer_annotatepeaks.nf | 43 ---------- modules/nf-core/software/macs2_callpeak.nf | 47 ----------- .../nf-core/software/phantompeakqualtools.nf | 37 --------- .../software/picard_collectmultiplemetrics.nf | 47 ----------- .../nf-core/software/picard_markduplicates.nf | 46 ----------- .../nf-core/software/picard_mergesamfiles.nf | 51 ------------ modules/nf-core/software/preseq_lcextrap.nf | 42 ---------- modules/nf-core/software/samtools_flagstat.nf | 29 ------- modules/nf-core/software/samtools_idxstats.nf | 29 ------- modules/nf-core/software/samtools_index.nf | 29 ------- modules/nf-core/software/samtools_sort.nf | 32 -------- modules/nf-core/software/samtools_stats.nf | 29 ------- .../nf-core/software/subread_featurecounts.nf | 41 ---------- modules/nf-core/software/trimgalore.nf | 79 ------------------- .../nf-core/software/ucsc_bedgraphtobigwig.nf | 35 -------- 23 files changed, 952 deletions(-) delete mode 100644 modules/nf-core/software/bwa_index.nf delete mode 100644 modules/nf-core/software/bwa_mem.nf delete mode 100644 modules/nf-core/software/deeptools_computematrix.nf delete mode 100644 modules/nf-core/software/deeptools_plotfingerprint.nf delete mode 100644 modules/nf-core/software/deeptools_plotheatmap.nf delete mode 100644 modules/nf-core/software/deeptools_plotprofile.nf delete mode 100644 modules/nf-core/software/fastqc.nf delete mode 100644 modules/nf-core/software/functions.nf delete mode 100644 modules/nf-core/software/homer_annotatepeaks.nf delete mode 100644 modules/nf-core/software/macs2_callpeak.nf delete mode 100644 modules/nf-core/software/phantompeakqualtools.nf delete mode 100644 modules/nf-core/software/picard_collectmultiplemetrics.nf delete mode 100644 modules/nf-core/software/picard_markduplicates.nf delete mode 100644 modules/nf-core/software/picard_mergesamfiles.nf delete mode 100644 modules/nf-core/software/preseq_lcextrap.nf delete mode 100644 modules/nf-core/software/samtools_flagstat.nf delete mode 100644 modules/nf-core/software/samtools_idxstats.nf delete mode 100644 modules/nf-core/software/samtools_index.nf delete mode 100644 modules/nf-core/software/samtools_sort.nf delete mode 100644 modules/nf-core/software/samtools_stats.nf delete mode 100644 modules/nf-core/software/subread_featurecounts.nf delete mode 100644 modules/nf-core/software/trimgalore.nf delete mode 100644 modules/nf-core/software/ucsc_bedgraphtobigwig.nf diff --git a/modules/nf-core/software/bwa_index.nf b/modules/nf-core/software/bwa_index.nf deleted file mode 100644 index 38b86c1fb..000000000 --- a/modules/nf-core/software/bwa_index.nf +++ /dev/null @@ -1,31 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process BWA_INDEX { - tag "$fasta" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:'') } - - container "biocontainers/bwa:v0.7.17_cv1" - //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" - - conda (params.conda ? "bioconda::bwa=0.7.17" : null) - - input: - path fasta - val options - - output: - path "${fasta}.*", emit: index - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - """ - bwa index $ioptions.args $fasta - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/bwa_mem.nf b/modules/nf-core/software/bwa_mem.nf deleted file mode 100644 index 127bc7003..000000000 --- a/modules/nf-core/software/bwa_mem.nf +++ /dev/null @@ -1,42 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process BWA_MEM { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" - //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" - - conda (params.conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(reads) - path index - path fasta - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def rg = meta.read_group ? "-R ${meta.read_group}" : "" - """ - bwa mem \\ - $ioptions.args \\ - $rg \\ - -t $task.cpus \\ - $fasta \\ - $reads \\ - | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - - - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/deeptools_computematrix.nf b/modules/nf-core/software/deeptools_computematrix.nf deleted file mode 100644 index f53662e3e..000000000 --- a/modules/nf-core/software/deeptools_computematrix.nf +++ /dev/null @@ -1,41 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process DEEPTOOLS_COMPUTEMATRIX { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/deeptools:3.4.3--py_0" - //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - - conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - - input: - tuple val(meta), path(bigwig) - path bed - val options - - output: - tuple val(meta), path("*.mat.gz"), emit: matrix - tuple val(meta), path("*.mat.tab"), emit: table - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - computeMatrix \\ - $ioptions.args \\ - --regionsFileName $bed \\ - --scoreFileName $bigwig \\ - --outFileName ${prefix}.computeMatrix.mat.gz \\ - --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ - --numberOfProcessors $task.cpus - - computeMatrix --version | sed -e "s/computeMatrix //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/deeptools_plotfingerprint.nf b/modules/nf-core/software/deeptools_plotfingerprint.nf deleted file mode 100644 index ede8a041a..000000000 --- a/modules/nf-core/software/deeptools_plotfingerprint.nf +++ /dev/null @@ -1,43 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process DEEPTOOLS_PLOTFINGERPRINT { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/deeptools:3.4.3--py_0" - //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - - conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - - input: - tuple val(meta), path(bams), path(bais) - val options - - output: - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.raw.txt"), emit: matrix - tuple val(meta), path("*.qcmetrics.txt"), emit: metrics - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' - """ - plotFingerprint \\ - $ioptions.args \\ - $extend \\ - --bamfiles ${bams.join(' ')} \\ - --plotFile ${prefix}.plotFingerprint.pdf \\ - --outRawCounts ${prefix}.plotFingerprint.raw.txt \\ - --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ - --numberOfProcessors $task.cpus - - plotFingerprint --version | sed -e "s/plotFingerprint //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/deeptools_plotheatmap.nf b/modules/nf-core/software/deeptools_plotheatmap.nf deleted file mode 100644 index 9cc740e2d..000000000 --- a/modules/nf-core/software/deeptools_plotheatmap.nf +++ /dev/null @@ -1,38 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process DEEPTOOLS_PLOTHEATMAP { - tag "$meta.id" - label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/deeptools:3.4.3--py_0" - //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - - conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - - input: - tuple val(meta), path(matrix) - val options - - output: - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.tab"), emit: table - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - plotHeatmap \\ - $ioptions.args \\ - --matrixFile $matrix \\ - --outFileName ${prefix}.plotHeatmap.pdf \\ - --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab - - plotHeatmap --version | sed -e "s/plotHeatmap //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/deeptools_plotprofile.nf b/modules/nf-core/software/deeptools_plotprofile.nf deleted file mode 100644 index a822066b8..000000000 --- a/modules/nf-core/software/deeptools_plotprofile.nf +++ /dev/null @@ -1,38 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process DEEPTOOLS_PLOTPROFILE { - tag "$meta.id" - label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/deeptools:3.4.3--py_0" - //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" - - conda (params.conda ? "bioconda::deeptools=3.4.3" : null) - - input: - tuple val(meta), path(matrix) - val options - - output: - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.tab"), emit: table - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - plotProfile \\ - $ioptions.args \\ - --matrixFile $matrix \\ - --outFileName ${prefix}.plotProfile.pdf \\ - --outFileNameData ${prefix}.plotProfile.tab - - plotProfile --version | sed -e "s/plotProfile //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/fastqc.nf b/modules/nf-core/software/fastqc.nf deleted file mode 100644 index 7f882525e..000000000 --- a/modules/nf-core/software/fastqc.nf +++ /dev/null @@ -1,44 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process FASTQC { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/fastqc:0.11.9--0" - //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - - conda (params.conda ? "bioconda::fastqc=0.11.9" : null) - - input: - tuple val(meta), path(reads) - val options - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip"), emit: zip - path "*.version.txt", emit: version - - script: - // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $ioptions.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $ioptions.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt - """ - } -} diff --git a/modules/nf-core/software/functions.nf b/modules/nf-core/software/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/homer_annotatepeaks.nf b/modules/nf-core/software/homer_annotatepeaks.nf deleted file mode 100644 index 496f5cc49..000000000 --- a/modules/nf-core/software/homer_annotatepeaks.nf +++ /dev/null @@ -1,43 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -def VERSION = '4.11' - -process HOMER_ANNOTATEPEAKS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" - //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" - - conda (params.conda ? "bioconda::homer=4.11" : null) - - input: - tuple val(meta), path(peak) - path fasta - path gtf - val options - - output: - tuple val(meta), path("*annotatePeaks.txt"), emit: txt - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - annotatePeaks.pl \\ - $peak \\ - $fasta \\ - $ioptions.args \\ - -gtf $gtf \\ - -cpu $task.cpus \\ - > ${prefix}.annotatePeaks.txt - - echo $VERSION > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/macs2_callpeak.nf b/modules/nf-core/software/macs2_callpeak.nf deleted file mode 100644 index 454f0fb66..000000000 --- a/modules/nf-core/software/macs2_callpeak.nf +++ /dev/null @@ -1,47 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process MACS2_CALLPEAK { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" - //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" - - conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) - - input: - tuple val(meta), path(ipbam), path(controlbam) - val macs2_gsize - val options - - output: - tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak - tuple val(meta), path("*.xls"), emit: xls - tuple val(meta), path("*.gappedPeak"), emit: gapped optional true - tuple val(meta), path("*.bed"), emit: bed optional true - tuple val(meta), path("*.bdg"), emit: bdg optional true - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def format = meta.single_end ? 'BAM' : 'BAMPE' - def control = controlbam ? "--control $controlbam" : '' - """ - macs2 \\ - callpeak \\ - $ioptions.args \\ - --gsize $macs2_gsize \\ - --format $format \\ - --name $prefix \\ - --treatment $ipbam \\ - $control - - macs2 --version | sed -e "s/macs2 //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/phantompeakqualtools.nf b/modules/nf-core/software/phantompeakqualtools.nf deleted file mode 100644 index 7777e1328..000000000 --- a/modules/nf-core/software/phantompeakqualtools.nf +++ /dev/null @@ -1,37 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -def VERSION = '1.2.2' - -process PHANTOMPEAKQUALTOOLS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" - //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" - - conda (params.conda ? "bioconda::phantompeakqualtools=1.2.2" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.out"), emit: spp - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.Rdata"), emit: rdata - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - RUN_SPP=`which run_spp.R` - Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus - echo $VERSION > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/picard_collectmultiplemetrics.nf b/modules/nf-core/software/picard_collectmultiplemetrics.nf deleted file mode 100644 index 8850d534c..000000000 --- a/modules/nf-core/software/picard_collectmultiplemetrics.nf +++ /dev/null @@ -1,47 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_COLLECTMULTIPLEMETRICS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bam) - path fasta - val options - - output: - tuple val(meta), path("*_metrics"), emit: metrics - tuple val(meta), path("*.pdf"), emit: pdf - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - picard \\ - -Xmx${avail_mem}g \\ - CollectMultipleMetrics \\ - $ioptions.args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.CollectMultipleMetrics \\ - REFERENCE_SEQUENCE=$fasta - - echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/picard_markduplicates.nf b/modules/nf-core/software/picard_markduplicates.nf deleted file mode 100644 index 8bfed2565..000000000 --- a/modules/nf-core/software/picard_markduplicates.nf +++ /dev/null @@ -1,46 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_MARKDUPLICATES { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.metrics.txt"), emit: metrics - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - picard \\ - -Xmx${avail_mem}g \\ - MarkDuplicates \\ - $ioptions.args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.bam \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt - - echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/picard_mergesamfiles.nf b/modules/nf-core/software/picard_mergesamfiles.nf deleted file mode 100644 index 062bbfc85..000000000 --- a/modules/nf-core/software/picard_mergesamfiles.nf +++ /dev/null @@ -1,51 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_MERGESAMFILES { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bams) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def bam_files = bams.sort() - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - if (bam_files.size() > 1) { - """ - picard \\ - -Xmx${avail_mem}g \\ - MergeSamFiles \\ - $ioptions.args \\ - ${'INPUT='+bam_files.join(' INPUT=')} \\ - OUTPUT=${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ - } else { - """ - ln -s ${bam_files[0]} ${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ - } -} diff --git a/modules/nf-core/software/preseq_lcextrap.nf b/modules/nf-core/software/preseq_lcextrap.nf deleted file mode 100644 index 26ed3829f..000000000 --- a/modules/nf-core/software/preseq_lcextrap.nf +++ /dev/null @@ -1,42 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PRESEQ_LCEXTRAP { - tag "$meta.id" - label 'process_medium' - label 'error_ignore' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" - //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" - - conda (params.conda ? "bioconda::preseq=2.0.3" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.ccurve.txt"), emit: ccurve - tuple val(meta), path("*.log"), emit: log - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def pe = meta.single_end ? '' : '-pe' - """ - preseq \\ - lc_extrap \\ - $ioptions.args \\ - $pe \\ - -output ${prefix}.ccurve.txt \\ - $bam - cp .command.err ${prefix}.command.log - - echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/samtools_flagstat.nf b/modules/nf-core/software/samtools_flagstat.nf deleted file mode 100644 index 4c14a41ae..000000000 --- a/modules/nf-core/software/samtools_flagstat.nf +++ /dev/null @@ -1,29 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_FLAGSTAT { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.flagstat"), emit: flagstat - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools flagstat $bam > ${bam}.flagstat - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/samtools_idxstats.nf b/modules/nf-core/software/samtools_idxstats.nf deleted file mode 100644 index 9805bb141..000000000 --- a/modules/nf-core/software/samtools_idxstats.nf +++ /dev/null @@ -1,29 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_IDXSTATS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.idxstats"), emit: idxstats - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools idxstats $bam > ${bam}.idxstats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/samtools_index.nf b/modules/nf-core/software/samtools_index.nf deleted file mode 100644 index 456e2663d..000000000 --- a/modules/nf-core/software/samtools_index.nf +++ /dev/null @@ -1,29 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_INDEX { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bai"), emit: bai - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools index $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/samtools_sort.nf b/modules/nf-core/software/samtools_sort.nf deleted file mode 100644 index 9467e2aea..000000000 --- a/modules/nf-core/software/samtools_sort.nf +++ /dev/null @@ -1,32 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_SORT { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/samtools_stats.nf b/modules/nf-core/software/samtools_stats.nf deleted file mode 100644 index 52d5e2d74..000000000 --- a/modules/nf-core/software/samtools_stats.nf +++ /dev/null @@ -1,29 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_STATS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.stats"), emit: stats - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools stats $bam > ${bam}.stats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/subread_featurecounts.nf b/modules/nf-core/software/subread_featurecounts.nf deleted file mode 100644 index e8a9667f3..000000000 --- a/modules/nf-core/software/subread_featurecounts.nf +++ /dev/null @@ -1,41 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SUBREAD_FEATURECOUNTS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" - //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" - - conda (params.conda ? "bioconda::subread=2.0.1" : null) - - input: - tuple val(meta), path(bams), path(annotation) - val options - - output: - tuple val(meta), path("*featureCounts.txt"), emit: txt - tuple val(meta), path("*featureCounts.txt.summary"), emit: summary - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def pe = meta.single_end ? '' : '-p' - """ - featureCounts \\ - $ioptions.args \\ - $pe \\ - -T $task.cpus \\ - -a $annotation \\ - -o ${prefix}.featureCounts.txt \\ - ${bams.join(' ')} - - echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/trimgalore.nf b/modules/nf-core/software/trimgalore.nf deleted file mode 100644 index 219b3e659..000000000 --- a/modules/nf-core/software/trimgalore.nf +++ /dev/null @@ -1,79 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process TRIMGALORE { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/trim-galore:0.6.5--0" - //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" - - conda (params.conda ? "bioconda::trim-galore=0.6.5" : null) - - input: - tuple val(meta), path(reads) - val options - - output: - tuple val(meta), path("*.fq.gz"), emit: reads - tuple val(meta), path("*.html"), emit: html optional true - tuple val(meta), path("*.zip"), emit: zip optional true - tuple val(meta), path("*report.txt"), emit: log - path "*.version.txt", emit: version - - script: - // Calculate number of --cores for TrimGalore based on value of task.cpus - // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 - // See: https://github.com/nf-core/atacseq/pull/65 - def cores = 1 - if (task.cpus) { - cores = (task.cpus as int) - 4 - if (meta.single_end) cores = (task.cpus as int) - 3 - if (cores < 1) cores = 1 - if (cores > 4) cores = 4 - } - - // Clipping presets have to be evaluated in the context of SE/PE - def c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' - def c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' - def tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' - def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' - - // Added soft-links to original fastqs for consistent naming in MultiQC - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - trim_galore \\ - $ioptions.args \\ - --cores $cores \\ - --gzip \\ - $c_r1 \\ - $tpc_r1 \\ - ${prefix}.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - trim_galore \\ - $ioptions.args \\ - --cores $cores \\ - --paired \\ - --gzip \\ - $c_r1 \\ - $c_r2 \\ - $tpc_r1 \\ - $tpc_r2 \\ - ${prefix}_1.fastq.gz \\ - ${prefix}_2.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt - """ - } -} diff --git a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf b/modules/nf-core/software/ucsc_bedgraphtobigwig.nf deleted file mode 100644 index 4da63fe1f..000000000 --- a/modules/nf-core/software/ucsc_bedgraphtobigwig.nf +++ /dev/null @@ -1,35 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -def VERSION = '377' - -process UCSC_BEDRAPHTOBIGWIG { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" - //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" - - conda (params.conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) - - input: - tuple val(meta), path(bedgraph) - path sizes - val options - - output: - tuple val(meta), path("*.bigWig"), emit: bigwig - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig - echo $VERSION > ${software}.version.txt - """ -} From 93034f58a0e3ad46497c053f1ab1e28b97e6fd1c Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 17:54:56 +0100 Subject: [PATCH 142/538] Change module paths --- modules/nf-core/subworkflow/bam_sort_samtools.nf | 4 ++-- modules/nf-core/subworkflow/bam_stats_samtools.nf | 6 +++--- modules/nf-core/subworkflow/map_bwa_mem.nf | 2 +- modules/nf-core/subworkflow/mark_duplicates_picard.nf | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/nf-core/subworkflow/bam_sort_samtools.nf b/modules/nf-core/subworkflow/bam_sort_samtools.nf index c58c23ac7..7c42591cc 100644 --- a/modules/nf-core/subworkflow/bam_sort_samtools.nf +++ b/modules/nf-core/subworkflow/bam_sort_samtools.nf @@ -2,8 +2,8 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { SAMTOOLS_SORT } from '../software/samtools_sort' -include { SAMTOOLS_INDEX } from '../software/samtools_index' +include { SAMTOOLS_SORT } from '../software/samtools/sort' +include { SAMTOOLS_INDEX } from '../software/samtools/index' include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow BAM_SORT_SAMTOOLS { diff --git a/modules/nf-core/subworkflow/bam_stats_samtools.nf b/modules/nf-core/subworkflow/bam_stats_samtools.nf index 9178106b1..c4e55377b 100644 --- a/modules/nf-core/subworkflow/bam_stats_samtools.nf +++ b/modules/nf-core/subworkflow/bam_stats_samtools.nf @@ -2,9 +2,9 @@ * Run SAMtools stats, flagstat and idxstats */ -include { SAMTOOLS_STATS } from '../software/samtools_stats' -include { SAMTOOLS_IDXSTATS } from '../software/samtools_idxstats' -include { SAMTOOLS_FLAGSTAT } from '../software/samtools_flagstat' +include { SAMTOOLS_STATS } from '../software/samtools/stats' +include { SAMTOOLS_IDXSTATS } from '../software/samtools/idxstats' +include { SAMTOOLS_FLAGSTAT } from '../software/samtools/flagstat' workflow BAM_STATS_SAMTOOLS { take: diff --git a/modules/nf-core/subworkflow/map_bwa_mem.nf b/modules/nf-core/subworkflow/map_bwa_mem.nf index 008c2dc3f..92b53260f 100644 --- a/modules/nf-core/subworkflow/map_bwa_mem.nf +++ b/modules/nf-core/subworkflow/map_bwa_mem.nf @@ -2,7 +2,7 @@ * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { BWA_MEM } from '../software/bwa_mem' +include { BWA_MEM } from '../software/bwa/mem' include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow MAP_BWA_MEM { diff --git a/modules/nf-core/subworkflow/mark_duplicates_picard.nf b/modules/nf-core/subworkflow/mark_duplicates_picard.nf index 9bec786f3..10ade11e9 100644 --- a/modules/nf-core/subworkflow/mark_duplicates_picard.nf +++ b/modules/nf-core/subworkflow/mark_duplicates_picard.nf @@ -2,8 +2,8 @@ * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { PICARD_MARKDUPLICATES } from '../software/picard_markduplicates' -include { SAMTOOLS_INDEX } from '../software/samtools_index' +include { PICARD_MARKDUPLICATES } from '../software/picard/markduplicates' +include { SAMTOOLS_INDEX } from '../software/samtools/index' include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow MARK_DUPLICATES_PICARD { From 2dfed396eaacea9bfabe117ea76bb1f89f3a375a Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 17:55:15 +0100 Subject: [PATCH 143/538] Strip whitespace from outdir --- modules/local/process/multiqc_custom_peaks.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/process/multiqc_custom_peaks.nf index 0d152242b..f98ee9bae 100644 --- a/modules/local/process/multiqc_custom_peaks.nf +++ b/modules/local/process/multiqc_custom_peaks.nf @@ -3,7 +3,7 @@ include { initOptions; saveFiles; getSoftwareName } from './functions' process MULTIQC_CUSTOM_PEAKS { tag "$meta.id" - publishDir "${params.outdir} ", + publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } From f92b2aef2846f1dec634c96b6bc157b51d059779 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 17:57:08 +0100 Subject: [PATCH 144/538] Change module paths --- main.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/main.nf b/main.nf index 114dac5ec..8970be09f 100755 --- a/main.nf +++ b/main.nf @@ -155,20 +155,20 @@ include { BAM_CLEAN } from './modules/local/subworkflo /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ //////////////////////////////////////////////////// -include { BWA_INDEX } from './modules/nf-core/software/bwa_index' -include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard_mergesamfiles' -include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard_collectmultiplemetrics' -include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq_lcextrap' -include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc_bedgraphtobigwig' -include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools_computematrix' -include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools_plotprofile' -include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools_plotheatmap' -include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools_plotfingerprint' +include { BWA_INDEX } from './modules/nf-core/software/bwa/index' +include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard/mergesamfiles' +include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard/collectmultiplemetrics' +include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq/lcextrap' +include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc/bedgraphtobigwig' +include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools/computematrix' +include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools/plotprofile' +include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools/plotheatmap' +include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools/plotfingerprint' include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools' -include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2_callpeak' +include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2/callpeak' include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 - HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer_annotatepeaks' -include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread_featurecounts' + HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer/annotatepeaks' +include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread/featurecounts' include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' include { MAP_BWA_MEM } from './modules/nf-core/subworkflow/map_bwa_mem' From 94c50f4b378293846a9c85dfd1b2966ee9fbc276 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 18:02:08 +0100 Subject: [PATCH 145/538] First time installing directly from nf-core modules --- .../nf-core/software/bwa/index/functions.nf | 1 + modules/nf-core/software/bwa/index/main.nf | 31 ++++++++ modules/nf-core/software/bwa/index/meta.yml | 25 ++++++ modules/nf-core/software/bwa/mem/functions.nf | 1 + modules/nf-core/software/bwa/mem/main.nf | 42 ++++++++++ modules/nf-core/software/bwa/mem/meta.yml | 42 ++++++++++ .../deeptools/computematrix/functions.nf | 1 + .../software/deeptools/computematrix/main.nf | 41 ++++++++++ .../deeptools/plotfingerprint/functions.nf | 1 + .../deeptools/plotfingerprint/main.nf | 43 ++++++++++ .../deeptools/plotheatmap/functions.nf | 1 + .../software/deeptools/plotheatmap/main.nf | 38 +++++++++ .../deeptools/plotprofile/functions.nf | 1 + .../software/deeptools/plotprofile/main.nf | 38 +++++++++ modules/nf-core/software/fastqc/functions.nf | 1 + modules/nf-core/software/fastqc/main.nf | 44 +++++++++++ modules/nf-core/software/fastqc/meta.yml | 63 +++++++++++++++ .../software/homer/annotatepeaks/functions.nf | 1 + .../software/homer/annotatepeaks/main.nf | 43 ++++++++++ .../software/macs2/callpeak/functions.nf | 1 + .../nf-core/software/macs2/callpeak/main.nf | 47 +++++++++++ .../phantompeakqualtools/functions.nf | 1 + .../software/phantompeakqualtools/main.nf | 37 +++++++++ .../collectmultiplemetrics/functions.nf | 1 + .../picard/collectmultiplemetrics/main.nf | 47 +++++++++++ .../picard/markduplicates/functions.nf | 1 + .../software/picard/markduplicates/main.nf | 46 +++++++++++ .../picard/mergesamfiles/functions.nf | 1 + .../software/picard/mergesamfiles/main.nf | 51 ++++++++++++ .../software/preseq/lcextrap/functions.nf | 1 + .../nf-core/software/preseq/lcextrap/main.nf | 42 ++++++++++ .../software/samtools/flagstat/functions.nf | 1 + .../software/samtools/flagstat/main.nf | 29 +++++++ .../software/samtools/idxstats/functions.nf | 1 + .../software/samtools/idxstats/main.nf | 29 +++++++ .../software/samtools/index/functions.nf | 1 + .../nf-core/software/samtools/index/main.nf | 29 +++++++ .../nf-core/software/samtools/index/meta.yml | 27 +++++++ .../software/samtools/sort/functions.nf | 1 + .../nf-core/software/samtools/sort/main.nf | 32 ++++++++ .../nf-core/software/samtools/sort/meta.yml | 27 +++++++ .../software/samtools/stats/functions.nf | 1 + .../nf-core/software/samtools/stats/main.nf | 29 +++++++ .../subread/featurecounts/functions.nf | 1 + .../software/subread/featurecounts/main.nf | 41 ++++++++++ .../nf-core/software/trimgalore/functions.nf | 1 + modules/nf-core/software/trimgalore/main.nf | 79 +++++++++++++++++++ modules/nf-core/software/trimgalore/meta.yml | 40 ++++++++++ .../ucsc/bedgraphtobigwig/functions.nf | 1 + .../software/ucsc/bedgraphtobigwig/main.nf | 35 ++++++++ 50 files changed, 1139 insertions(+) create mode 100644 modules/nf-core/software/bwa/index/functions.nf create mode 100644 modules/nf-core/software/bwa/index/main.nf create mode 100644 modules/nf-core/software/bwa/index/meta.yml create mode 100644 modules/nf-core/software/bwa/mem/functions.nf create mode 100644 modules/nf-core/software/bwa/mem/main.nf create mode 100644 modules/nf-core/software/bwa/mem/meta.yml create mode 100644 modules/nf-core/software/deeptools/computematrix/functions.nf create mode 100644 modules/nf-core/software/deeptools/computematrix/main.nf create mode 100644 modules/nf-core/software/deeptools/plotfingerprint/functions.nf create mode 100644 modules/nf-core/software/deeptools/plotfingerprint/main.nf create mode 100644 modules/nf-core/software/deeptools/plotheatmap/functions.nf create mode 100644 modules/nf-core/software/deeptools/plotheatmap/main.nf create mode 100644 modules/nf-core/software/deeptools/plotprofile/functions.nf create mode 100644 modules/nf-core/software/deeptools/plotprofile/main.nf create mode 100644 modules/nf-core/software/fastqc/functions.nf create mode 100644 modules/nf-core/software/fastqc/main.nf create mode 100644 modules/nf-core/software/fastqc/meta.yml create mode 100644 modules/nf-core/software/homer/annotatepeaks/functions.nf create mode 100644 modules/nf-core/software/homer/annotatepeaks/main.nf create mode 100644 modules/nf-core/software/macs2/callpeak/functions.nf create mode 100644 modules/nf-core/software/macs2/callpeak/main.nf create mode 100644 modules/nf-core/software/phantompeakqualtools/functions.nf create mode 100644 modules/nf-core/software/phantompeakqualtools/main.nf create mode 100644 modules/nf-core/software/picard/collectmultiplemetrics/functions.nf create mode 100644 modules/nf-core/software/picard/collectmultiplemetrics/main.nf create mode 100644 modules/nf-core/software/picard/markduplicates/functions.nf create mode 100644 modules/nf-core/software/picard/markduplicates/main.nf create mode 100644 modules/nf-core/software/picard/mergesamfiles/functions.nf create mode 100644 modules/nf-core/software/picard/mergesamfiles/main.nf create mode 100644 modules/nf-core/software/preseq/lcextrap/functions.nf create mode 100644 modules/nf-core/software/preseq/lcextrap/main.nf create mode 100644 modules/nf-core/software/samtools/flagstat/functions.nf create mode 100644 modules/nf-core/software/samtools/flagstat/main.nf create mode 100644 modules/nf-core/software/samtools/idxstats/functions.nf create mode 100644 modules/nf-core/software/samtools/idxstats/main.nf create mode 100644 modules/nf-core/software/samtools/index/functions.nf create mode 100644 modules/nf-core/software/samtools/index/main.nf create mode 100644 modules/nf-core/software/samtools/index/meta.yml create mode 100644 modules/nf-core/software/samtools/sort/functions.nf create mode 100644 modules/nf-core/software/samtools/sort/main.nf create mode 100644 modules/nf-core/software/samtools/sort/meta.yml create mode 100644 modules/nf-core/software/samtools/stats/functions.nf create mode 100644 modules/nf-core/software/samtools/stats/main.nf create mode 100644 modules/nf-core/software/subread/featurecounts/functions.nf create mode 100644 modules/nf-core/software/subread/featurecounts/main.nf create mode 100644 modules/nf-core/software/trimgalore/functions.nf create mode 100644 modules/nf-core/software/trimgalore/main.nf create mode 100644 modules/nf-core/software/trimgalore/meta.yml create mode 100644 modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf create mode 100644 modules/nf-core/software/ucsc/bedgraphtobigwig/main.nf diff --git a/modules/nf-core/software/bwa/index/functions.nf b/modules/nf-core/software/bwa/index/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/bwa/index/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/bwa/index/main.nf b/modules/nf-core/software/bwa/index/main.nf new file mode 100644 index 000000000..38b86c1fb --- /dev/null +++ b/modules/nf-core/software/bwa/index/main.nf @@ -0,0 +1,31 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process BWA_INDEX { + tag "$fasta" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:'') } + + container "biocontainers/bwa:v0.7.17_cv1" + //container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" + + conda (params.conda ? "bioconda::bwa=0.7.17" : null) + + input: + path fasta + val options + + output: + path "${fasta}.*", emit: index + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + """ + bwa index $ioptions.args $fasta + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/bwa/index/meta.yml b/modules/nf-core/software/bwa/index/meta.yml new file mode 100644 index 000000000..49fa3c44d --- /dev/null +++ b/modules/nf-core/software/bwa/index/meta.yml @@ -0,0 +1,25 @@ +name: bwa index +description: create indexes for BWA from a fasta file +keywords: + - index +tools: + - bwa: + description: | + BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 +input: + - + - input: + type: file + description: Input fasta file + pattern: "*.{fasta,fa}" +output: + - + - index: + type: file + description: bwa indexes file + pattern: "*.{fasta,fa}.{amb,ann,bwt,pac,sa}" +authors: + - "@maxulysse" diff --git a/modules/nf-core/software/bwa/mem/functions.nf b/modules/nf-core/software/bwa/mem/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/bwa/mem/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/bwa/mem/main.nf b/modules/nf-core/software/bwa/mem/main.nf new file mode 100644 index 000000000..127bc7003 --- /dev/null +++ b/modules/nf-core/software/bwa/mem/main.nf @@ -0,0 +1,42 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process BWA_MEM { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + + conda (params.conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(reads) + path index + path fasta + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def rg = meta.read_group ? "-R ${meta.read_group}" : "" + """ + bwa mem \\ + $ioptions.args \\ + $rg \\ + -t $task.cpus \\ + $fasta \\ + $reads \\ + | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - + + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/bwa/mem/meta.yml b/modules/nf-core/software/bwa/mem/meta.yml new file mode 100644 index 000000000..d8ae9a7da --- /dev/null +++ b/modules/nf-core/software/bwa/mem/meta.yml @@ -0,0 +1,42 @@ +name: bwa mem +description: Performs fastq alignment to a fasta reference using the burrows-wheeler aligner +keywords: + - mem + - bwa + - alignment +tools: + - bwa: + description: | + BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 +input: + - + - id: + type: val + description: read/read pair id + - reads: + type: file + description: Input fastq file + pattern: "*.{fastq,fq}" + - index: + type: file + description: bwa indexes file + pattern: "*.{amb,ann,bwt,pac,sa}" + - prefix: + type: val + description: bwa index prefix, equivalent to index file names without extensions. Usually the reference genome file name unless otherwise specified. +output: + - + - bam: + type: file + description: Output bam file + pattern: "*.bam" + - bamindex: + type: file + description: Output bam index file + pattern: "*.bai" + +authors: + - "@jeremy1805" diff --git a/modules/nf-core/software/deeptools/computematrix/functions.nf b/modules/nf-core/software/deeptools/computematrix/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/deeptools/computematrix/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/deeptools/computematrix/main.nf b/modules/nf-core/software/deeptools/computematrix/main.nf new file mode 100644 index 000000000..f53662e3e --- /dev/null +++ b/modules/nf-core/software/deeptools/computematrix/main.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process DEEPTOOLS_COMPUTEMATRIX { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + + input: + tuple val(meta), path(bigwig) + path bed + val options + + output: + tuple val(meta), path("*.mat.gz"), emit: matrix + tuple val(meta), path("*.mat.tab"), emit: table + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + computeMatrix \\ + $ioptions.args \\ + --regionsFileName $bed \\ + --scoreFileName $bigwig \\ + --outFileName ${prefix}.computeMatrix.mat.gz \\ + --outFileNameMatrix ${prefix}.computeMatrix.vals.mat.tab \\ + --numberOfProcessors $task.cpus + + computeMatrix --version | sed -e "s/computeMatrix //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/deeptools/plotfingerprint/functions.nf b/modules/nf-core/software/deeptools/plotfingerprint/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/deeptools/plotfingerprint/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/deeptools/plotfingerprint/main.nf b/modules/nf-core/software/deeptools/plotfingerprint/main.nf new file mode 100644 index 000000000..ede8a041a --- /dev/null +++ b/modules/nf-core/software/deeptools/plotfingerprint/main.nf @@ -0,0 +1,43 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process DEEPTOOLS_PLOTFINGERPRINT { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + + input: + tuple val(meta), path(bams), path(bais) + val options + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.raw.txt"), emit: matrix + tuple val(meta), path("*.qcmetrics.txt"), emit: metrics + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' + """ + plotFingerprint \\ + $ioptions.args \\ + $extend \\ + --bamfiles ${bams.join(' ')} \\ + --plotFile ${prefix}.plotFingerprint.pdf \\ + --outRawCounts ${prefix}.plotFingerprint.raw.txt \\ + --outQualityMetrics ${prefix}.plotFingerprint.qcmetrics.txt \\ + --numberOfProcessors $task.cpus + + plotFingerprint --version | sed -e "s/plotFingerprint //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/deeptools/plotheatmap/functions.nf b/modules/nf-core/software/deeptools/plotheatmap/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/deeptools/plotheatmap/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/deeptools/plotheatmap/main.nf b/modules/nf-core/software/deeptools/plotheatmap/main.nf new file mode 100644 index 000000000..9cc740e2d --- /dev/null +++ b/modules/nf-core/software/deeptools/plotheatmap/main.nf @@ -0,0 +1,38 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process DEEPTOOLS_PLOTHEATMAP { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + + input: + tuple val(meta), path(matrix) + val options + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.tab"), emit: table + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + plotHeatmap \\ + $ioptions.args \\ + --matrixFile $matrix \\ + --outFileName ${prefix}.plotHeatmap.pdf \\ + --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab + + plotHeatmap --version | sed -e "s/plotHeatmap //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/deeptools/plotprofile/functions.nf b/modules/nf-core/software/deeptools/plotprofile/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/deeptools/plotprofile/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/deeptools/plotprofile/main.nf b/modules/nf-core/software/deeptools/plotprofile/main.nf new file mode 100644 index 000000000..a822066b8 --- /dev/null +++ b/modules/nf-core/software/deeptools/plotprofile/main.nf @@ -0,0 +1,38 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process DEEPTOOLS_PLOTPROFILE { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/deeptools:3.4.3--py_0" + //container "https://depot.galaxyproject.org/singularity/deeptools:3.4.3--py_0" + + conda (params.conda ? "bioconda::deeptools=3.4.3" : null) + + input: + tuple val(meta), path(matrix) + val options + + output: + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.tab"), emit: table + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + plotProfile \\ + $ioptions.args \\ + --matrixFile $matrix \\ + --outFileName ${prefix}.plotProfile.pdf \\ + --outFileNameData ${prefix}.plotProfile.tab + + plotProfile --version | sed -e "s/plotProfile //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/fastqc/functions.nf b/modules/nf-core/software/fastqc/functions.nf new file mode 100644 index 000000000..dcda375c2 --- /dev/null +++ b/modules/nf-core/software/fastqc/functions.nf @@ -0,0 +1 @@ +../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/fastqc/main.nf b/modules/nf-core/software/fastqc/main.nf new file mode 100644 index 000000000..7f882525e --- /dev/null +++ b/modules/nf-core/software/fastqc/main.nf @@ -0,0 +1,44 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process FASTQC { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/fastqc:0.11.9--0" + //container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" + + conda (params.conda ? "bioconda::fastqc=0.11.9" : null) + + input: + tuple val(meta), path(reads) + val options + + output: + tuple val(meta), path("*.html"), emit: html + tuple val(meta), path("*.zip"), emit: zip + path "*.version.txt", emit: version + + script: + // Add soft-links to original FastQs for consistent naming in pipeline + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}.${ioptions.suffix}" : "${meta.id}" + if (meta.single_end) { + """ + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + fastqc $ioptions.args --threads $task.cpus ${prefix}.fastq.gz + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + """ + } else { + """ + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + fastqc $ioptions.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/software/fastqc/meta.yml b/modules/nf-core/software/fastqc/meta.yml new file mode 100644 index 000000000..fcbfeab30 --- /dev/null +++ b/modules/nf-core/software/fastqc/meta.yml @@ -0,0 +1,63 @@ +name: FastQC +description: Run FastQC on sequenced reads +keywords: + - Quality Control + - QC + - Adapters +tools: + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ +params: + - fastqc_args: + type: string + description: Additional command line arguments passed to fastqc. + - out_dir: + type: string + description: | + The pipeline's output directory. By default, the module will + output files into `$out_dir/MODULE_NAME` + - publish_dir: + type: string + description: | + Append to the path for the standard output directory provided by `$out_dir`. + - publish_dir_mode: + type: string + description: | + Provide a value for the Nextflow `publishDir` mode parameter + (e.g. copy, link, ...) + - publish_results: + type: string + description: | + Whether or not to publish results into `publish_dir`. Set to `none` to not + publish any files at all; to `default` to publish all relevant files. +input: + - name: + type: string + description: Sample identifier + - single_end: + type: boolean + description: | + Boolean indicating whether the corresponding sample is single-end (true) + or paired-end (false). + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. +output: + - report: + type: file + description: FastQC report + pattern: "*_fastqc.{zip,html}" +authors: + - "@grst" + - "@drpatelh" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/software/homer/annotatepeaks/functions.nf b/modules/nf-core/software/homer/annotatepeaks/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/homer/annotatepeaks/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/homer/annotatepeaks/main.nf b/modules/nf-core/software/homer/annotatepeaks/main.nf new file mode 100644 index 000000000..496f5cc49 --- /dev/null +++ b/modules/nf-core/software/homer/annotatepeaks/main.nf @@ -0,0 +1,43 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +def VERSION = '4.11' + +process HOMER_ANNOTATEPEAKS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/homer:4.11--pl526h9a982cc_2" + //container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526h9a982cc_2" + + conda (params.conda ? "bioconda::homer=4.11" : null) + + input: + tuple val(meta), path(peak) + path fasta + path gtf + val options + + output: + tuple val(meta), path("*annotatePeaks.txt"), emit: txt + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + annotatePeaks.pl \\ + $peak \\ + $fasta \\ + $ioptions.args \\ + -gtf $gtf \\ + -cpu $task.cpus \\ + > ${prefix}.annotatePeaks.txt + + echo $VERSION > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/macs2/callpeak/functions.nf b/modules/nf-core/software/macs2/callpeak/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/macs2/callpeak/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/macs2/callpeak/main.nf b/modules/nf-core/software/macs2/callpeak/main.nf new file mode 100644 index 000000000..454f0fb66 --- /dev/null +++ b/modules/nf-core/software/macs2/callpeak/main.nf @@ -0,0 +1,47 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process MACS2_CALLPEAK { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/macs2:2.2.7.1--py37h516909a_0" + //container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py37h516909a_0" + + conda (params.conda ? "bioconda::macs2=2.2.7.1" : null) + + input: + tuple val(meta), path(ipbam), path(controlbam) + val macs2_gsize + val options + + output: + tuple val(meta), path("*.{narrowPeak,broadPeak}"), emit: peak + tuple val(meta), path("*.xls"), emit: xls + tuple val(meta), path("*.gappedPeak"), emit: gapped optional true + tuple val(meta), path("*.bed"), emit: bed optional true + tuple val(meta), path("*.bdg"), emit: bdg optional true + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def format = meta.single_end ? 'BAM' : 'BAMPE' + def control = controlbam ? "--control $controlbam" : '' + """ + macs2 \\ + callpeak \\ + $ioptions.args \\ + --gsize $macs2_gsize \\ + --format $format \\ + --name $prefix \\ + --treatment $ipbam \\ + $control + + macs2 --version | sed -e "s/macs2 //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/phantompeakqualtools/functions.nf b/modules/nf-core/software/phantompeakqualtools/functions.nf new file mode 100644 index 000000000..dcda375c2 --- /dev/null +++ b/modules/nf-core/software/phantompeakqualtools/functions.nf @@ -0,0 +1 @@ +../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/phantompeakqualtools/main.nf b/modules/nf-core/software/phantompeakqualtools/main.nf new file mode 100644 index 000000000..7777e1328 --- /dev/null +++ b/modules/nf-core/software/phantompeakqualtools/main.nf @@ -0,0 +1,37 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +def VERSION = '1.2.2' + +process PHANTOMPEAKQUALTOOLS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" + //container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" + + conda (params.conda ? "bioconda::phantompeakqualtools=1.2.2" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.out"), emit: spp + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.Rdata"), emit: rdata + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + RUN_SPP=`which run_spp.R` + Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + echo $VERSION > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/picard/collectmultiplemetrics/main.nf b/modules/nf-core/software/picard/collectmultiplemetrics/main.nf new file mode 100644 index 000000000..8850d534c --- /dev/null +++ b/modules/nf-core/software/picard/collectmultiplemetrics/main.nf @@ -0,0 +1,47 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_COLLECTMULTIPLEMETRICS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bam) + path fasta + val options + + output: + tuple val(meta), path("*_metrics"), emit: metrics + tuple val(meta), path("*.pdf"), emit: pdf + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectMultipleMetrics \\ + $ioptions.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.CollectMultipleMetrics \\ + REFERENCE_SEQUENCE=$fasta + + echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/picard/markduplicates/functions.nf b/modules/nf-core/software/picard/markduplicates/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/picard/markduplicates/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/picard/markduplicates/main.nf b/modules/nf-core/software/picard/markduplicates/main.nf new file mode 100644 index 000000000..8bfed2565 --- /dev/null +++ b/modules/nf-core/software/picard/markduplicates/main.nf @@ -0,0 +1,46 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_MARKDUPLICATES { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.metrics.txt"), emit: metrics + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + MarkDuplicates \\ + $ioptions.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.bam \\ + METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt + + echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/picard/mergesamfiles/functions.nf b/modules/nf-core/software/picard/mergesamfiles/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/picard/mergesamfiles/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/picard/mergesamfiles/main.nf b/modules/nf-core/software/picard/mergesamfiles/main.nf new file mode 100644 index 000000000..062bbfc85 --- /dev/null +++ b/modules/nf-core/software/picard/mergesamfiles/main.nf @@ -0,0 +1,51 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_MERGESAMFILES { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bams) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def bam_files = bams.sort() + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + if (bam_files.size() > 1) { + """ + picard \\ + -Xmx${avail_mem}g \\ + MergeSamFiles \\ + $ioptions.args \\ + ${'INPUT='+bam_files.join(' INPUT=')} \\ + OUTPUT=${prefix}.bam + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ + } else { + """ + ln -s ${bam_files[0]} ${prefix}.bam + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/software/preseq/lcextrap/functions.nf b/modules/nf-core/software/preseq/lcextrap/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/preseq/lcextrap/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/preseq/lcextrap/main.nf b/modules/nf-core/software/preseq/lcextrap/main.nf new file mode 100644 index 000000000..26ed3829f --- /dev/null +++ b/modules/nf-core/software/preseq/lcextrap/main.nf @@ -0,0 +1,42 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PRESEQ_LCEXTRAP { + tag "$meta.id" + label 'process_medium' + label 'error_ignore' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/preseq:2.0.3--hf53bd2b_3" + //container "https://depot.galaxyproject.org/singularity/preseq:2.0.3--hf53bd2b_3" + + conda (params.conda ? "bioconda::preseq=2.0.3" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.ccurve.txt"), emit: ccurve + tuple val(meta), path("*.log"), emit: log + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-pe' + """ + preseq \\ + lc_extrap \\ + $ioptions.args \\ + $pe \\ + -output ${prefix}.ccurve.txt \\ + $bam + cp .command.err ${prefix}.command.log + + echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/flagstat/functions.nf b/modules/nf-core/software/samtools/flagstat/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/samtools/flagstat/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/samtools/flagstat/main.nf b/modules/nf-core/software/samtools/flagstat/main.nf new file mode 100644 index 000000000..4c14a41ae --- /dev/null +++ b/modules/nf-core/software/samtools/flagstat/main.nf @@ -0,0 +1,29 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools flagstat $bam > ${bam}.flagstat + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/idxstats/functions.nf b/modules/nf-core/software/samtools/idxstats/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/samtools/idxstats/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/samtools/idxstats/main.nf b/modules/nf-core/software/samtools/idxstats/main.nf new file mode 100644 index 000000000..9805bb141 --- /dev/null +++ b/modules/nf-core/software/samtools/idxstats/main.nf @@ -0,0 +1,29 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools idxstats $bam > ${bam}.idxstats + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/index/functions.nf b/modules/nf-core/software/samtools/index/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/samtools/index/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/samtools/index/main.nf b/modules/nf-core/software/samtools/index/main.nf new file mode 100644 index 000000000..456e2663d --- /dev/null +++ b/modules/nf-core/software/samtools/index/main.nf @@ -0,0 +1,29 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_INDEX { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bai"), emit: bai + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools index $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/index/meta.yml b/modules/nf-core/software/samtools/index/meta.yml new file mode 100644 index 000000000..35d348027 --- /dev/null +++ b/modules/nf-core/software/samtools/index/meta.yml @@ -0,0 +1,27 @@ +name: samtools index +description: index a BAM or CRAM file +keywords: + - index +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - + - input: + type: file + description: Input BAM or CRAM file + pattern: "*.{bam,cram}" +output: + - + - index: + type: file + description: BAM or CRAM index file + pattern: "*.{bai}" +authors: + - "@ewels" diff --git a/modules/nf-core/software/samtools/sort/functions.nf b/modules/nf-core/software/samtools/sort/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/samtools/sort/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/samtools/sort/main.nf b/modules/nf-core/software/samtools/sort/main.nf new file mode 100644 index 000000000..9467e2aea --- /dev/null +++ b/modules/nf-core/software/samtools/sort/main.nf @@ -0,0 +1,32 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/sort/meta.yml b/modules/nf-core/software/samtools/sort/meta.yml new file mode 100644 index 000000000..1e042f0d7 --- /dev/null +++ b/modules/nf-core/software/samtools/sort/meta.yml @@ -0,0 +1,27 @@ +name: samtools sort +description: Sort a BAM or CRAM file +keywords: + - sort +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - + - input: + type: file + description: Input BAM or CRAM file + pattern: "*.{bam,cram}" +output: + - + - sorted_file: + type: file + description: Sorted BAM or CRAM file + pattern: "*.{bam,cram}" +authors: + - "@ewels" diff --git a/modules/nf-core/software/samtools/stats/functions.nf b/modules/nf-core/software/samtools/stats/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/samtools/stats/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/samtools/stats/main.nf b/modules/nf-core/software/samtools/stats/main.nf new file mode 100644 index 000000000..52d5e2d74 --- /dev/null +++ b/modules/nf-core/software/samtools/stats/main.nf @@ -0,0 +1,29 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_STATS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.stats"), emit: stats + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools stats $bam > ${bam}.stats + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/subread/featurecounts/functions.nf b/modules/nf-core/software/subread/featurecounts/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/subread/featurecounts/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/subread/featurecounts/main.nf b/modules/nf-core/software/subread/featurecounts/main.nf new file mode 100644 index 000000000..e8a9667f3 --- /dev/null +++ b/modules/nf-core/software/subread/featurecounts/main.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SUBREAD_FEATURECOUNTS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" + //container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" + + conda (params.conda ? "bioconda::subread=2.0.1" : null) + + input: + tuple val(meta), path(bams), path(annotation) + val options + + output: + tuple val(meta), path("*featureCounts.txt"), emit: txt + tuple val(meta), path("*featureCounts.txt.summary"), emit: summary + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-p' + """ + featureCounts \\ + $ioptions.args \\ + $pe \\ + -T $task.cpus \\ + -a $annotation \\ + -o ${prefix}.featureCounts.txt \\ + ${bams.join(' ')} + + echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/trimgalore/functions.nf b/modules/nf-core/software/trimgalore/functions.nf new file mode 100644 index 000000000..dcda375c2 --- /dev/null +++ b/modules/nf-core/software/trimgalore/functions.nf @@ -0,0 +1 @@ +../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/trimgalore/main.nf b/modules/nf-core/software/trimgalore/main.nf new file mode 100644 index 000000000..219b3e659 --- /dev/null +++ b/modules/nf-core/software/trimgalore/main.nf @@ -0,0 +1,79 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process TRIMGALORE { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/trim-galore:0.6.5--0" + //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" + + conda (params.conda ? "bioconda::trim-galore=0.6.5" : null) + + input: + tuple val(meta), path(reads) + val options + + output: + tuple val(meta), path("*.fq.gz"), emit: reads + tuple val(meta), path("*.html"), emit: html optional true + tuple val(meta), path("*.zip"), emit: zip optional true + tuple val(meta), path("*report.txt"), emit: log + path "*.version.txt", emit: version + + script: + // Calculate number of --cores for TrimGalore based on value of task.cpus + // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 + // See: https://github.com/nf-core/atacseq/pull/65 + def cores = 1 + if (task.cpus) { + cores = (task.cpus as int) - 4 + if (meta.single_end) cores = (task.cpus as int) - 3 + if (cores < 1) cores = 1 + if (cores > 4) cores = 4 + } + + // Clipping presets have to be evaluated in the context of SE/PE + def c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' + def c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' + def tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' + def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' + + // Added soft-links to original fastqs for consistent naming in MultiQC + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + if (meta.single_end) { + """ + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + trim_galore \\ + $ioptions.args \\ + --cores $cores \\ + --gzip \\ + $c_r1 \\ + $tpc_r1 \\ + ${prefix}.fastq.gz + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt + """ + } else { + """ + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + trim_galore \\ + $ioptions.args \\ + --cores $cores \\ + --paired \\ + --gzip \\ + $c_r1 \\ + $c_r2 \\ + $tpc_r1 \\ + $tpc_r2 \\ + ${prefix}_1.fastq.gz \\ + ${prefix}_2.fastq.gz + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/software/trimgalore/meta.yml b/modules/nf-core/software/trimgalore/meta.yml new file mode 100644 index 000000000..642fb51be --- /dev/null +++ b/modules/nf-core/software/trimgalore/meta.yml @@ -0,0 +1,40 @@ +name: Trim Galore! +description: Trim FastQ files using Trim Galore! +keywords: + - trimming + - adapters + - sequencing adapters +tools: + - fastqc: + description: | + A wrapper tool around Cutadapt and FastQC to consistently apply quality + and adapter trimming to FastQ files, with some extra functionality for + MspI-digested RRBS-type (Reduced Representation Bisufite-Seq) libraries. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/ + documentation: https://github.com/FelixKrueger/TrimGalore/blob/master/Docs/Trim_Galore_User_Guide.md +input: + - + - sample_id: + type: string + description: Sample identifier + - reads: + type: file + description: Input FastQ file, or pair of files +output: + - + - sample_id: + type: string + description: Sample identifier + - trimmed_fastq: + type: file + description: Trimmed FastQ files + pattern: "*fq.gz" + - + - report: + type: file + description: Trim Galore! trimming report + pattern: "*trimming_report.txt" + +authors: + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf b/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf new file mode 100644 index 000000000..5e1a8e039 --- /dev/null +++ b/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf @@ -0,0 +1 @@ +../../lib/functions.nf \ No newline at end of file diff --git a/modules/nf-core/software/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/software/ucsc/bedgraphtobigwig/main.nf new file mode 100644 index 000000000..4da63fe1f --- /dev/null +++ b/modules/nf-core/software/ucsc/bedgraphtobigwig/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +def VERSION = '377' + +process UCSC_BEDRAPHTOBIGWIG { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" + //container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" + + conda (params.conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) + + input: + tuple val(meta), path(bedgraph) + path sizes + val options + + output: + tuple val(meta), path("*.bigWig"), emit: bigwig + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + bedGraphToBigWig $bedgraph $sizes ${prefix}.bigWig + echo $VERSION > ${software}.version.txt + """ +} From d5efb1c2686c7ac0e2c73bee46c45d99527807ea Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 5 Aug 2020 19:38:44 +0100 Subject: [PATCH 146/538] Switch to nf-core/modules --- main.nf | 26 ++++---- .../nf-core/software/bwa/index/functions.nf | 60 ++++++++++++++++++- modules/nf-core/software/bwa/mem/functions.nf | 60 ++++++++++++++++++- .../deeptools/computematrix/functions.nf | 60 ++++++++++++++++++- .../deeptools/plotfingerprint/functions.nf | 60 ++++++++++++++++++- .../deeptools/plotheatmap/functions.nf | 60 ++++++++++++++++++- .../deeptools/plotprofile/functions.nf | 60 ++++++++++++++++++- modules/nf-core/software/fastqc/functions.nf | 60 ++++++++++++++++++- .../software/homer/annotatepeaks/functions.nf | 60 ++++++++++++++++++- .../software/macs2/callpeak/functions.nf | 60 ++++++++++++++++++- .../phantompeakqualtools/functions.nf | 60 ++++++++++++++++++- .../collectmultiplemetrics/functions.nf | 60 ++++++++++++++++++- .../picard/markduplicates/functions.nf | 60 ++++++++++++++++++- .../picard/mergesamfiles/functions.nf | 60 ++++++++++++++++++- .../software/preseq/lcextrap/functions.nf | 60 ++++++++++++++++++- .../software/samtools/flagstat/functions.nf | 60 ++++++++++++++++++- .../software/samtools/idxstats/functions.nf | 60 ++++++++++++++++++- .../software/samtools/index/functions.nf | 60 ++++++++++++++++++- .../software/samtools/sort/functions.nf | 60 ++++++++++++++++++- .../software/samtools/stats/functions.nf | 60 ++++++++++++++++++- .../subread/featurecounts/functions.nf | 60 ++++++++++++++++++- .../nf-core/software/trimgalore/functions.nf | 60 ++++++++++++++++++- .../ucsc/bedgraphtobigwig/functions.nf | 60 ++++++++++++++++++- .../nf-core/subworkflow/bam_sort_samtools.nf | 4 +- .../nf-core/subworkflow/bam_stats_samtools.nf | 6 +- .../nf-core/subworkflow/fastqc_trimgalore.nf | 4 +- modules/nf-core/subworkflow/map_bwa_mem.nf | 2 +- .../subworkflow/mark_duplicates_picard.nf | 4 +- 28 files changed, 1321 insertions(+), 45 deletions(-) diff --git a/main.nf b/main.nf index 8970be09f..2703f777a 100755 --- a/main.nf +++ b/main.nf @@ -155,20 +155,20 @@ include { BAM_CLEAN } from './modules/local/subworkflo /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ //////////////////////////////////////////////////// -include { BWA_INDEX } from './modules/nf-core/software/bwa/index' -include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard/mergesamfiles' -include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard/collectmultiplemetrics' -include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq/lcextrap' -include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc/bedgraphtobigwig' -include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools/computematrix' -include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools/plotprofile' -include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools/plotheatmap' -include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools/plotfingerprint' -include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools' -include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2/callpeak' +include { BWA_INDEX } from './modules/nf-core/software/bwa/index/main' +include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard/mergesamfiles/main' +include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard/collectmultiplemetrics/main' +include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq/lcextrap/main' +include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc/bedgraphtobigwig/main' +include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools/computematrix/main' +include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools/plotprofile/main' +include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools/plotheatmap/main' +include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools/plotfingerprint/main' +include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools/main' +include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2/callpeak/main' include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 - HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer/annotatepeaks' -include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread/featurecounts' + HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer/annotatepeaks/main' +include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread/featurecounts/main' include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' include { MAP_BWA_MEM } from './modules/nf-core/subworkflow/map_bwa_mem' diff --git a/modules/nf-core/software/bwa/index/functions.nf b/modules/nf-core/software/bwa/index/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/bwa/index/functions.nf +++ b/modules/nf-core/software/bwa/index/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/bwa/mem/functions.nf b/modules/nf-core/software/bwa/mem/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/bwa/mem/functions.nf +++ b/modules/nf-core/software/bwa/mem/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/deeptools/computematrix/functions.nf b/modules/nf-core/software/deeptools/computematrix/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/deeptools/computematrix/functions.nf +++ b/modules/nf-core/software/deeptools/computematrix/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/deeptools/plotfingerprint/functions.nf b/modules/nf-core/software/deeptools/plotfingerprint/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/deeptools/plotfingerprint/functions.nf +++ b/modules/nf-core/software/deeptools/plotfingerprint/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/deeptools/plotheatmap/functions.nf b/modules/nf-core/software/deeptools/plotheatmap/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/deeptools/plotheatmap/functions.nf +++ b/modules/nf-core/software/deeptools/plotheatmap/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/deeptools/plotprofile/functions.nf b/modules/nf-core/software/deeptools/plotprofile/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/deeptools/plotprofile/functions.nf +++ b/modules/nf-core/software/deeptools/plotprofile/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/fastqc/functions.nf b/modules/nf-core/software/fastqc/functions.nf index dcda375c2..75553cdf5 100644 --- a/modules/nf-core/software/fastqc/functions.nf +++ b/modules/nf-core/software/fastqc/functions.nf @@ -1 +1,59 @@ -../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/homer/annotatepeaks/functions.nf b/modules/nf-core/software/homer/annotatepeaks/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/homer/annotatepeaks/functions.nf +++ b/modules/nf-core/software/homer/annotatepeaks/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/macs2/callpeak/functions.nf b/modules/nf-core/software/macs2/callpeak/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/macs2/callpeak/functions.nf +++ b/modules/nf-core/software/macs2/callpeak/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/phantompeakqualtools/functions.nf b/modules/nf-core/software/phantompeakqualtools/functions.nf index dcda375c2..75553cdf5 100644 --- a/modules/nf-core/software/phantompeakqualtools/functions.nf +++ b/modules/nf-core/software/phantompeakqualtools/functions.nf @@ -1 +1,59 @@ -../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf +++ b/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/markduplicates/functions.nf b/modules/nf-core/software/picard/markduplicates/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/picard/markduplicates/functions.nf +++ b/modules/nf-core/software/picard/markduplicates/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/mergesamfiles/functions.nf b/modules/nf-core/software/picard/mergesamfiles/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/picard/mergesamfiles/functions.nf +++ b/modules/nf-core/software/picard/mergesamfiles/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/preseq/lcextrap/functions.nf b/modules/nf-core/software/preseq/lcextrap/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/preseq/lcextrap/functions.nf +++ b/modules/nf-core/software/preseq/lcextrap/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/flagstat/functions.nf b/modules/nf-core/software/samtools/flagstat/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/samtools/flagstat/functions.nf +++ b/modules/nf-core/software/samtools/flagstat/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/idxstats/functions.nf b/modules/nf-core/software/samtools/idxstats/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/samtools/idxstats/functions.nf +++ b/modules/nf-core/software/samtools/idxstats/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/index/functions.nf b/modules/nf-core/software/samtools/index/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/samtools/index/functions.nf +++ b/modules/nf-core/software/samtools/index/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/sort/functions.nf b/modules/nf-core/software/samtools/sort/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/samtools/sort/functions.nf +++ b/modules/nf-core/software/samtools/sort/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/stats/functions.nf b/modules/nf-core/software/samtools/stats/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/samtools/stats/functions.nf +++ b/modules/nf-core/software/samtools/stats/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/subread/featurecounts/functions.nf b/modules/nf-core/software/subread/featurecounts/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/subread/featurecounts/functions.nf +++ b/modules/nf-core/software/subread/featurecounts/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/trimgalore/functions.nf b/modules/nf-core/software/trimgalore/functions.nf index dcda375c2..75553cdf5 100644 --- a/modules/nf-core/software/trimgalore/functions.nf +++ b/modules/nf-core/software/trimgalore/functions.nf @@ -1 +1,59 @@ -../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf b/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf index 5e1a8e039..75553cdf5 100644 --- a/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf +++ b/modules/nf-core/software/ucsc/bedgraphtobigwig/functions.nf @@ -1 +1,59 @@ -../../lib/functions.nf \ No newline at end of file +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/subworkflow/bam_sort_samtools.nf b/modules/nf-core/subworkflow/bam_sort_samtools.nf index 7c42591cc..d55b9aad1 100644 --- a/modules/nf-core/subworkflow/bam_sort_samtools.nf +++ b/modules/nf-core/subworkflow/bam_sort_samtools.nf @@ -2,8 +2,8 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { SAMTOOLS_SORT } from '../software/samtools/sort' -include { SAMTOOLS_INDEX } from '../software/samtools/index' +include { SAMTOOLS_SORT } from '../software/samtools/sort/main' +include { SAMTOOLS_INDEX } from '../software/samtools/index/main' include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow BAM_SORT_SAMTOOLS { diff --git a/modules/nf-core/subworkflow/bam_stats_samtools.nf b/modules/nf-core/subworkflow/bam_stats_samtools.nf index c4e55377b..669ae6a54 100644 --- a/modules/nf-core/subworkflow/bam_stats_samtools.nf +++ b/modules/nf-core/subworkflow/bam_stats_samtools.nf @@ -2,9 +2,9 @@ * Run SAMtools stats, flagstat and idxstats */ -include { SAMTOOLS_STATS } from '../software/samtools/stats' -include { SAMTOOLS_IDXSTATS } from '../software/samtools/idxstats' -include { SAMTOOLS_FLAGSTAT } from '../software/samtools/flagstat' +include { SAMTOOLS_STATS } from '../software/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../software/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../software/samtools/flagstat/main' workflow BAM_STATS_SAMTOOLS { take: diff --git a/modules/nf-core/subworkflow/fastqc_trimgalore.nf b/modules/nf-core/subworkflow/fastqc_trimgalore.nf index 8cb75d659..365d313dc 100644 --- a/modules/nf-core/subworkflow/fastqc_trimgalore.nf +++ b/modules/nf-core/subworkflow/fastqc_trimgalore.nf @@ -2,8 +2,8 @@ * Read QC and trimming */ -include { FASTQC } from '../software/fastqc' -include { TRIMGALORE } from '../software/trimgalore' +include { FASTQC } from '../software/fastqc/main' +include { TRIMGALORE } from '../software/trimgalore/main' workflow FASTQC_TRIMGALORE { take: diff --git a/modules/nf-core/subworkflow/map_bwa_mem.nf b/modules/nf-core/subworkflow/map_bwa_mem.nf index 92b53260f..f46077e4b 100644 --- a/modules/nf-core/subworkflow/map_bwa_mem.nf +++ b/modules/nf-core/subworkflow/map_bwa_mem.nf @@ -2,7 +2,7 @@ * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { BWA_MEM } from '../software/bwa/mem' +include { BWA_MEM } from '../software/bwa/mem/main' include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow MAP_BWA_MEM { diff --git a/modules/nf-core/subworkflow/mark_duplicates_picard.nf b/modules/nf-core/subworkflow/mark_duplicates_picard.nf index 10ade11e9..f147831f5 100644 --- a/modules/nf-core/subworkflow/mark_duplicates_picard.nf +++ b/modules/nf-core/subworkflow/mark_duplicates_picard.nf @@ -2,8 +2,8 @@ * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats */ -include { PICARD_MARKDUPLICATES } from '../software/picard/markduplicates' -include { SAMTOOLS_INDEX } from '../software/samtools/index' +include { PICARD_MARKDUPLICATES } from '../software/picard/markduplicates/main' +include { SAMTOOLS_INDEX } from '../software/samtools/index/main' include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow MARK_DUPLICATES_PICARD { From 297e48cb61141ce78af2c6ff676c0c24caa66bc2 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 17 Aug 2020 09:03:22 +0100 Subject: [PATCH 147/538] Remove input in docs --- docs/usage.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index d9ed25562..7005fb215 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -152,14 +152,6 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * A profile with a complete configuration for automated testing * Includes links to test data so needs no other parameters -### `--input` - -You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row as shown in the examples below. - -```bash ---input '[path to design file]' -``` - ### `-resume` Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. From 7b9403e0f99d68c55c18979a97ba7fd678c34da1 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 17 Aug 2020 09:12:22 +0100 Subject: [PATCH 148/538] Update schema --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index c24063e1c..177bebb3a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -17,7 +17,7 @@ "input": { "type": "string", "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 4 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#--input).", + "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#introduction).", "fa_icon": "fas fa-file-csv" }, "fragment_size": { From ddc992d04b740781523714d4180fa5eab7a022ab Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 17 Aug 2020 13:53:12 +0100 Subject: [PATCH 149/538] Fix lint warnings --- .github/workflows/awsfulltest.yml | 6 +----- docs/README.md | 2 -- lib/Completion.groovy | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 75a51e5fe..fd2b0e061 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -20,10 +20,6 @@ jobs: - name: Install awscli run: conda install -c conda-forge awscli - name: Start AWS batch job - # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) - # on the `test_full.config` test runs with only one set of parameters - # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -37,4 +33,4 @@ jobs: --job-name nf-core-chipseq \ --job-queue $AWS_JOB_QUEUE \ --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test_full --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/docs/README.md b/docs/README.md index 2a650655f..ac8a8b69c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,8 +2,6 @@ The nf-core/chipseq documentation is split into the following pages: - - * [Usage](usage.md) * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) diff --git a/lib/Completion.groovy b/lib/Completion.groovy index 4363275dd..1dceae82c 100755 --- a/lib/Completion.groovy +++ b/lib/Completion.groovy @@ -34,7 +34,6 @@ class Completion { email_fields['summary']['Nextflow Build'] = workflow.nextflow.build email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) // On success try attach the multiqc report def mqc_report = null try { From 1362e4c5109965e10531fa8a1dd2c9e87ee48ee2 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Mon, 17 Aug 2020 18:16:43 +0100 Subject: [PATCH 150/538] Fix awstest bug --- .github/workflows/awstest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index c951c7346..ff7ae535c 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -34,4 +34,4 @@ jobs: --job-name nf-core-chipseq \ --job-queue $AWS_JOB_QUEUE \ --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}'chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' From 37fb93ad4a784e1505811383b8e34028dbd80454 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 18 Aug 2020 11:55:59 +0100 Subject: [PATCH 151/538] Update schema --- nextflow_schema.json | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 177bebb3a..aab35a08f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -18,12 +18,14 @@ "type": "string", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#introduction).", - "fa_icon": "fas fa-file-csv" + "fa_icon": "fas fa-file-csv", + "default": "./design.csv" }, "fragment_size": { "type": "integer", "description": "Estimated fragment size used to extend single-end reads.", - "fa_icon": "fas fa-chart-area" + "fa_icon": "fas fa-chart-area", + "default": "200" }, "seq_center": { "type": "string", @@ -234,7 +236,7 @@ "type": "integer", "default": 1, "description": "Number of biological replicates required from a given condition for a peak to contribute to a consensus peak.", - "help_text": "If you are confident you have good reproducibility amongst your replicates then you can increase the value of this parameter to create a \"reproducible\" set of consensus peaks. For example, a value of 2 will mean peaks that have been called in at least 2 replicates will contribute to the consensus set of peaks, and as such peaks that are unique to a given replicate will be discarded.", + "help_text": "If you are confident you have good reproducibility amongst your replicates then you can increase the value of this parameter to create a 'reproducible' set of consensus peaks. For example, a value of 2 will mean peaks that have been called in at least 2 replicates will contribute to the consensus set of peaks, and as such peaks that are unique to a given replicate will be discarded.", "fa_icon": "fas fa-sort-numeric-down" }, "save_macs_pileup": { @@ -439,7 +441,7 @@ "link", "copy", "copyNoFollow", - "mov" + "move" ], "hidden": true }, @@ -500,12 +502,6 @@ "type": "boolean", "description": "Run this workflow with Conda.", "hidden": true - }, - "modules": { - "type": "string", - "default": "", - "description": "Parameter used to supply options to nf-core/modules files. Won't need to be provided on the command-line.", - "hidden": true } } } From 43d5882911b40deb04073a146416ca51f61a2597 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 27 Oct 2020 09:25:26 +0000 Subject: [PATCH 152/538] Template update for nf-core/tools version 1.11 --- .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/awsfulltest.yml | 4 +++- .github/workflows/awstest.yml | 9 ++++----- Dockerfile | 2 +- README.md | 10 +++++----- docs/README.md | 2 -- docs/output.md | 8 +++++++- docs/usage.md | 13 ++++++++++--- nextflow.config | 3 +++ nextflow_schema.json | 4 ++-- 11 files changed, 37 insertions(+), 22 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cb1a4e6d7..b8928af63 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -54,4 +54,4 @@ These tests are run both with the latest available version of `Nextflow` and als ## Getting help -For further information/help, please consult the [nf-core/chipseq documentation](https://nf-co.re/chipseq/docs) and don't hesitate to get in touch on the nf-core Slack [#chipseq](https://nfcore.slack.com/channels/chipseq) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/chipseq documentation](https://nf-co.re/chipseq/usage) and don't hesitate to get in touch on the nf-core Slack [#chipseq](https://nfcore.slack.com/channels/chipseq) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7781a9117..dfb5c2cbf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -36,7 +36,7 @@ Steps to reproduce the behaviour: ## Container engine -- Engine: +- Engine: - version: - Image tag: diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 75a51e5fe..48a2b35a9 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,10 +1,12 @@ name: nf-core AWS full size tests -# This workflow is triggered on push to the master branch. +# This workflow is triggered on published releases. +# It can be additionally triggered manually with GitHub actions workflow dispatch. # It runs the -profile 'test_full' on AWS batch on: release: types: [published] + workflow_dispatch: jobs: run-awstest: diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 5da17324e..eb41dffe8 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,11 +1,10 @@ name: nf-core AWS test # This workflow is triggered on push to the master branch. -# It runs the -profile 'test' on AWS batch +# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It runs the -profile 'test' on AWS batch. on: - push: - branches: - - master + workflow_dispatch: jobs: run-awstest: @@ -37,4 +36,4 @@ jobs: --job-name nf-core-chipseq \ --job-queue $AWS_JOB_QUEUE \ --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}'chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/Dockerfile b/Dockerfile index b739ba3eb..ef55eb905 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.10.2 +FROM nfcore/base:1.11 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" diff --git a/README.md b/README.md index 256076543..51c133cd3 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,12 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Install [`nextflow`](https://nf-co.re/usage/installation) -2. Install either [`Docker`](https://docs.docker.com/engine/installation/) or [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) or [`Podman`](https://podman.io/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```bash - nextflow run nf-core/chipseq -profile test, + nextflow run nf-core/chipseq -profile test, ``` > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. @@ -33,14 +33,14 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ```bash - nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 ``` -See [usage docs](docs/usage.md) for all of the available options when running the pipeline. +See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. ## Documentation -The nf-core/chipseq pipeline comes with documentation about the pipeline which you can read at [https://nf-core/chipseq/docs](https://nf-core/chipseq/docs) or find in the [`docs/` directory](docs). +The nf-core/chipseq pipeline comes with documentation about the pipeline: [usage](https://nf-co.re/chipseq/usage) and [output](https://nf-co.re/chipseq/output). diff --git a/docs/README.md b/docs/README.md index 84fa58441..68b828949 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,8 +2,6 @@ The nf-core/chipseq documentation is split into the following pages: - - * [Usage](usage.md) * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) diff --git a/docs/output.md b/docs/output.md index 0bed8064d..c2c866c10 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,5 +1,11 @@ # nf-core/chipseq: Output +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/chipseq/output](https://nf-co.re/chipseq/output) + +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + +## Introduction + This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. @@ -40,7 +46,7 @@ For more information about how to use MultiQC reports, see [https://multiqc.info **Output files:** -* `multiqc/` +* `multiqc/` * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. * `multiqc_plots/`: directory containing static images from the report in various formats. diff --git a/docs/usage.md b/docs/usage.md index ceaa7dd4d..5bb81b07a 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,5 +1,9 @@ # nf-core/chipseq: Usage +## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/chipseq/usage](https://nf-co.re/chipseq/usage) + +> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + ## Introduction @@ -47,7 +51,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -64,8 +68,11 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * `singularity` * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) +* `podman` + * A generic configuration profile to be used with [Podman](https://podman.io/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `conda` - * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker or Singularity. + * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) * Pulls most software from [Bioconda](https://bioconda.github.io/) * `test` @@ -98,7 +105,7 @@ process { See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. -If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition below). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition above). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). diff --git a/nextflow.config b/nextflow.config index a547df3fc..71ebe2f8d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -71,6 +71,9 @@ profiles { singularity.enabled = true singularity.autoMounts = true } + podman { + podman.enabled = true + } test { includeConfig 'conf/test.config' } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 37e0fdf2e..8641ae9a6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,5 +1,5 @@ { - "$schema": "https://json-schema.org/draft-07/schema", + "$schema": "http://json-schema.org/draft-07/schema", "$id": "https://raw.githubusercontent.com/nf-core/chipseq/master/nextflow_schema.json", "title": "nf-core/chipseq pipeline parameters", "description": "ChIP-seq peak-calling and differential analysis pipeline.", @@ -101,7 +101,7 @@ "link", "copy", "copyNoFollow", - "mov" + "move" ] }, "name": { From 55157145e643bbc3b5169d4e775a3aaca79818ae Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 12:39:17 +0000 Subject: [PATCH 153/538] Get tests passing after template update --- CHANGELOG.md | 2 +- bin/check_samplesheet.py | 2 +- modules/local/process/functions.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a1170ab0..3eedea2fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Move template boilerplate code to Groovy `lib/` * Implement pipeline in DSL2 -* Update template to tools `1.10.2` +* Update pipeline template to nf-core/tools `1.11` ### `Fixed` diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index e81d5cdc9..79b36ba52 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -118,7 +118,7 @@ def check_samplesheet(file_in, file_out): if sample_info in sample_run_dict[sample][replicate]: print_error("Samplesheet contains duplicate rows!", 'Line', line) else: - sample_run_dict[sample].append(sample_info) + sample_run_dict[sample][replicate].append(sample_info) ## Check if antibody and control columns have been specified at least once if len(antibody_dict) == 0: diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf index 75553cdf5..6f72fdc10 100644 --- a/modules/local/process/functions.nf +++ b/modules/local/process/functions.nf @@ -20,7 +20,7 @@ def initOptions(Map args) { options.args2 = args.args2 ?: '' options.publish_by_id = args.publish_by_id ?: false options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null + options.publish_files = (args.publish_files instanceof Map)? args.publish_files : null options.suffix = args.suffix ?: '' return options } From 789c6b30d26b7919d9b72459d1c4ffdfca0756f9 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 12:53:03 +0000 Subject: [PATCH 154/538] Use default tabs for markdownlint --- .github/markdownlint.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index cc8e0d331..49faba254 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -5,5 +5,3 @@ no-duplicate-header: siblings_only: true MD033: allowed_elements: [details, summary, p, img] -MD007: - indent: 4 From 098b1036ad80bd5fc0e6644e59794add2ff4bd56 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 13:00:29 +0000 Subject: [PATCH 155/538] Fix markdownlint --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eedea2fb..f136853d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,14 +43,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Replace `set` with `tuple` and `file()` with `path()` in all processes * Capitalise process names * Parameters: - * `--bwa_min_score` to set minimum alignment score for BWA MEM - * `--macs_fdr` to provide FDR threshold for MACS2 peak calling - * `--macs_pvalue` to provide p-value threshold for MACS2 peak calling - * `--skip_peak_qc` to skip MACS2 peak QC plot generation - * `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER - * `--skip_consensus_peaks` to skip consensus peak generation - * `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 - * `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) + * `--bwa_min_score` to set minimum alignment score for BWA MEM + * `--macs_fdr` to provide FDR threshold for MACS2 peak calling + * `--macs_pvalue` to provide p-value threshold for MACS2 peak calling + * `--skip_peak_qc` to skip MACS2 peak QC plot generation + * `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER + * `--skip_consensus_peaks` to skip consensus peak generation + * `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 + * `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) ### `Removed` From a73693a97fe1c25e3782435506e4b5eead071ff8 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 13:00:33 +0000 Subject: [PATCH 156/538] Fix markdownlint --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index ac8a8b69c..68b828949 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,8 @@ The nf-core/chipseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) From e0d44b54a99c4f766c80bda21780dac7d9b69202 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 13:00:36 +0000 Subject: [PATCH 157/538] Fix markdownlint --- docs/output.md | 104 ++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/docs/output.md b/docs/output.md index 374d8f344..721362ccd 100644 --- a/docs/output.md +++ b/docs/output.md @@ -26,9 +26,9 @@ The initial QC and alignments are performed at the library-level e.g. if the sam Output files * `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **before** adapter trimming. + * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **before** adapter trimming. * `fastqc/zips/` - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. @@ -40,13 +40,13 @@ The initial QC and alignments are performed at the library-level e.g. if the sam Output files * `trim_galore/` - * `*fastq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory. + * `*fastq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory. * `trim_galore/logs/` - * `*.log`: Log file generated by Trim Galore!. + * `*.log`: Log file generated by Trim Galore!. * `trim_galore/fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **after** adapter trimming. + * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **after** adapter trimming. * `trim_galore/fastqc/zips/` - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. + * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. @@ -60,9 +60,9 @@ The initial QC and alignments are performed at the library-level e.g. if the sam Output files * `bwa/library/` - * `*.bam`: The files resulting from the alignment of individual libraries are not saved by default so this directory will not be present in your results. You can override this behaviour with the use of the `--save_align_intermeds` flag in which case it will contain the coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. + * `*.bam`: The files resulting from the alignment of individual libraries are not saved by default so this directory will not be present in your results. You can override this behaviour with the use of the `--save_align_intermeds` flag in which case it will contain the coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. * `bwa/library/samtools_stats/` - * SAMtools `.sorted.bam.flagstat`, `.sorted.bam.idxstats` and `.sorted.bam.stats` files generated from the alignment files. + * SAMtools `.sorted.bam.flagstat`, `.sorted.bam.idxstats` and `.sorted.bam.stats` files generated from the alignment files. > **NB:** File names in the resulting directory (i.e. `bwa/library/`) will have the '`.Lb.`' suffix. @@ -82,16 +82,16 @@ The library-level alignments associated with the same sample are merged and subs Output files * `bwa/mergedLibrary/` - * `*.bam`: Merged library-level, coordinate sorted `*.bam` files after the marking of duplicates, and filtering based on various criteria. The file suffix for the final filtered files will be `*.mLb.clN.*`. If you specify the `--save_align_intermeds` parameter then two additional sets of files will be present. These represent the unfiltered alignments with duplicates marked (`*.mLb.mkD.*`), and in the case of paired-end datasets the filtered alignments before the removal of orphan read pairs (`*.mLb.flT.*`). + * `*.bam`: Merged library-level, coordinate sorted `*.bam` files after the marking of duplicates, and filtering based on various criteria. The file suffix for the final filtered files will be `*.mLb.clN.*`. If you specify the `--save_align_intermeds` parameter then two additional sets of files will be present. These represent the unfiltered alignments with duplicates marked (`*.mLb.mkD.*`), and in the case of paired-end datasets the filtered alignments before the removal of orphan read pairs (`*.mLb.flT.*`). * `bwa/mergedLibrary/samtools_stats/` - * SAMtools `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. + * SAMtools `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. * `bwa/mergedLibrary/picard_metrics/` - * `*_metrics`: Alignment QC files from picard CollectMultipleMetrics. - * `*.metrics.txt`: Metrics file from MarkDuplicates. + * `*_metrics`: Alignment QC files from picard CollectMultipleMetrics. + * `*.metrics.txt`: Metrics file from MarkDuplicates. * `bwa/mergedLibrary/picard_metrics/pdf/` - * `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. + * `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. * `bwa/mergedLibrary/preseq/` - * `*.ccurve.txt`: Preseq expected future yield file. + * `*.ccurve.txt`: Preseq expected future yield file. > **NB:** File names in the resulting directory (i.e. `bwa/mergedLibrary/`) will have the '`.mLb.`' suffix. @@ -115,7 +115,7 @@ The [Preseq](http://smithlabresearch.org/software/preseq/) package is aimed at p Output files * `bwa/mergedLibrary/bigwig/` - * `*.bigWig`: Normalised bigWig files scaled to 1 million mapped reads. + * `*.bigWig`: Normalised bigWig files scaled to 1 million mapped reads. @@ -127,12 +127,12 @@ The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in a Output files * `bwa/mergedLibrary/phantompeakqualtools/` - * `*.spp.out`, `*.spp.pdf`: phantompeakqualtools output files. - * `*_mqc.tsv`: MultiQC custom content files. + * `*.spp.out`, `*.spp.pdf`: phantompeakqualtools output files. + * `*_mqc.tsv`: MultiQC custom content files. * `bwa/mergedLibrary/deepTools/plotFingerprint/` - * `*.plotFingerprint.pdf`, `*.plotFingerprint.qcmetrics.txt`, `*.plotFingerprint.raw.txt`: plotFingerprint output files. + * `*.plotFingerprint.pdf`, `*.plotFingerprint.qcmetrics.txt`, `*.plotFingerprint.raw.txt`: plotFingerprint output files. * `bwa/mergedLibrary/deepTools/plotProfile/` - * `*.computeMatrix.mat.gz`, `*.computeMatrix.vals.mat.tab`, `*.plotProfile.pdf`, `*.plotProfile.tab`, `*.plotHeatmap.pdf`, `*.plotHeatmap.mat.tab`: plotProfile output files. + * `*.computeMatrix.mat.gz`, `*.computeMatrix.vals.mat.tab`, `*.plotProfile.pdf`, `*.plotProfile.tab`, `*.plotHeatmap.pdf`, `*.plotHeatmap.mat.tab`: plotProfile output files. @@ -162,12 +162,12 @@ The results from deepTools plotProfile gives you a quick visualisation for the g Output files * `bwa/mergedLibrary/macs//` - * `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in *narrowPeak* or *broadPeak* mode. - * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. + * `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in *narrowPeak* or *broadPeak* mode. + * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. * `bwa/mergedLibrary/macs//qc/` - * `macs_peak.plots.pdf`: QC plots for MACS2 peaks. - * `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. - * `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. + * `macs_peak.plots.pdf`: QC plots for MACS2 peaks. + * `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. + * `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. > **NB:** `` in the directory structure above corresponds to the type of peak that you have specified to call with MACS2 i.e. `broadPeak` or `narrowPeak`. If you so wish, you can call both narrow and broad peaks without redoing the preceding steps in the pipeline such as the alignment and filtering. For example, if you already have broad peaks then just add `--narrow_peak -resume` to the command you used to run the pipeline, and these will be called too! However, resuming the pipeline will only be possible if you have not deleted the `work/` directory generated by the pipeline. @@ -191,13 +191,13 @@ Various QC plots per sample including number of peaks, fold-change distribution, Output files * `bwa/mergedLibrary/macs//consensus/` - * `*.bed`: Consensus peak-set across all samples in BED format. - * `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - * `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. - * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file for consensus peaks. - * `*.boolean.annotatePeaks.txt`: Spreadsheet representation of consensus peak-set across samples **with** gene annotation columns. The columns from individual peak files are included in this file along with the ability to filter peaks based on their presence or absence in multiple replicates/conditions. - * `*.boolean.txt`: Spreadsheet representation of consensus peak-set across samples **without** gene annotation columns. Same as file above but without annotation columns. - * `*.boolean.intersect.plot.pdf`, `*.boolean.intersect.txt`: [UpSetR](https://cran.r-project.org/web/packages/UpSetR/README.html) files to illustrate peak intersection. + * `*.bed`: Consensus peak-set across all samples in BED format. + * `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. + * `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. + * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file for consensus peaks. + * `*.boolean.annotatePeaks.txt`: Spreadsheet representation of consensus peak-set across samples **with** gene annotation columns. The columns from individual peak files are included in this file along with the ability to filter peaks based on their presence or absence in multiple replicates/conditions. + * `*.boolean.txt`: Spreadsheet representation of consensus peak-set across samples **without** gene annotation columns. Same as file above but without annotation columns. + * `*.boolean.intersect.plot.pdf`, `*.boolean.intersect.txt`: [UpSetR](https://cran.r-project.org/web/packages/UpSetR/README.html) files to illustrate peak intersection. @@ -219,18 +219,18 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co Output files * `bwa/mergedLibrary/macs//consensus//deseq2/` - * `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. - * `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - * `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. - * `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. - * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. + * `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. + * `*.plots.pdf`: File containing PCA and hierarchical clustering plots. + * `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. + * `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. + * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. * `bwa/mergedLibrary/macs//consensus///` - * `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. - * `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. - * `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. - * `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. + * `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. + * `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. + * `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. + * `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. * `bwa/mergedLibrary/macs//consensus//sizeFactors/` - * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample. + * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample. @@ -260,9 +260,9 @@ By default, all possible pairwise comparisons across the groups from a particula Output files * `multiqc//` - * `multiqc_report.html`: A standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: Directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: Directory containing static images from the report in various formats. + * `multiqc_report.html`: A standalone HTML file that can be viewed in your web browser. + * `multiqc_data/`: Directory containing parsed statistics from the different tools used in the pipeline. + * `multiqc_plots/`: Directory containing static images from the report in various formats. @@ -278,8 +278,8 @@ The pipeline has special steps which also allow the software versions to be repo Output files * `igv//` - * `igv_session.xml`: Session file that can be directly loaded into IGV. - * `igv_files.txt`: File containing a listing of the files used to create the IGV session. + * `igv_session.xml`: Session file that can be directly loaded into IGV. + * `igv_files.txt`: File containing a listing of the files used to create the IGV session. @@ -303,9 +303,9 @@ Once installed, open IGV, go to `File > Open Session` and select the `igv_sessio Output files * `genome/` - * A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. + * A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. * `genome/BWAIndex/` - * If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes. + * If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes. @@ -317,10 +317,10 @@ Reference genome-specific files can be useful to keep for the downstream process Output files * `pipeline_info/` - * `pipeline_report.html`, `pipeline_report.txt`, `software_versions.csv`: Reports generated by the pipeline. - * `execution_report.html`, `execution_timeline.html`, `execution_trace.txt`, `pipeline_dag.svg`: Reports generated by Nextflow. - * `design_reads.csv`, `design_controls.csv`: Reformatted design files used as input to the pipeline. - * `results_description.html`: Documentation for interpretation of results in HTML format. + * `pipeline_report.html`, `pipeline_report.txt`, `software_versions.csv`: Reports generated by the pipeline. + * `execution_report.html`, `execution_timeline.html`, `execution_trace.txt`, `pipeline_dag.svg`: Reports generated by Nextflow. + * `design_reads.csv`, `design_controls.csv`: Reformatted design files used as input to the pipeline. + * `results_description.html`: Documentation for interpretation of results in HTML format. From 8b484b26ea030972c05de7deadf789180b9ce394 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Tue, 27 Oct 2020 13:00:38 +0000 Subject: [PATCH 158/538] Fix markdownlint --- docs/usage.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 661a4ae0a..7b9c7474d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -143,21 +143,21 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Docker](https://docker.com/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Podman](https://podman.io/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `conda` - * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. - * A generic configuration profile to be used with [Conda](https://conda.io/docs/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) + * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. + * A generic configuration profile to be used with [Conda](https://conda.io/docs/) + * Pulls most software from [Bioconda](https://bioconda.github.io/) * `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters + * A profile with a complete configuration for automated testing + * Includes links to test data so needs no other parameters ### `-resume` From 120953a02e27b13b101db0a8e8c59c1d5cafddf6 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 19 Nov 2020 13:47:35 +0000 Subject: [PATCH 159/538] Template update for nf-core/tools version 1.12 --- .github/ISSUE_TEMPLATE/bug_report.md | 7 ++++- .github/ISSUE_TEMPLATE/config.yml | 8 +++++ .github/ISSUE_TEMPLATE/feature_request.md | 6 ++++ .github/workflows/awsfulltest.yml | 7 +++-- .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 2 +- .github/workflows/ci.yml | 12 +++++--- .github/workflows/linting.yml | 13 ++++++-- .github/workflows/linting_comment.yml | 29 ++++++++++++++++++ .github/workflows/push_dockerhub_dev.yml | 28 +++++++++++++++++ ...ckerhub.yml => push_dockerhub_release.yml} | 15 ++------- Dockerfile | 2 +- README.md | 2 +- assets/nf-core-chipseq_logo.png | Bin 12485 -> 519 bytes assets/sendmail_template.txt | 2 +- main.nf | 14 ++++----- nextflow.config | 5 +-- 17 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/linting_comment.yml create mode 100644 .github/workflows/push_dockerhub_dev.yml rename .github/workflows/{push_dockerhub.yml => push_dockerhub_release.yml} (68%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dfb5c2cbf..ebbccc285 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,10 +1,15 @@ +--- +name: Bug report +about: Report something that is broken or incorrect +labels: bug +--- + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..6b4360344 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Join nf-core + url: https://nf-co.re/join + about: Please join the nf-core community here + - name: "Slack #chipseq channel" + url: https://nfcore.slack.com/channels/chipseq + about: Discussion about the nf-core/chipseq pipeline diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 1f5a0971a..4a1e82612 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,3 +1,9 @@ +--- +name: Feature request +about: Suggest an idea for the nf-core website +labels: enhancement +--- + +## Check Documentation + +I have checked the following places for your error: + +- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) +- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/nf-core/chipseq/usage) + ## Description of the bug @@ -28,6 +35,13 @@ Steps to reproduce the behaviour: +## Log files + +Have you provided the following extra information/files: + +- [ ] The command used to run the pipeline +- [ ] The `.nextflow.log` file + ## System - Hardware: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e910ffbc7..f5062d15c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,8 +13,14 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip ## PR checklist -- [ ] This comment contains a description of changes (with reason) -- [ ] `CHANGELOG.md` is updated +- [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] Documentation in `docs` is updated -- [ ] If necessary, also make a PR on the [nf-core/chipseq branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/chipseq) + - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Usage Documentation in `docs/usage.md` is updated. +- [ ] Output Documentation in `docs/output.md` is updated. +- [ ] `CHANGELOG.md` is updated. +- [ ] `README.md` is updated (including new tool citations and authors/contributors). diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index 96b12a703..8d7eb53b0 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -1,5 +1,12 @@ # Markdownlint configuration file -default: true, +default: true line-length: false no-duplicate-header: siblings_only: true +no-inline-html: + allowed_elements: + - img + - p + - kbd + - details + - summary diff --git a/Dockerfile b/Dockerfile index daff7b6c6..0c5ae5e88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.12 +FROM nfcore/base:1.12.1 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" diff --git a/README.md b/README.md index 16aa16279..b368f5d77 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ ## Introduction + +**nf-core/chipseq** is a bioinformatics best-practise analysis pipeline for + The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible. ## Quick Start @@ -38,6 +41,15 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. +## Pipeline Summary + +By default, the pipeline currently performs the following: + + + +* Sequencing quality control (`FastQC`) +* Overall pipeline run summaries (`MultiQC`) + ## Documentation The nf-core/chipseq pipeline comes with documentation about the pipeline: [usage](https://nf-co.re/chipseq/usage) and [output](https://nf-co.re/chipseq/output). @@ -48,13 +60,18 @@ The nf-core/chipseq pipeline comes with documentation about the pipeline: [usage nf-core/chipseq was originally written by Philip Ewels. +We thank the following people for their extensive assistance in the development +of this pipeline: + + + ## Contributions and Support If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). For further information or help, don't hesitate to get in touch on the [Slack `#chipseq` channel](https://nfcore.slack.com/channels/chipseq) (you can join with [this invite](https://nf-co.re/join/slack)). -## Citation +## Citations @@ -67,3 +84,7 @@ You can cite the `nf-core` publication as follows: > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). > ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) + +In addition, references of tools and data used in this pipeline are as follows: + + diff --git a/assets/nf-core-chipseq_logo.png b/assets/nf-core-chipseq_logo.png index 1993002f28494136e88a278dbbfcb5170b757b3e..e123d62bb8c81e893790d2f248912373a13f5b66 100644 GIT binary patch literal 110285 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%0A!x&V_j%5p@XZj>hydHB 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 diff --git a/main.nf b/main.nf index 39f9c1478..778966e04 100644 --- a/main.nf +++ b/main.nf @@ -336,7 +336,7 @@ workflow.onComplete { def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, baseDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] def sf = new File("$projectDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() From a4166d4df04681b2b85607c1ac4188def3dafa30 Mon Sep 17 00:00:00 2001 From: drpatelh Date: Wed, 16 Dec 2020 17:59:22 +0000 Subject: [PATCH 163/538] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ccf1521c..e58d024d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Move template boilerplate code to Groovy `lib/` * Implement pipeline in DSL2 -* Update pipeline template to nf-core/tools `1.12` +* Update pipeline template to nf-core/tools `1.12.1` ### `Fixed` From a1f1d1a02dbaaa7cfaefa1ad0d4a810543d0d1ae Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 16 Dec 2020 21:01:55 +0000 Subject: [PATCH 164/538] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index caeb2baf0..b8c3918c1 100644 --- a/README.md +++ b/README.md @@ -97,4 +97,4 @@ An extensive list of references for the tools used by the pipeline can be found > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > -> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). \ No newline at end of file +> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). From 87b2a24f8a831195213b1f3e8e9fa7c726804ce4 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 18 Mar 2021 12:05:43 +0000 Subject: [PATCH 165/538] Template update for nf-core/tools version 1.13 --- .github/.dockstore.yml | 1 + .github/CONTRIBUTING.md | 4 +- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 6 +- .github/workflows/awsfulltest.yml | 17 +- .github/workflows/awstest.yml | 17 +- .github/workflows/branch.yml | 7 +- .github/workflows/linting.yml | 2 +- CODE_OF_CONDUCT.md | 117 ++++- Dockerfile | 6 +- README.md | 7 +- assets/email_template.html | 1 - assets/nf-core-chipseq_logo.png | Bin 110285 -> 17874 bytes bin/markdown_to_html.py | 0 bin/scrape_software_versions.py | 0 conf/base.config | 2 +- conf/test.config | 2 + conf/test_full.config | 2 + docs/images/nf-core-chipseq_logo.png | Bin 110285 -> 34565 bytes docs/output.md | 4 - docs/usage.md | 12 +- lib/Headers.groovy | 43 ++ lib/NfcoreSchema.groovy | 571 ++++++++++++++++++++++ lib/nfcore_external_java_deps.jar | Bin 0 -> 2291171 bytes main.nf | 143 ++---- nextflow.config | 42 +- nextflow_schema.json | 27 +- 28 files changed, 866 insertions(+), 171 deletions(-) mode change 100755 => 100644 bin/markdown_to_html.py mode change 100755 => 100644 bin/scrape_software_versions.py create mode 100644 lib/Headers.groovy create mode 100644 lib/NfcoreSchema.groovy create mode 100644 lib/nfcore_external_java_deps.jar diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml index 030138a0c..191fabd22 100644 --- a/.github/.dockstore.yml +++ b/.github/.dockstore.yml @@ -3,3 +3,4 @@ version: 1.2 workflows: - subclass: nfl primaryDescriptorPath: /nextflow.config + publish: True diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 32de1a44b..81a0933ea 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -69,7 +69,7 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`) +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). 6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. @@ -87,7 +87,7 @@ Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. ### Default processes resource requirements -Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/%7B%7Bcookiecutter.name_noslash%7D%7D/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. +Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7edcb791e..7e6f4d86a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -55,7 +55,7 @@ Have you provided the following extra information/files: ## Container engine -- Engine: +- Engine: - version: - Image tag: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 4a1e82612..15aceab96 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for the nf-core website +about: Suggest an idea for the nf-core/chipseq pipeline labels: enhancement --- diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f5062d15c..f1d89ef72 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,9 +15,9 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint .`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index f763c9f46..3f1420d3b 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -9,6 +9,16 @@ on: types: [completed] workflow_dispatch: + +env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + + jobs: run-awstest: name: Run AWS full tests @@ -27,13 +37,6 @@ jobs: # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} run: | aws batch submit-job \ --region eu-west-1 \ diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 84b6dbb00..83bf06058 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -6,6 +6,16 @@ name: nf-core AWS test on: workflow_dispatch: + +env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} + AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} + AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + + jobs: run-awstest: name: Run AWS tests @@ -23,13 +33,6 @@ jobs: # TODO nf-core: You can customise CI pipeline run tests as required # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} run: | aws batch submit-job \ --region eu-west-1 \ diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 17179b678..d737ff7c6 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/chipseq' run: | - { [[ ${{github.event.pull_request.head.repo.full_name}} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure @@ -25,11 +25,12 @@ jobs: message: | Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the ${{github.event.pull_request.head.repo.full_name}} `master` branch. + It looks like this pull-request is has been made against the ${{github.event.pull_request.base.repo.full_name }} `master` branch. The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.head.repo.full_name}} `dev` branch. + Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.base.repo.full_name }} `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. + Note that even after this, the test will continue to show as failing until you push a new commit. Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index bef81e619..58e281df6 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -69,7 +69,7 @@ jobs: if: ${{ always() }} uses: actions/upload-artifact@v2 with: - name: linting-log-file + name: linting-logs path: | lint_log.txt lint_results.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 405fb1bfd..f4fd052f1 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,46 +1,111 @@ -# Contributor Covenant Code of Conduct +# Code of Conduct at nf-core (v1.0) ## Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core, pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: -## Our Standards +- Age +- Body size +- Familial status +- Gender identity and expression +- Geographical location +- Level of experience +- Nationality and national origins +- Native language +- Physical and neurological ability +- Race or ethnicity +- Religion +- Sexual identity and orientation +- Socioeconomic status -Examples of behavior that contributes to creating a positive environment include: +Please note that the list above is alphabetised and is therefore not ranked in any order of preference or importance. -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +## Preamble -Examples of unacceptable behavior by participants include: +> Note: This Code of Conduct (CoC) has been drafted by the nf-core Safety Officer and been edited after input from members of the nf-core team and others. "We", in this document, refers to the Safety Officer and members of the nf-core core team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will amended periodically to keep it up-to-date, and in case of any dispute, the most current version will apply. -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). Our current safety officer is Renuka Kudva. + +nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. + +We have therefore adopted this code of conduct (CoC), which we require all members of our community and attendees in nf-core events to adhere to in all our workspaces at all times. Workspaces include but are not limited to Slack, meetings on Zoom, Jitsi, YouTube live etc. + +Our CoC will be strictly enforced and the nf-core team reserve the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. + +We ask all members of our community to help maintain a supportive and productive workspace and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. + +Questions, concerns or ideas on what we can include? Contact safety [at] nf-co [dot] re ## Our Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. +The safety officer is responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. + +The safety officer in consultation with the nf-core core team have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +Members of the core team or the safety officer who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and be subject to the same actions as others in violation of the CoC. + +## When are where does this Code of Conduct apply? + +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events. This includes but is not limited to the following listed alphabetically and therefore in no order of preference: + +- Communicating with an official project email address. +- Communicating with community members within the nf-core Slack channel. +- Participating in hackathons organised by nf-core (both online and in-person events). +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, Jitsi, YouTube live etc. +- Representing nf-core on social media. This includes both official and personal accounts. + +## nf-core cares 😊 + +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include but are not limited to the following (listed in alphabetical order): + +- Ask for consent before sharing another community member’s personal information (including photographs) on social media. +- Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. +- Celebrate your accomplishments at events! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) +- Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) +- Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) +- Focus on what is best for the team and the community. (When in doubt, ask) +- Graciously accept constructive criticism, yet be unafraid to question, deliberate, and learn. +- Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communications to be kind.**) +- Take breaks when you feel like you need them. +- Using welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack.) + +## nf-core frowns on 😕 + +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this code of conduct. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces. + +- Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. +- “Doxing” i.e. posting (or threatening to post) another person’s personal identifying information online. +- Spamming or trolling of individuals on social media. +- Use of sexual or discriminatory imagery, comments, or jokes and unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion or work experience. + +### Online Trolling + +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the added issue of online trolling. This is unacceptable, reports of such behaviour will be taken very seriously, and perpetrators will be excluded from activities immediately. + +All community members are required to ask members of the group they are working within for explicit consent prior to taking screenshots of individuals during video calls. + +## Procedures for Reporting CoC violations -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. -## Scope +You can reach out to members of the [nf-core core team](https://nf-co.re/about) and they will forward your concerns to the safety officer(s). -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. +Issues directly concerning members of the core team will be dealt with by other members of the core team and the safety manager, and possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson, and details will be shared in due course. -## Enforcement +All reports will be handled with utmost discretion and confidentially. -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-co.re/join/slack). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +## Attribution and Acknowledgements -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. +- The [Contributor Covenant, version 1.4](http://contributor-covenant.org/version/1/4) +- The [OpenCon 2017 Code of Conduct](http://www.opencon2017.org/code_of_conduct) (CC BY 4.0 OpenCon organisers, SPARC and Right to Research Coalition) +- The [eLife innovation sprint 2020 Code of Conduct](https://sprint.elifesciences.org/code-of-conduct/) +- The [Mozilla Community Participation Guidelines v3.1](https://www.mozilla.org/en-US/about/governance/policies/participation/) (version 3.1, CC BY-SA 3.0 Mozilla) -## Attribution +## Changelog -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct/][version] +### v1.0 - March 12th, 2021 -[homepage]: https://contributor-covenant.org -[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/Dockerfile b/Dockerfile index 0c5ae5e88..4ade659e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.12.1 +FROM nfcore/base:1.13 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" @@ -11,7 +11,3 @@ ENV PATH /opt/conda/envs/nf-core-chipseq-1.3.0dev/bin:$PATH # Dump the details of the installed packages to a file for posterity RUN conda env export --name nf-core-chipseq-1.3.0dev > nf-core-chipseq-1.3.0dev.yml - -# Instruct R processes to use these empty files instead of clashing with a local version -RUN touch .Rprofile -RUN touch .Renviron diff --git a/README.md b/README.md index b368f5d77..9be9fefca 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,12 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Install [`nextflow`](https://nf-co.re/usage/installation) -2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) or [`Podman`](https://podman.io/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```bash - nextflow run nf-core/chipseq -profile test, + nextflow run nf-core/chipseq -profile test, ``` > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. @@ -36,7 +36,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ```bash - nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 ``` See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. @@ -83,7 +83,6 @@ You can cite the `nf-core` publication as follows: > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). -> ReadCube: [Full Access Link](https://rdcu.be/b1GjZ) In addition, references of tools and data used in this pipeline are as follows: diff --git a/assets/email_template.html b/assets/email_template.html index a3f19225f..5a4548bb0 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,6 +1,5 @@ - diff --git a/assets/nf-core-chipseq_logo.png b/assets/nf-core-chipseq_logo.png index e123d62bb8c81e893790d2f248912373a13f5b66..2d8daa2d0459094c6626ac9890ef9baaebaca722 100644 GIT binary patch literal 17874 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 Y6NEZP{JR7n(gJxer6^e~ZWQ$Y0NwaQn*aa+ literal 110285 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 _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ - ## Introduction This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. diff --git a/docs/usage.md b/docs/usage.md index 5bb81b07a..1040afb1f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -51,7 +51,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -71,8 +71,14 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof * `podman` * A generic configuration profile to be used with [Podman](https://podman.io/) * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) +* `shifter` + * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) +* `charliecloud` + * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) * `conda` - * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. + * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. * A generic configuration profile to be used with [Conda](https://conda.io/docs/) * Pulls most software from [Bioconda](https://bioconda.github.io/) * `test` @@ -103,6 +109,8 @@ process { } ``` +To find the exact name of a process you wish to modify the compute resources, check the live-status of a nextflow run displayed on your terminal or check the nextflow error for a line like so: `Error executing process > 'bwa'`. In this case the name to specify in the custom config file is `bwa`. + See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition above). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. diff --git a/lib/Headers.groovy b/lib/Headers.groovy new file mode 100644 index 000000000..15d1d3880 --- /dev/null +++ b/lib/Headers.groovy @@ -0,0 +1,43 @@ +/* + * This file holds several functions used to render the nf-core ANSI header. + */ + +class Headers { + + private static Map log_colours(Boolean monochrome_logs) { + Map colorcodes = [:] + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['yellow_bold'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + colorcodes['red'] = monochrome_logs ? '' : "\033[1;91m" + return colorcodes + } + + static String dashed_line(monochrome_logs) { + Map colors = log_colours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" + } + + static String nf_core(workflow, monochrome_logs) { + Map colors = log_colours(monochrome_logs) + String.format( + """\n + ${dashed_line(monochrome_logs)} + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${dashed_line(monochrome_logs)} + """.stripIndent() + ) + } +} diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy new file mode 100644 index 000000000..78e8c65d7 --- /dev/null +++ b/lib/NfcoreSchema.groovy @@ -0,0 +1,571 @@ +/* + * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. + */ + +import org.everit.json.schema.Schema +import org.everit.json.schema.loader.SchemaLoader +import org.everit.json.schema.ValidationException +import org.json.JSONObject +import org.json.JSONTokener +import org.json.JSONArray +import groovy.json.JsonSlurper +import groovy.json.JsonBuilder + +class NfcoreSchema { + + /* + * Function to loop over all parameters defined in schema and check + * whether the given paremeters adhere to the specificiations + */ + /* groovylint-disable-next-line UnusedPrivateMethodParameter */ + private static void validateParameters(params, jsonSchema, log) { + def has_error = false + //=====================================================================// + // Check for nextflow core params and unexpected params + def json = new File(jsonSchema).text + def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') + def nf_params = [ + // Options for base `nextflow` command + 'bg', + 'c', + 'C', + 'config', + 'd', + 'D', + 'dockerize', + 'h', + 'log', + 'q', + 'quiet', + 'syslog', + 'v', + 'version', + + // Options for `nextflow run` command + 'ansi', + 'ansi-log', + 'bg', + 'bucket-dir', + 'c', + 'cache', + 'config', + 'dsl2', + 'dump-channels', + 'dump-hashes', + 'E', + 'entry', + 'latest', + 'lib', + 'main-script', + 'N', + 'name', + 'offline', + 'params-file', + 'pi', + 'plugins', + 'poll-interval', + 'pool-size', + 'profile', + 'ps', + 'qs', + 'queue-size', + 'r', + 'resume', + 'revision', + 'stdin', + 'stub', + 'stub-run', + 'test', + 'w', + 'with-charliecloud', + 'with-conda', + 'with-dag', + 'with-docker', + 'with-mpi', + 'with-notification', + 'with-podman', + 'with-report', + 'with-singularity', + 'with-timeline', + 'with-tower', + 'with-trace', + 'with-weblog', + 'without-docker', + 'without-podman', + 'work-dir' + ] + def unexpectedParams = [] + + // Collect expected parameters from the schema + def expectedParams = [] + for (group in schemaParams) { + for (p in group.value['properties']) { + expectedParams.push(p.key) + } + } + + for (specifiedParam in params.keySet()) { + // nextflow params + if (nf_params.contains(specifiedParam)) { + log.error "ERROR: You used a core Nextflow option with two hyphens: '--${specifiedParam}'. Please resubmit with '-${specifiedParam}'" + has_error = true + } + // unexpected params + def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam)) { + unexpectedParams.push(specifiedParam) + } + } + + //=====================================================================// + // Validate parameters against the schema + InputStream inputStream = new File(jsonSchema).newInputStream() + JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)) + + // Remove anything that's in params.schema_ignore_params + rawSchema = removeIgnoredParams(rawSchema, params) + + Schema schema = SchemaLoader.load(rawSchema) + + // Clean the parameters + def cleanedParams = cleanParameters(params) + + // Convert to JSONObject + def jsonParams = new JsonBuilder(cleanedParams) + JSONObject paramsJSON = new JSONObject(jsonParams.toString()) + + // Validate + try { + schema.validate(paramsJSON) + } catch (ValidationException e) { + println '' + log.error 'ERROR: Validation of pipeline parameters failed!' + JSONObject exceptionJSON = e.toJSON() + printExceptions(exceptionJSON, paramsJSON, log) + println '' + has_error = true + } + + // Check for unexpected parameters + if (unexpectedParams.size() > 0) { + Map colors = log_colours(params.monochrome_logs) + println '' + def warn_msg = 'Found unexpected parameters:' + for (unexpectedParam in unexpectedParams) { + warn_msg = warn_msg + "\n* --${unexpectedParam}: ${params[unexpectedParam].toString()}" + } + log.warn warn_msg + log.info "- ${colors.dim}Ignore this warning: params.schema_ignore_params = \"${unexpectedParams.join(',')}\" ${colors.reset}" + println '' + } + + if (has_error) { + System.exit(1) + } + } + + // Loop over nested exceptions and print the causingException + private static void printExceptions(exJSON, paramsJSON, log) { + def causingExceptions = exJSON['causingExceptions'] + if (causingExceptions.length() == 0) { + def m = exJSON['message'] =~ /required key \[([^\]]+)\] not found/ + // Missing required param + if (m.matches()) { + log.error "* Missing required parameter: --${m[0][1]}" + } + // Other base-level error + else if (exJSON['pointerToViolation'] == '#') { + log.error "* ${exJSON['message']}" + } + // Error with specific param + else { + def param = exJSON['pointerToViolation'] - ~/^#\// + def param_val = paramsJSON[param].toString() + log.error "* --${param}: ${exJSON['message']} (${param_val})" + } + } + for (ex in causingExceptions) { + printExceptions(ex, paramsJSON, log) + } + } + + // Remove an element from a JSONArray + private static JSONArray removeElement(jsonArray, element){ + def list = [] + int len = jsonArray.length() + for (int i=0;i + if(rawSchema.keySet().contains('definitions')){ + rawSchema.definitions.each { definition -> + for (key in definition.keySet()){ + if (definition[key].get("properties").keySet().contains(ignore_param)){ + // Remove the param to ignore + definition[key].get("properties").remove(ignore_param) + // If the param was required, change this + if (definition[key].has("required")) { + def cleaned_required = removeElement(definition[key].required, ignore_param) + definition[key].put("required", cleaned_required) + } + } + } + } + } + if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').containsKey(ignore_param)) { + rawSchema.get("properties").remove(ignore_param) + } + if(rawSchema.keySet().contains('required') && rawSchema.required.contains(ignore_param)) { + def cleaned_required = removeElement(rawSchema.required, ignore_param) + rawSchema.put("required", cleaned_required) + } + } + return rawSchema + } + + private static Map cleanParameters(params) { + def new_params = params.getClass().newInstance(params) + for (p in params) { + // remove anything evaluating to false + if (!p['value']) { + new_params.remove(p.key) + } + // Cast MemoryUnit to String + if (p['value'].getClass() == nextflow.util.MemoryUnit) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast Duration to String + if (p['value'].getClass() == nextflow.util.Duration) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast LinkedHashMap to String + if (p['value'].getClass() == LinkedHashMap) { + new_params.replace(p.key, p['value'].toString()) + } + } + return new_params + } + + /* + * This method tries to read a JSON params file + */ + private static LinkedHashMap params_load(String json_schema) { + def params_map = new LinkedHashMap() + try { + params_map = params_read(json_schema) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + private static Map log_colours(Boolean monochrome_logs) { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes + } + + static String dashed_line(monochrome_logs) { + Map colors = log_colours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" + } + + /* + Method to actually read in JSON file using Groovy. + Group (as Key), values are all parameters + - Parameter1 as Key, Description as Value + - Parameter2 as Key, Description as Value + .... + Group + - + */ + private static LinkedHashMap params_read(String json_schema) throws Exception { + def json = new File(json_schema).text + def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') + def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') + /* Tree looks like this in nf-core schema + * definitions <- this is what the first get('definitions') gets us + group 1 + title + description + properties + parameter 1 + type + description + parameter 2 + type + description + group 2 + title + description + properties + parameter 1 + type + description + * properties <- parameters can also be ungrouped, outside of definitions + parameter 1 + type + description + */ + + // Grouped params + def params_map = new LinkedHashMap() + schema_definitions.each { key, val -> + def Map group = schema_definitions."$key".properties // Gets the property object of the group + def title = schema_definitions."$key".title + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put(innerkey, value) + } + params_map.put(title, sub_params) + } + + // Ungrouped params + def ungrouped_params = new LinkedHashMap() + schema_properties.each { innerkey, value -> + ungrouped_params.put(innerkey, value) + } + params_map.put("Other parameters", ungrouped_params) + + return params_map + } + + /* + * Get maximum number of characters across all parameter names + */ + private static Integer params_max_chars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (param.size() > max_chars) { + max_chars = param.size() + } + } + } + return max_chars + } + + /* + * Beautify parameters for --help + */ + private static String params_help(workflow, params, json_schema, command) { + Map colors = log_colours(params.monochrome_logs) + Integer num_hidden = 0 + String output = '' + output += 'Typical pipeline command:\n\n' + output += " ${colors.cyan}${command}${colors.reset}\n\n" + Map params_map = params_load(json_schema) + Integer max_chars = params_max_chars(params_map) + 1 + Integer desc_indent = max_chars + 14 + Integer dec_linewidth = 160 - desc_indent + for (group in params_map.keySet()) { + Integer num_params = 0 + String group_output = colors.underlined + colors.bold + group + colors.reset + '\n' + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (group_params.get(param).hidden && !params.show_hidden_params) { + num_hidden += 1 + continue; + } + def type = '[' + group_params.get(param).type + ']' + def description = group_params.get(param).description + def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def description_default = description + colors.dim + defaultValue + colors.reset + // Wrap long description texts + // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap + if (description_default.length() > dec_linewidth){ + List olines = [] + String oline = "" // " " * indent + description_default.split(" ").each() { wrd -> + if ((oline.size() + wrd.size()) <= dec_linewidth) { + oline += wrd + " " + } else { + olines += oline + oline = wrd + " " + } + } + olines += oline + description_default = olines.join("\n" + " " * desc_indent) + } + group_output += " --" + param.padRight(max_chars) + colors.dim + type.padRight(10) + colors.reset + description_default + '\n' + num_params += 1 + } + group_output += '\n' + if (num_params > 0){ + output += group_output + } + } + output += dashed_line(params.monochrome_logs) + if (num_hidden > 0){ + output += colors.dim + "\n Hiding $num_hidden params, use --show_hidden_params to show.\n" + colors.reset + output += dashed_line(params.monochrome_logs) + } + return output + } + + /* + * Groovy Map summarising parameters/workflow options used by the pipeline + */ + private static LinkedHashMap params_summary_map(workflow, params, json_schema) { + // Get a selection of core Nextflow workflow options + def Map workflow_summary = [:] + if (workflow.revision) { + workflow_summary['revision'] = workflow.revision + } + workflow_summary['runName'] = workflow.runName + if (workflow.containerEngine) { + workflow_summary['containerEngine'] = "$workflow.containerEngine" + } + if (workflow.container) { + workflow_summary['container'] = "$workflow.container" + } + workflow_summary['launchDir'] = workflow.launchDir + workflow_summary['workDir'] = workflow.workDir + workflow_summary['projectDir'] = workflow.projectDir + workflow_summary['userName'] = workflow.userName + workflow_summary['profile'] = workflow.profile + workflow_summary['configFiles'] = workflow.configFiles.join(', ') + + // Get pipeline parameters defined in JSON Schema + def Map params_summary = [:] + def blacklist = ['hostnames'] + def params_map = params_load(json_schema) + for (group in params_map.keySet()) { + def sub_params = new LinkedHashMap() + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (params.containsKey(param) && !blacklist.contains(param)) { + def params_value = params.get(param) + def schema_value = group_params.get(param).default + def param_type = group_params.get(param).type + if (schema_value == null) { + if (param_type == 'boolean') { + schema_value = false + } + if (param_type == 'string') { + schema_value = '' + } + if (param_type == 'integer') { + schema_value = 0 + } + } else { + if (param_type == 'string') { + if (schema_value.contains('$projectDir') || schema_value.contains('${projectDir}')) { + def sub_string = schema_value.replace('\$projectDir', '') + sub_string = sub_string.replace('\${projectDir}', '') + if (params_value.contains(sub_string)) { + schema_value = params_value + } + } + if (schema_value.contains('$params.outdir') || schema_value.contains('${params.outdir}')) { + def sub_string = schema_value.replace('\$params.outdir', '') + sub_string = sub_string.replace('\${params.outdir}', '') + if ("${params.outdir}${sub_string}" == params_value) { + schema_value = params_value + } + } + } + } + + if (params_value != schema_value) { + sub_params.put("$param", params_value) + } + } + } + params_summary.put(group, sub_params) + } + return [ 'Core Nextflow options' : workflow_summary ] << params_summary + } + + /* + * Beautify parameters for summary and return as string + */ + private static String params_summary_log(workflow, params, json_schema) { + String output = '' + def params_map = params_summary_map(workflow, params, json_schema) + def max_chars = params_max_chars(params_map) + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + if (group_params) { + output += group + '\n' + for (param in group_params.keySet()) { + output += " \u001B[1m" + param.padRight(max_chars) + ": \u001B[1m" + group_params.get(param) + '\n' + } + output += '\n' + } + } + output += "[Only displaying parameters that differ from pipeline default]\n" + output += dashed_line(params.monochrome_logs) + output += '\n\n' + dashed_line(params.monochrome_logs) + return output + } + +} diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar new file mode 100644 index 0000000000000000000000000000000000000000..805c8bb5e4fd43a12a5891eea5a68788309629b0 GIT binary patch literal 2291171 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�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

A$B3k~{RycObG@6y| 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 $@vz03z8Z`qI{ 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

=%>>2|D73@_9Fx}<*!s;{SFX;r+XReUC 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 z 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

qm4Wk) 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 z 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�!!ybUdR4n8i&a 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≻pfc-p+kq>A@&EZJ32ii;nzX4TDQYlf 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
gy>fqEPDaO`QF}o` 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%0AO0^D-A)i$ldleqyk}TE z0DOzuYG^!fskYW#o=)mb?qa1qm^Tv>C`6Hb>)1i5HGQRt4S@V}QuBXoewHYX%Xn96GH`BobsD(C(R^ zFTgh5Nlmw@aDz)^ECPgch7+!-0)Mg&#aTturBpQ9lR4^a8vBh{x9rESp+Vo4!B|m> zROWlnG^Z9{AQiiT;fUD>feZm)`cjwbY&Mwhcg62$sV{Jgw>>03jL=_1#A?fKB4TzD zc8iQK_=4p!w%8Wp9ICRY5?LA>jm=_3b-xVHFUEnZ8y%Zq+)l?He`8R%W>AV()1FV; zwNKquADWIc-y){SXXB5ao`BgUu zXV>mGyrXLwTQ{y2IWy))2r%>c*Kw=f$!b?3v`yrvDB|uDZNKn#5bb>^djUU^D-i9o z(oJ<{ULi;EndMv_Bh2Vu;Ay8IR1N}*-CBg-gB8tJ+knNKPY~`S`zMQmrpaY3r?*8J zAr8`VQ-=6s%)CtnQ+KP(*kZhHUlmm14qIV)YIE=DFXmUfXvKZJuq*7}gB4;f)OTned!JN_TS09%<8H6^b$P zBIw24QAGc-5nVO-a2(=o)|h!ctP(j8N8Ots75j4tE?g9*$Kx5w z3Pb9K+&~7b3jD!o1KgZr)D<1m8_rDcXgO;al(@Df&1BeX`)t#4zpUuUCPT79jd`rh zmz7Z#50Kv~nJXMQKQ(gIoDdvsf3N=Zfd73+tDbWa{mlQzFdh%&YXds$hgk~te@+Dd zj=cZjCW5GiyNR)qh39{YQEIt;Oak9zmyMT)gX)VCwSw)DJp+Hrlxi0iqJdh_6w+bX zNhervF{XtvCn!?GgolSWC-WUB61;#`kyRDV{?gp8vwJ~!4{V(nj+LGcIvU}0x?6gF zzFRUo_t~H5`u2<`fSV(g8sB5DAj(dl+v7|_$8h;W&7>W;@OS|XV(&8_FoCv&H8l>3 z+d8HtsAn{dgEd0nBB-)oQh^qQz52o>6W zetMA1nTBhsZw4TS9&y&5b1qRXCE0n&;Bf_L)@lycs;C)--WFDsUR$;w9Eo}> z)8U?0YA~}aGUl_ZseWKIJJLxWq}m>xLDy>b zaERcZWu7sfNNKpzS7FSKW@1dJKl0%Dnf6V7sT%Ks=Hbg{Fkh*<- zp-L2>zf`y?sgPBTqUt{x01#5L={?(mgkI8IPp8P#`H16Vr3lm3yW4tE>r>u0ZDM4% zr7i9$^eZGh5v<^#okSR%?-i(fxSP za~JLYzz3XRvoyfTU82_poM2N3nt-Y~@EV41PzIdA(9ghaAW&k43Iitj^kbI`WCFqP zzGX@`WFHRlUARZq`#WK<0<_!XHZ%BrtSQF}0Wl}bPIF_r1GG=`Y%=Yyu5}e!ISmo! zauYF+xYN+qN^qwr!gk&J$JDeY@(rJ!;gs_b=@6?!~#Dxm38P`{Gwq$AMTu#YUyLMeRdX zP)YRA5*(YNL{-eWgt>qQQMiV(@TE!@5t)-nWoPoFc_#w#R*4>_{%4%d!4Y+H+zr*c z1d`$Ms$vHhiybw0c2$htiaqnR#0O0K)C;+lNbG^l^BQVpu0Vltm83;asa-fb-Z%{hq9x1q~7ky%rRfuN;{ysbe zTPB?1Pht0MVhIlr8xex1x!HSgEkD8fRATv7vcks+r9E?Mr{+C|Sa%%4b?$IMEyc2X zp+aOZ@wGnr*`F|+{&t8S;kV9VjlrYDgm@amnPi)Fgs!ImbjwD%2qRJqCi}P?p$Ge9 zt_quRNu&q3vqe1zb8tu|$p)AmloCe@&j&@(KRl`{()v)zdZS(@i z@X!VAZVYk|A;Cpn3(^{L377s*v#Hn?B)7O(^qv66 zc;+*OkVZ5CJ?aq8ngh?$n}0c?DtP*y2iejD*j9pmMjqE;`^OsS`1eLX;GOzwAPYUf zvl4zxyFmurlj;bpH${7;_Vt3V>R5gB%y4M1%0#AkY}VvPH~JG1x~jOJg} zjH3V9tmR*E+W*^0dx^?FSlZLA_02S(R)BYKXx8Y)h<8wd5{vNweEPF5Y>SXTHm}*b zw2A)oYZndr80s33KxVxHM-Cb17$c0k zrRy7kkawpmA@rVoH69{mq4_31*hs9(-5qG38f-`1bsSw)gP??H&d}B6WVGy3!haA> zpfHtb+unI8D6+(=m)gyG9DSsc4vqn~ z${Coq-8dh53yjNNXrw&=a+5WFSQ0l0j455Ia6uqXsyocLL>7CL$_5|}Qu$AZxX{Sn zc*k-PvIvGna>Q&a(LfI)X?h3Oh~K7!+4<`$)ZzUTxK3LTc!}evoB6JL<|m!bVO0iD z9Pa+6BOhSzjK$K2`BASpH9q`FcA)2e_0ulP1he&8_#ONyyI12dMSVdUJs&ypGxX*Fb^Q> zx>*A3BV%`O2->yPU=o3KevV7b&MH}={BMp09j;U06K@f6oBT9BQSV_mrI@%y{UwcI zch!bNIBDv=3p%Z)$k`Jgh_N3ax#MpTV0#;c!SpT&EQdrHCkKkUxkO*ay8f+y--W^w z_c5h>??N5^bOIP<3@C!ok1Dx)62Bsr1 zVQ@-HhST%q=atWQ6~ui~_b2xQj3CmEWKt?UY0lpRGiToc8k&~n2TIWf)Ao?p{#|b{ zeDHEu%?m_jG%3jt1!<6xW`ATff*NQbnGvkpphQ}Nt9U33GA1OxbUlWUrmaOK-%L%l zDV9@%A{g5k0tRDDbq&^YcjZYt{lm=t;!nRk-~QR`eaQtSo9TLl*sNtKm8tSERXo|u zGnTbk?G=yt@-uy5hbki zrW~lTbrlzuD$GT-6bVhtoLpY$p0iht#PreO zO^&3`bx7-C49u9B44G@)A(vE*hQ7C)x{@=xh=7}WS%s<8-uE?8p+#>b_ye7CTDe)- zHD_~MSk~X&H>>#MWT|=L{Ee~IU2}&Vff-e>24lXd?dtL|OqmJpw?#N$qQqbps$QVi zp|4h$(V<&mY2pP<1K!w)>SOaLldyQp&3$x6Q=+#HGVPXXhtpdyZHs3NFAbY%yXUEx zsy&z)=^;w>L1thYV=X}-ETkK%HPjgBCUGsz*w4WC7m@xlD7rmX$UI7p5OAp4Z>e@( z)EGL98MHQonXywww8a`v%4oP}QT)9P%|}ui1{tY0r8PcPI#QB2RB1x|Z3=?#6oa!r zDIC3tjWp@}D81cciQ}ByRhJF_0S@>&FT2Z#>rjITA4TZ3&?7ulPY9{#-1p(8HXOcU%byuKniB< z%Ip%4Atmi1l4sYC2Nf!^axO{teTBO#QnAn_F1VQ>aqWaa`jxdIBM-3)xHQBS-N1`F zK)DZfpzGb`_2d5b!Bzp!>7ybdY&Al~ZlSbZxi@9)**_qkou@vDwsElTaDdGSxXww3 zpo!6i31R};hw}CKdr{WBq63D;;4#{za(zpGVx9njm5bj@wXijxO8ZP=YTng14P646U^v&LDeP)pdM`pRehL|c|NaX6rKV}i5+3E=Cphaw zpgc`?02RRCAfy7uyB`QPAqX3u<;^+^2<{xuwhVgZHV$U)8#%iV7yFef{=j{2J$KCR zCE;AJpxFL=P`uS1_Ze!mb9H|Buo8WN@yuX1D>29*RB~nr=jo*a``|lw9?3XDfz{9n z+3g`v46Yi#d792)$Xkr9dv9`{%$D%m=*YuQ;?+kbnB2>quMBV>Zd*mP+cm(g8|Oy5 z@x2xdFXtKcmJ4K?`N(}IX$xNUc6*o`Zd-Q5^w{rjr3ksS0v6hL`1OMO=jQXTAz1i7 zD@FcWj`BaU?!(>MWfu1G-RV$4Mboge}{2{Vyvv7%%KvaPUro_U5^10lgv|E~ULl;|3+YuiwK zdn0*c81g)~OQ64DR%VjldH6>skDziVVC^!{p9iP0_|r*(DHqs!FhLLQssu?|QOlvH zV-*yBTCN*@GUOp&qs?fdSm?OG*xER)B>Pg9dwQ7)3c7!fdRDRmS1&Zbi7SCa(4d0y zrgekGWzph4DnK7#RSoY%)C6biLEL=e+CyPSp4%;yb5dW<`S|xSqc*xSVmA5uxy2L1lQziTl@v@@AA=`&!!U;S zBb;v6l(ON(*mHze5Tr{Nsa-3U06io|V4E+>g?mCJaoc7~57^dOWhl)ng|tRkOr0kU zbw_}%&)bP*>2pstM1=YtTSUl9rY%z!K3+yu?NJwX%>$Y@QMV%(>pE!GMQa8gH_3|( zBn3r?Qflq1)>-vz2C2&L9fzufZRaqaREO$>7){#)y$WeGTbaO_SBQh;-nbU$Pl5*% z9t64&RIuW}B3TmKf&o7L&F`s`jnAQh@Te!UemvJhGOBlv4DV$+&~e&mRh zpbN`sLOQMf4zRyx1}f7hM;(lhZX(2&q(4rMN8!vbc`!nssWOW$Y~;cY86K`QoZU=i z*j6f)y3jvI4;+yw^(AU2yL zWNxI4q0j8QMPhJqDg=Ipo!^^fu|v7kuP>S*=v*{%Q~bRE_z|J1)aV&Uz%5xShj{14 zH$c?oBFW+tdFu2OEsy>L$tLfOcFOi`B#=5gm^wG!c&a~xU`CBJV@+oedPbg$=Pt&R3A3aS%p-j{->CSYFT<{NMh~ zUG}9>>hJab64<}{HwFK{{+s_yY$-{UwObHC2;GUvf$y?~E`dbR$}bV%Lr6ua3>HdI zD2|i}z!TuK-)OHgr5=gBl!gBwgCh`3;J5|m073$%a@h4FFts5MVJjn$KFGP7WWI_1 z{csbP2hiSbR1|!H7OBzJ5P-dIZRw<(r7gNiS2(VKaW4T9X;6hM_D+ZISVylzj|0seD5BTRad>jvGQ`@!kW+%FT-mH;XccjLGOVvJ+!T zD~s^vHBdZ4oJ(34gMtqDT&dO-?uF3J2k)}0s|Prc-HN_qSHY?Io;j~VmkQAV6{%jS zrUa9i)Tb?Hh;qaiFP2FDQi9j=D0;f9bF>eKj;mfDUD2sNx-lp+cCleUKY%s#*pDW_ z;7Meiqk@&vw4EP1+rYQG*S53BgdRyJqWR1nRHIBH?;of0A(ka;47PuIIuLRJD^0AHD|Z_%Y(!3?>dtyhrMdF?;2g@UvvR~ zO%U||*&~!uQvKGK{398(s6)DAFCl*A(ORhAzlGzJsalT$0a}kGa0=Ux8f3RC+Q$yN z5&&W?FR!c7SgBg10I!$glr#%SLnW7PiZjrv14T^XVo3otKk~JE?mU951M%iFcU`m) zQCkFV$meZm{od~OJD!@%Vt?P{j^hE$mz2o$cnAQ{a^PiW2dM{OmuOcUmIZWoXv!nA z+dEd%?X7`nJAf-~b#y8VCcM6Z$_LWBSAH-t?a9jWa(Ax_emCC47l5^e`}K?Mczb#Z z7zqz1AC24i^3XRu3lS53%w1!cmkKt zwY*U%k@XlEy`qetr_Si{#V=#xo@EWjqG=;dG;F%&4y@gnylJHVkuW2@atWu| z8$0reh869-0U(Sv;y>MTXcZcsJBW~xT?hNBbWE$xPt`2pl zq%k-nmyyu&k1ZNl(q!n^ktmgCXf|hy$}ls9=UKP^kdSabku=(nOi1xo)v%EnUi(VVfOS)egp>dME+miqS0;wUMrZnYcp5 zFck;FRqq|+1Q3tFAQ8hqT8yR2=-I|2rFa31`#hVb=z_3H%Lj6$Ph?uQ)jlUM9a=73 zt|*;5z`RO>PBf_Wfj0z(@gn(_?5?!S^x4_x2JY;;0XdN$`+-WrP`RU~QNQqlp?m~n z@i#8=8~F2ZTub1RnbkEs&{!=gjbu`V6|c*q9Ux;+k;=62yCorn|7P^nk zIg07%vHR7q<(tURTH+H(nOP{@nw>(?4Uwbj1j<9mU@8aTh(Yc?>e$ug8bmoKzSkIu zwCFNzWuu5X6cvT=mh95I$7HQgUPRYAU-XED8fliCn85W+SEiVS-)quk45;ajcWvii zlycdz)8-Y?wZ(~yKf~0Q$+!@Mf*lyE(iT-k^z~(rv6m<=DLJGGU#*PtBoFLcx*AoM z@f#H*omg25u;wt%dy;i9QrU-MU8pvR5!)-xu0FeE6~C&<6MSu528+EKYfKi=b;V6&CjG2~o5T3eW%lngkH5dpfe1R(Biyo3e% z?dw5(#kh^Kg3FmW$EDKgt(I%ue9P?CRcN|Km7L%<{`>&V8$Lq%Ax=13vCE}H8G$64 ze7_6bu7!wKtrm=)HYe=--Gu*=yg6F_a6>G^=46VV;`U(KbJj2+>DU<0TQU-}IFcD} zO1#Bg7p1!|jwVX_wc5yoUG;ijPN!v=Zc}Z7CoSvCYO2Rb?T~t-{BtfTrG-iZ-((ui zm)5xQ2xl!v6uL8F1&5@sg0ov~G0~Yj+`?uyylq~Rg7aOBzB$|FyIr9@s! zOwLg@MXyJvl!ackstDcwQ)!L$EVJizb}GnrByF;^&FJgQ>%FyEIKX&KicAM(gbZ5W z3tg?Uf9h;bs-c(z*9nqTvFSWWm)@=+R$Zg#15hWs<;N(rL*&q-K0!L=6B#n=8wDL8 zIUV|8Db!k7j4@I>*b*&@D<$VBA4+`c^*+8ZM~M=;NNc3$thdnc8_^ z(jG1i6;)ap_=crb6qdYBhc!h6BIrY)g9;xxkC<%T=B|E^^CZCi5$sN;7&#TuR3GUn zrg@b=N$!)b4z~g}1R({@s3t@NGMsMsz=-ql}n>TD?1GCuQ+XY;v8 z#G1G(Gx&#We=M2Iou)Kx&a{(r=1IEab4W@b-9b2CP8<6ReH9v@I%Ur~ldUN#Gs=kWw% zMeWJO24t%CQ4+iF)G~UBDvDjvS>}<<+>o{834zETh+OvRT$V_G!u(h;qx8%x0_Mp( zspk7_?z0?liYW+%?+Ukgq|v~HLx`MsL}c9gJ5Tep9Gx;*kLc})Crh>SR|-gW1CDA$ z^$`ZVdTcAi9hzvIh>x~AMggs1s?Uq$)b@M^U*V^=z3iyf#(j9a8~k}c;SEEnZNLum z0(;$e4jht*3}A#|uWe znu3flZx~6Z+SQSKQI!=$xsfXhaVriy+rK1L4)TOtyr5MtZB%@AWZ^vHEf2!VseEr~AI2UC| z1*{y7NKH6JOSvvJT>5_aEs`w$mE3uTBrkb6(hRSy%(sBtUH6U3p-Co!So(J5XAt9t zCyIW_+?n;DHtqnrQ0aYSqNJ^2BTgEpfGirruLudc&2B!srj@M^O7*CZsjvPibkr@G zotgu-xO@-ozGLc0Yq~zv_QZ8MYAh)lYEX&~(+6R9Ex}_n^#S7A06m>7vju;v1pvOF z8KgH=5ht6rjAj0?s&8j>gU61L(-q`5*kIoS-`Tpp7P!v1WwwI{k|Qql_aQi6(ZSe1 z9($t@$LQnjxQ*?=M}}6p(NOAQL+!}!FAF~vfUI`a}4lk zk5WVB5Z*Z&cYrhdqX5y8_mU}`WEvD<@n?1 zF#}5(kOMeNu-x zP?dktsIWAR>E%(kYEG5MCZ4ZHC55Foh>C0seK23B#|LMzRJp>E(e3?S6PA|!T2bh` zz~XYRS6G^jWJ5&s0m>3|{K|9r@JTWS1szy-wAvu7mV=q1}^e2*ydWCUX=K}b9M+q+hFh&7;giPtS)lbLlx^=UGP`cQVP1dqj% zzdC-)5ob-@CInBdRsXc~)BY@a)F?zGB&Y7taikvq?HP-=$Q6A~hrNw5*f9?2nLkJY z8S-MSTCswqt!*I*L+>?BYht0ZPhzRuQTnueDer3|!b#PvjUBaa$2%ctb~irF($Z1>H1cbVw3F?fr)k+BxPT2pYwpfSJ^CQNadMOGOlQ zdoKsY=efz;hQl8cLaxBDB(L}c?cuYu<=q;$3ZScMaO)H-BQv6e?JY~OnD&O1(nggN zMtF6Y53t>5!`)Kt8M0&@;kWhZ9Q&ZP(qunuB2A~p%sdS=h2#h5XYzH=!^df~j*5LQ z(a4+AW?@{F3Qq&(Jkcc+54TnigghjcQJ{+|4rO0bUKjDhb;5So^E~}W?cd0&5jkX( zdw$`SJjsI;jq7z!-D+{>MVY4yBhwc_EocrxJ1L}SD|kQPZIkqq8J*I<@W1^+Gf{5K&EN`DcxX8wB_*ANzFP%E|b^x+(WO% zk1Knv#-DS?$Cj9DR%u8;nY(*;zx!?C=AQH77dv$iz5hk(c?gRwKhL>vuoD;b2oOx$ zW3odi-E&=ZIZdRMGi-L|{@k4E+|pIp5`FAf)0sGrwp zq>E~HnZgW|aQC89V^1a+bVk?vgl`GKuUbJ#=Q3r@%uLOCUrnbUKVCfCK?DYXLAToRLL#xDY>5a(l){q{EI`{BmO~uO z6^-q+hl7E>{ny-#Wf+~++O1ak1~mE{*jaV=-ck$Bp2J}y9(_0&~XwzWaa?)t-A5n2~v_-Eo`{A+;{3agD z^%JyJgHTxQHbS$S+D{;vH{@R3af4sNcpo?eq$7-T3xwNXu9s;FzkMqKxj`_bNiGmocbc2McgrwLrYbr+8w?}i zy09OIMXMv3F}@w^bTJpGrj0a)K=(SL6j6UO5F4ot;T)ULl(z>~F`=n$jvx)lycdnK zcRXi1LtvRL#?^IPQ@k^Jmz?QPD~ zCOch7g-<)HJuU4DT2{Blw7`8VTB!B#M-4s&OkM=kp!&osXfqC(m2U(`BIps)@Qf*c z1Oq;dS}I};C(JK}R1t%}vi0XwYzmM##}#^y*JVTG4$)h$BCL2y2Z)Ghfxj=4I}X#1 z{$}>Bhtc3>M>-%D0S4I*DU?wY@DVt1 zdj!Wqd<};fu$?`H9`y>p_6@ujafh32*{H@s4oZv7m&jwJ@e$N{iwu6e(!gHx7ll}{ zWQuiqye5_{ncx+(iInz5O3?e;XrKLo$e{asstW&aNBjSmM!Nsw-1NU%dMQiGZwP!Z z-$>*b$au1Z-tu|0@KWl7E2U5=kVGnivBm=;--oLM`*gK0U@iZscA!**%mwrM6_ za`Bk#aoY1##1La5#0KeK=)Duh>w3=-p}szArKcZSLyU7{m&c5pI+bCNL8Rh)?vGW- zb0;S-ZpHQB;W!#+cK}0s>d0eI;SZ-L7s9tJXpcn+a-t|vnDQr&$oHmR@mK~^b*t!4 zrzT__*zg9O4=8z&`FM?)dItTuZ~Mz+h4)$qA+9k+BZ8X$d@kWCsl1HmZkyd?IkdPH zc0&*o6`a0aX}B_ob&}KFB2XP>>W=~=D_xqDv?XgfGcQa`mRvEzYiQOh_+qAx-j$UC zF*dw%zNA}7sVRfZb{vUx_gGQ1N%CoFx*3cpGpoWJ3adgsdVQ z4}RhoP#&ojtV-hxl^>AujFOsBmq=@(jT81?fPZ^B8E#Lq;DarLw{xJr~#X%M|^2^aTAaeEAG#M~|#u;3%)S$zB?16+|F zj0Gw%qOpF2v?gj?h$6H$jUyt*s5nD7u_1<%152PM4l+s{^cf@}FQrPJ(p_`p0aT@9 zsLlD=RcH=#&17q=3sf>J6xDjQ%=8@dv@358`}iZVmG92`@7n4>%Fp4sn%3Mg+~!Nb z0k!zk=F46*-YRl}IoYz5;vnbF2rIV*{(Q3# zM@p%uQ*9n5P{a{pIZB8aO9fqT>ZCCxW7o=Gh&mRgGG;A-1AnsGS{L}I37JPma2jMs zRu{d}J)ulH(9+eU4Xl*6$BuLGM%W$!J*MoAD%d|wEus3age8foJyf%IGv6x|V>3!{ za5L^u_?V0G@5rR63Dy+2}F?$zsQ2lm~p+kn1w$BSSyR8llyR8pBx$O=` zzby>KbyvxDOb>g-%4EU70Q2b9t-> zl60!3{;b2+C>$XmIy-p4WQ6+0i5k!CUhfypm+3$pSnaVwZscY0KL zIn=nKB1SfAa6JH{hLWSk%sAh!IBgUi573JL)!Ahm=< zfM>*KJoslCg9#4uVf`*6;#=w$h^MIr0}wTk%rM1ay?Q5#%(YrV6X7*G}9Yl z;^zks@bGPF8%?20F%?5Z8%PMWnaW@@)&3SLA-Bz_p=Le;u5c^8Nb-GCRT^K&qlQ7z zV8bbN#IMb!01&NWylZl@Vv=@L%BiGiA*4;;ap{I=qrN#l4>d%5 zF%rCYpmheS;nPxy-+1INkYcCB#hGgDyNas%oNDovDUSXRQn_{gmTCD5q~%0?$rxed zR^^=#HOU7kH@U}7(IyYS&8vVCr zMD-$CMIT=|;n9%r@)fH0mAH%QgK%YzEMA8aNtBSYZZ%wT84_^kJ@a(H7*_1}LSVqu zdoRFf&$=Q}?U%M&wT|lR!fEKMOvdw-ha&eyPQ_Cfp*X9;v|zGw>CL~_v*C$!OUw=#keg_aJUnOPJp-zLo*5f2GoT35!i`i!Wq@Bdl$>t}?%dBi2=r8Y$a z?#aRoj~(|7zm9+QxgLg@rfS9&ikSgkp*fyGKhH48NVXzx9aOvrRvOa{sIFt#bLm~A z7bJ7~6nRJYMJ3}2&hXh(c=Zy`SpJowAe@apT~l2KSbORYDs;NY+21FHjoccx`QH@` z;kUNse{4(tdhjIlpFN3xMGgEDy5hgy!*`>&D1h=+y0LYgN_2g`4~j}(?xjeT{{mnL z0}1Jn0`83LlXWGhFVVIo(}nRN%V%DQz+2EJKkA(=ltIxy=7P<3w-k@cvs|nEtb;FDyWNI3OcJ^_gd67BsG)^wzZ9hoBm0N| z!E)|Ik%S10;jmLDg1|K0BG_{3=*M*p^a?b04nw&4v(Mg;(gg0d3pP`vx{5Z%oNs@Z zlQADXFeW|2q*|=Lo()ralz}!wG|RW*<(Z4NAong+K2wSK@%sW)>ipY#^1wxM5FPHu z+K?W8a3lKADsV!jastMK9>$Ok7>G_C3)?%Xiw}NzGi4cUZ%S2<$(X%kM_S^uO*Si+ zzFlgTBELI2WZyv|a!#tnuNPf<=ZD;ru|ZuZ?@WFKj?^24ejad~ z6QqN8e~)iLNSCiazB@UJ?|H}nJm$Z~xBrmi_}^pi|F?khUqSUXN)u88-#C_q;+UGd znx{`7bk#mmcO ze?MKlg8GMr09i+8noRb!2SJ8zsu2MHFj%EoB3in2&w7{LdsVDL9ZR>yfYJju-PyOP z(~4`^@8#QdP}ae}bM<)5?%R&21sxEejo)uysDySIz994nwMv*7aH<6g>XOrD4@x(% zSGRQWqk1eri@cCvY!6d{YC*o|Kud1OI~S4W_n0VdoJxt$G$78A;A%#3Q{mUrs@=NP zz7El0>rQ%uT~che$8t%ge+DY5d#UoBN^Tz|Ix&Q5f;+}={UeGk%!(Sf=F{=}hQY3x zEC**2nPm=y$vWw45f&M)v*w8f1}5bv>o5^bruT!%=)94CAE63iHer^wrVo&p%sy{3 zTJ%b%z;dTZuKgWx)Q1nGG~6c!0UVYI%r|rZ1b8il+!&9qLWWvH9Wv%UVYXyUpF>l8 z6dnsM>Wjz|a?P0B27STUY`6FC82F&IbfoC-h&J>u5$&%~rvFQxqNJ_8i?gt~iILUc zo3sB1@J8~lqS_j@A9fqYD8AWoTn<|;TdA>eV8f?e#Y2N*k9nc-LYB5n#Efpa^Bm&U%uP5 zX^$PJ%b#DLO`rr}ZK#)F34ICJ(9u z(HjU3((BzN1@TUdX~s1Y8I;(0H||Jj(0IFnR=u$#G^9$k}Dx3Y&d<{rt^?cfQ~it zdaYbDU-fR}fiYzEy3PnR7tW9V9U>2fx&s$YDr1q6I})NGkGmz zR#8#+g}8K2?UZ(3_tL+|<&E3!6ZC|Z(b#Ck zXCcU~>`_C&0Fg2^?Uom%H;mA(>VkWJI=9VX^(?nKT+|FnndpMusg;xfvl({0c+6b7{-J`APi4HUk)GtO3dmzp$ZL;skkXIB8pgpL z2eG61%UtazAf?qu!01i3*e$@#d!V@NpaUcn-GSgVT-($g!n^>3CrI3U1_q=*#Kc_Gd0g(MvQ`P=YEwq=Iy>^sO{{R{o=uh~ZZKP#R7JKOx5 zCF{3z|1X(GP1_Dx9pUR4ha0;tZ4&}e2xt!t3EWVsK!CuaPgderu#h=Lnl4+GaHGK$ z>oZn~&#^cP-Z(Kmj{+okMM}QB=sCVQb&JwXA^TIInrc<$*`#ShPHI}I(@5ro@raw8tVw9p=Ow@K(O-NyMTdhiD(xOJ!X&NAlZW11c*Ppp^n zUau9!DNUCaDa}1H!xLx{UA2uqVOP;9(s-E^FCG)m@)c2$t!wA)Dct#l=f>nq)nGQk z){&`xs=`0k%xT&X+^4MPhP&7$?=Apd6q-2K3&`TUk|^s&KNfME8)NzN z_w-j1GrsLh5hOj5k_-5*jF-$AnG5dAY9Q4a^=Dc)9jI?^xx6v%%5bTyuJ$uWlKJ6Ty${w>K;B4phvNA#$ z?GPh_WY%nq1BGcrfY0Y6e8}4MvIDdCDrSb>2lsgqVxKCxu4Z*|zq}YMg8`mqUE8xGAtj+ZuDZc+RS!kkv0P23Zk+vAqRC`w)A1 zjhl=+_o^v&P?)gfX+D#u*`G~*&M;K7)V^M6=~<>FyWORMnk8M7Oct-sR~{^t18N3b zIAy{oewN4P#DzDmV6oYdDv zK;(K*L11U*pIuAE2X3(aEn!XUmGQ7TL+%Q#7{tY}K$`o?1vj_x0;W|T;;8{8wAgrp z+ds>CfX6IKFeg?xRLPr_V$iIPZ^Ll^5s{l>V7efpbt~JC*Re{cpTdV( z*jtFyJF@)+26o@68c9!qQm;_hJ0xeH@HxD0j=Z4-f2 zh`hZ>z1;}Cpn2}{axk4=zLpW8svJRlL^)^eIP-)r(@>Ha1u0^lPeKW-#gEwGKVwqN zZVF$0L$0`vr9NW0?!dJM^8~4!46Hb<{W3NJ{H^jc_LqK2TW<*-0G}e-nwETEJtID- zHe?QHAod3KYpe)|pGoCqA~|WeHcqzW3R~!P5L9|9>uJe6U?=9WQ zoO^(!x?<9X=<>60VM+3qKpXO&YtRH+ZTxAKfL%Z8QlM=!T(<-A{pgrV#OH|9oh?2H z1^978X?|wbz?!tqb>8drQJyf$BHi!r72)jY2q4LKOYr$`?H>LwF~9#DsQ=O4_Gm%6 z{|%}~&pehTqbmde6Ui7rjub zQq!)%vZ_I4mDE0;hpl#P%2MrGSJUpg@jCPSX6i9#z(hjo@%P^3cJ=(pcA9aV$+=zh zL2Xj$FT)#`k$931rtb3{7n8~Pns~1=6C7W6)c?}IU`?x)@fZbWVrRA48j6(9> z2)lv!ti|WbO|kn)E-)kc&<&$UF}(EB3*(o+7smH78YjhbF%V~RN6z%8kcB_x*sOo= z1WWhch)x%+_2=xZH2?7dD&~jOK;36~6Zp@$TW$V8cTsy^@~NB87vL`nE5F3OJl2n) zIFlDE#PwVDjIXX+cfkSv4~+o7@oT@aP(Q1eIDA=m%>lnp4bsPOe5>0=JwZwfvOBAz zgxs{z%6tt}Dp{<&Nz?{$*p4O*tRI<3YwDF1V@wpt4!X%1lt3!A6&0D8r4?sT>#hr{ zO-q|4`C$hR%xg%@Z*P-)vQxWSUWV%9T3N%(GMRVb9c!nsWs}7TQY5HUn`bs+G&avi z+H2<5cI?U-DN=4GK0GNnJ!)K@vIdTDL6?}=8V2JS0-!gc$2Ax3Oa>u|sUqFYV>U*&B*5`+mmxd6wT-e zH@>*MUFL@TRMRI0AXJj6e4!pl_@GP>x$b5Xu1M6yx!%MtO+j)t)*t+NO6qwfJY~UK zc;pOF@3?U}oR;cQ(34Y1v@5z+*HR=?HKlVE3aPA3yqK~Po69KjM3f!*_vU=^?U|iL zbXwaBHjggI^jJ46zZDa!NG?d_Uz=%lk5rvAo1FpCDKm+f36n;;2IEKR_YOaOL4RweVc&gI=Bei)we zahA@@&dvchGqzwlCrW1=H)`_s%ls6*F4>nk*%l(rft(1j!9_XdAjgyCu(XjZ!`PbC zFP$^;I3!uWVgp%>H9zd7lc-sz0laBQsJ8KybMYvieL z4cfxi6UES3sn~>4Y3ViZQ?Z_7T7v>rphXET)S?7Iv%F-@Djr<5bVrEzfZMJz!tIa| z3%FTTg}kVPdozUEtQjh*&4tEIjTo~)*=U@Ocj8PN)LO@uE3t&tpkY`yhN5jSwXw$O zB|2i$fBV@kH}cf3HUf)NiM+%Ua;N2}+uJYOoK<%~rdo!O%Wy042xZw5o24qT7Y$jo zj#ztuwq(zmYsw%z2^dqM@mAV-(uZW$Y%IaVoZL+qUhb;(W1u<} z(N8Rrw5s;Ryabdjot)bTHi0?IO`Ft|Y1_5PgSDpti`8bwtr+N3mD$U0g%xmpgq2hC z3u1Mv;r8WawO%~&6qT5lZSC}}_QV{QJhIkGsp%!DcxeZN$eZy=+ZN2()?L_ZNM(y6 zT$^c4MY(kAR1fNTKi4dW(q4t!v(bJV6`xtrCh1TaOkc&b?i*;ZCf+nv(t(L$olQSRF&2g2DX)NpVs7qbEVx-RTpS*-YCRocc#jK z|IBm1R?$trnW5`&rFibl({$r5M0u77$geUK?+SO z&gB@EtNnTwYjhvAD*KBbWhd>}YQ~*X*^H!_W3UNVkA#C0QW+5~B&^XaFid_-RSrt! zPFE`!<-L<9^6YU7foI(k@FM{a1xXfqs_G7IaLKy%8zo92`eH4d3cL`^JZv9&svbjV zKJ2>{6}V3Sy;fo^Lw5KnLqgLvP4WbGMHjddzj!w$)TVWeO)M*d=aCt*pRk^Yc#(P_s)|&r0~eT zcA!Q(hePrvp{2X{Mo+*iXN%Vx(>WNc-PCeIkKF0RibLIK=*5oP2Z7G^XXW?fz>shR zVrB@3C~mj$-vLx8aQqK(zb_^DWedUp$s;|F8{eYDYy%Q^D$p{tu*aItaCE{dMn+;z z+|W0L!AR*DLw;-GM5LPZahWs1frT(K_gAdfzcg6&K;UN+Pr+!4>m1%t_P@~Zg=f1~ z1=w(ft46BH@S0QKe~T94Cr?Nj**2lNg8}J|FH#5^FYQw;9Z(Ie;SV|Rxk!G4DU%r$ zRJow2!4mtumlvlP6-hBwDZs!Ixq^vUUK#qxE&2$t@)6KjuZ9<2^RrVC8x_#zq1?S6$%-kk zw`IzSEtx5&I{Q;6bQtu%qrozH+W-22^FwH6o=8R&PP3I+cRl0wGu5y^1#9s^fH9#$ ze^A-2Cb3c0Th~qv9ohxATF>1M21kr7(^+>O(3M|jzS;ITV2@$s^o5LYsL$ofSX@qL zKiYD!0y;w6e(eNm=>Q7e^Ju^sUPj?DhS=JT3-crH83)qND{=Wz(wm|r-YC3DOY;gcxdlGAaMscpqK>C_4>9xX9A{t@f(i!f{A9@Ak2q%%azmm* z;5T#QeZI_jf$n{QmhQl}E)2roXf&!R-=aLQ`+nh?tEc1(>jpb694wbrkF~!O*~E(C z3_@R#tpjv@O)3%jEOdR9F(+Ji@Thd7;3ha8G?uo2Y_VT}*f@@=xbvnM_(_*Ms|z-& z%~H2goh#eNbzOzlBVw-K>lLS+mCR5TS*L+mI5%VG;Ol$=WTI<`9%gFkny4V zg_QJs(J#1k8(&ktGzPhFO9{z;8$^&hutr|Rf!&DOCD5$ubf5TQ?70V={UWTXgWjrx zzK#5K>5E(M&a>p9XU6Fl8d;L96ug0YT)%IV`BG@?QEiw<_Au^kU2~#zNn4>b`$|0f zC{#ts(RdZ)TpmxC26`JtO4FGnH3fD16hp6u0Y9Y1y6%(ykQ`>k+8gF?lPF_^ZcY=h+ZC1@xvb z0Iwk?;SkHhuQ&r{Ws?QTc;R1S(PQ?Y#52@6kP7q&Bu`|@46T15x5pJ#&d3Is$DOFo z8$0G6DmKCyLXkH&(sE5?e4Q(th85nz?9*I>i0(vz)EHYMx4$Q7Hf7O{8l6A8oj-$_ zKZ}?@lb%0AIQ0Cg+(BM9e~Th_%@ZXytzJ8J%i8GH9UYZztFUHvWjfuWBhC|qIpflV zW-7e4FpwpF*A0}@e^hqq#iH4COL7VZEs5Wc{y2z!O?m{2wN4{XK57q<$xPLcU*8L_ z4NF#coNzzBEa!o^z!lp~vT6mODP2>#)`ZnV_8}1+R7;6DDPOyStb}@sGSG}`^DpQ^>L{Z0#T4iigZI? zK1q@b1V(1o%EVNDsU!=!qq{^=d)F7$pq1GMkknTUuGoP z#BC4^lM~I&CMss|8ubW+fqkVR@@DX429hn#W}zs!cb3-C z!ztA-%fKA3ej>ggeJau-v1z%DUhU)gC?>*}ndC-ms$Nyx=vXeAwp`kx`0QAW%yK0< z8DBjDR5wp8IGB)HUXRwOy-YR{rXiiTXbQ`Ch0XMU0wifSx6Z7RzEm{$9?F(%}1N4_w3|=_laZavFWJS|e8Vz@EIWUBMK)c0h zG#h7!LiH1vkbXD1xADXsFfQ{^^WX6$_>Vw97f)u-~A>-*9`!n5X zMhi9N`4h5!BW#*@y8yyuW|oEG@9{*HMDP{U0c8xklW$S6ZBNZRLujZ zLh3>|0l|V5{_6EEm{Cq+%8Rk8I)~7u+2s1#)Ed%Y_536QGvATYPnO3uqnevoHH$c8 z2efyYX<6?%&V@M!MdwNBa&sSIYhdU!s*!?m6>q~hH|RLco<fpx9A61NgqYFqYj|Dd%w83bFXqbg&> zDYf!mrAdkq1!mWrKL!b%o|cK0!|3NA-D&nGzv}j%^Sbi$SImsNB4qa|-2Td!d==(z zFGG>KKgrpdzs*w*ZE7d@LsaJ*$2~#^P9`m9bGqXz?$?f_Wa?sT+Kq;Mt<$BA{urBU;1VvL1fg{l0 z=Oe_M50w1V+zF?%ZEWYB?7$`E3bbU=o`%RJQaxiWO3)Y{@jI+U^^Fv_S_j#fE@TBr zcAlY_A;-Tr1^GSTXKFw_uQ+%gW|u^8?+vK2B-7>N4=C$l3$i_Wo98dTZ4o86zW_O> zC_O0ps#p4^uhKSxyCEVyk3LXj=f&-MDC*%NoKmdt4D7L#7nt!Rb;ksI@`ck>(i4k? z^&z^nR>TTnA@D|v(lbcS1jY~e#Ys9FHzt7uC;dhOEk+)9uwD<&$Mr#+LG;d55+6@2CI(>6zq&i zTk3G>un|Xe3eQBr=2QX0WUpL6DmjD1Ei5_XU95x)SUfiFp6I+V7iD!$q0qA>p7ci` zEh=LBjV95P4&3%Ao?hg;n1l|_r4xl7%&?_yjBCKFjg7zfZyqpP>fyC!yi2sFjp$x( zX^TC#JF2UzuMv#H+CT198yQuu)*CvI6@t&GjhLYGy3lqS6u>;7f{4#bMIU)k{5HSg z`AfB1=9+PfOSsk;n(>mkp>k@dimrn`$A9le`cAntiY~%UT1UO)B4t8H6;uva1JxPR*`lao@V0a`G;G-Tz2_>d_MwzneF}}CDdeIA-c&dNn@Bqg z&aa#o;igU{ZfJsKCyr!%e22Fn5%by>L^h8a2xp8N7~tm10=Be0i z1Ct}BS0hu+l>GK3dYF-P=xA^XCcl`V_zPl|s(rM9YEX)7fBNo0_{p-_5Ike;9&D9S zw5~neS{73!mAaU3jnB)ketneSV^W{0z8QNu*PpG1#x(ueqnT8C`=qXcgnX7Nro)*4 zIf6adx~^jD_7@Dc61-_2FB7})?XF)*oO6fd6^^2M*(~8`RgFiPNTVzgG?Qq-HkJjdSLjffnJZEc%E?BblXI)to$n1ot2=D7*J3ivh zOuh;stYMP96A#?va$`(=*yfJUof#iX1?ki;>mxVYtDUh-W2QW&9xV3(n_)h2)cO#a_<%n}FKS1I) zgpO$Dt6x`(lf0~|BY=Wi8<>uO#kS1Y+uy|O=TgWno3dZy^=cY83QD5{I3!z&wOQ%R zWx}MpMX%~K?OHVNS%_AzsE#Aq9VNIyg(Mt{>LWogOfbCK>W77=Bw+lYmaH5GzY#X- z|Efl>6YK4*5*z4eh(szwUWY#&+Ri&qrfJ5N*7-W0y3{o+&Ca=C=l9MV>RhznHgc-I zz*;o{Y;W3r`-9;nNHfU`f%)*Ljdzj(W$1P}-j&Eex*(pJnyz2qn0RDCC9DzgZcaR< z(w|PG_N!%W@~+LZKl{&0-F4tWb`flVj-V%&>Wu2F6%zCU(0Tg}rUqgB6neh!(+E*I zU-EDH8C!p`ZH84lundaXPH5O|Ndd8pI3gZIIHh?KOsAYY30Os}jynxpVZjxovG`$& zSrQGW8mez6&>HPtXoy9W;S$}1IhRb=lq~nh7NGisi@0#4v`QIL@lGM?Sh4qDg}lIk z7O zi(qfo7fSK{3J)$Up=U0|jo3n6JuQK9sU-%e=1B<8gkCTcHGL71H-xGOMA}B`h*0m% z7c{QlcOdf+p>sW+=G{@P*~Nj|1bY+R1Ra>Htxw{45S;<^4rS=O`PKcR#f=av-5y$S+MJae! zhHmIn0P}S1oPs^ro?f{I`f@Trv>Sllr(!uVnpj5vE+6Nh`oW!-xlg;=eAik1+@RGA zpYO@YAa z_#@MgH>ie|)+!&`SstVc@;TZ)kENYhxtDxuC}?%{-U}eBPLyrlz_=`$0%k^*AElt@ zw}Kf1IdJ%QWGCoo_@R+v_rHriYgE?l^e?FKT`V-;en=@A=jBFr&r1=3xPj zp-UA(@FQPi5XDKk({HdYj1?j$jiPHmV4mjZZ@*kt(C!1UMT~Q3N1XiWZQ^nFBbnn} zyM6mE7mBA=4T#;!hKp}ux!U5!hd+D%+_J#wQfyNAM1Hf+jpqNt?7uhK|AYR`zmQ+V z#MHpq%IOoe{}kT(2XrT?d=BrZVED-0?hH8h@T;LM*E6*bKus<$ug)^6t$wX9UMtMY zg|(4mqPIU<9&`ck5(V)C``o=LLBBJUs129JvI`oB5$Zfzo~&OCT0}p3@y@` zn^cDW^v9^8YMqMhG+ZtAO(IMlSI68PpW+QLC^cLinw0CXX~n;47o{#hE%{MJTNA?u2bQ*!wAT^9ajE`z3)o8;= zLQ#ixMCUiI5NuM`$N{_&6W@tl#Jrpc;|6N)Z#bm0N7?|Y1Pl8bR1W_$MY42mxnXOJ zC0YBIy%!rtH3AC^aWO&7ez;0N>9;6@XHM0$^40yt__edfGOCIk)<{`JD=#cN_{CU>#(LpjZ|JU+jd ze6D{6mZ{?G=PV-TVGMMG%7a%5yN8_(W2C4KTUX_$oTtuD*f;j<2q*3GmES8c-EDgv z#T$ue_?!4c3|IbCnRy>m7y~Kbj0XOzlIglakz(KTnVVtmnc-gS{I!xiawUA5mKa5e zX*q&Z?BYFu)b2;+k` zF$P2WTVf2wlcd6ew1W|gxCd{8omnc@+Cyc826hS7T88vaZD$5f65{uz8z3@$c@u}_ z5v^w{KO_3x@eVV4>an9<7!mWS%OatmU34!DyF*v@657juL8(+MoeUMhA}2cAPlWm& zp#}$dA+`PhUL|Xy&G#0FMf=$ZpU3O`y;(vH(wsiHT9Q9VZO)bPDwBkgo$vfwru`Jt z!=A8L-bo8#G4MjftK^CtyhogC^NW z)hZ@5ZC!15Ep*tW-Cr)AWE*DeS$gb%+5iGhOBb z=8tN?rrgQkSxn|x5>lTHvkltrM z{anb7b16}81vOdNYtR+Zf?x>mbY1d}!CAw#!K+_AGx!AbJmxBqd>GzD*W#F$jV7YY zeREb|K+&CKup7}{a&ygd!K8(>g|z$Xqa(OXF>cs( zwxVnqWzZ|Ay|TFR9x|r-pTo@uk^<6ZnF6@*I}u<5RF}}D&llPub8gzj({?Oowl|sJ zb;BA8u|E6f2Gv-BvLQ9sV$vK@-<(;mh_!fQG;}e0P_R$eEn$vac*BJ^LoL0|qwzzq zQNe@QNZ)`tVYOxlW{|_&IN?g#Wt4s`W*qt4X$7K$s#{;gjS00ZnvoEc*34)MuE!r} z14oW57od$m%-u3h^)?FX^4XiyY%(+j!+AIQ0&m-!xw3Et~j;>wqUUO z5dM5RPI2<=>jKnBiHy(B4zvV=e{7B{gDg*a@zdlr! z_5@1G$=-G0k8yN_6a_QKrb@e*ku&$W zw?93dp1J~|vB{>o@dSMugNp;8Bc!xMMtd#5O^^X9uqtr#u=AL+Ytcs|;QbbD&J*&j z2M#r6=dRH~v@O*ZRMx@s(Oamn%(TPEm*8*FkXyIW(&=8~Ep2Ouc?Fy3V~IQtM8RU? z@SbS!t==RwYnKn+^!aPfVZSJz5;%BwE(A0}^tLX!@LBh0;azw!vp+FE!4KM=lr$LX zd_;j>AKh3!vpLCHN4z&HHqXI`9Mlp;hI}B_+9Mm%RR>Sh|Ce^F`IZ1zwJ4xwz`cS4 zndqK^M2o?gh;YsROHm-9O1u;s{HvgO1bei_wV~4ZVxl^lrVMs%y<6~anrx#iaPKhg zyL>@}$2^pcH-SK%g^rgMG(RMa()xZst*3uSg24zJb3>{!oV_?gt?(Ij)&(RB=5L!g*kdh#DobG}92on>b0 znPh$*79SUD{&bJflZ~8%_>|s!gFS-@GfK^yE5t6HMOw1UC^WPR#<}^PY|1E(K#D4X zHMjhPSa~z8YI%fFfR}BQNl4fW{)655`_r-k20;k720>=urgUF1iwhCr8o_>r@3+f6 zzacthS;l62Kh_??H$vM?!ds&e=~Ju>Vj9O0Cg+35M);;TVj2J~Ep+y-jmHi9A3&XN zNdqVKd2?z1GPnQtk?sEtQ2&+TWhq%&&V57i*(8%*#jvhg>y+u3lua>pR^%V;{EjA4 zdmJKZfWKvW**?KS3E*1pQL@9Ocm#b_+~t%^i&q2d$$W92`aL{dvjyySMYF6?wT-lx zTA9&mDL7m%ItDJCA#+jZkyAvA9355+r7rMND);4AmXSMAmx7r0rT3-A(}}WQ5He;A5ep zW-ej{p*0fe4U;zHUHRzESf?awVbn9K(K~!5RDHt{()9(Fw8a_xoHhn>G~wlInOs}ibny* z_$EUKPa7s&m-JV%Q!sO{fNozo3}g)C)TSfkM9Jz{9zRu)^H;ysR)MYrQC6QnQ-=zN zMeU2vWq|9yECc)<6aN>f!(ZVrEB;SckKvD!mLL~I7~0*Wa&vkW_HH0>Ba%|6yzPME z%Qr{mQ=vTt&57;*?)Z{|RptnqO2_&_0{^Z{ zcc$ezB3M#=Yv#uD;ms9&YgUH#k z^8p1xWCo}F+LFuJs%_km1p=+=N-)-a4nw4FcBW^9)2j+%5QmhORW6H0Q`aAW<38K6 zD-cpVs(%f`l4_foD|2;tTZ$FllJ25YB&IpO^pV_2K#-R0~xAf3}hSojs~*%VU4` zl7=ijf6%0)N_&ug^#il&?V1Tpj15GPXf38q0biBSoEXrnKWjf_rE;%)p7))(@9I=2 zOTt13n!MIW};Eh?v(%;a>W+u}UR_Y#`{_F7lAfRcw&Z)WHQE=g zqm~I=X6<`g?v8J0!xA3~7tkc2UDjMrXIW9SX}2d-K7$T4ALRnJzENxZRS;@l@)ItK z_i>Vm(Z|=YXSLbbtww)t;0UrpF=Ppw%+qU-`bFGUr%b1dGONd~WOj7PJ_1^-!!7D$ z9$i|K&+19pDW4MeJUb%k=-)VpHh=OfzY27qSB~isFrrQm~gjl|+Pp(4hJ^1KvQH3$Hdvw;D3N ztabg8b&#ZOR>nsG5gBgf?Uemi*4sGAaG8Q*y_$E&8jQ8!27cM-b*7~q?sM5!HwV@y zkIMRo#&H?4VhP22tv=yc$x3h%Pd4EYNkq?uBxXBcIasX`tbX@gs+breLjvh3u2MIf zixag)SbT1l{W*y3{e6I_gj?)%8!;U$+8zLZUI{$~!O$&wsbIG?@lf(G!-j%0Uxc?I ztg==^a9*4Sk`bs9pGdy{{Ds! zXLRKkU0WrT`+^xidJpPk=MoP;qse_=Q!(VjlnOaC?-9f?t^vmQz$LaD^^b{VTVc~O zgijj35Ap96ufG!_@&5tt{5^C1*9O}^YF|YOTYvKT9_>{Ln@O!z< zjdhLc(S5ZR`$&9+R=UN!iZ=R7FNSLd7wLMXmW#0BgKE_%>ZC;z&0O9BL+jx$A>ToG zc$NOWF|iGMYgI?evYcDKB^qsK+KlQHz}3tYgBC@$D)@m|t4KnD+cc$#vUB=5**!`)DpTuXwB@O3!AqYt zHRBw2vf1ap6`hvH(*zoAr~;<2hDqvkK$$`Yc6prvdnZ~~L=`*M7P_t(2D!+l*}iu6 z-l6RH|cnM6!_Nqg$rY0x~#>+O3j3WAdV6;#>)o$WBeySj)VNh!zq;js$e-@cJe5v&EgQoPZ`YKa>D zgg+Kn?P6vFE;Hyqoa%C&;yqeVG;mHLAcz;-Azmc!**+|zqX1~+K?LDaEy{=V% zk)r1~_T+_VoA&~K3<#tgymczEl>@tiYxj1zRt8Dyc?7lZ|@FwDCD5U=4 zC9+B*>3ko2-&|^w;3Rm7$(eij9_Y+XRGo3yLLRXw7BPi6-|=T(S%MxWwC|JS$^3=m z{T*xn15<^+8=XbPa@&9~A_RZznBeUo4qzfE45*gh#UTiyaQbP2YZxz5U;4*aDDDH{ zKr?m-3i(SE*7i`oPc!fBom_zm>}lo|&8QtCv`^75-x^x%+K+7(P9f_-^ur&iuMUuD zG<;omIn5U_r-cBdE;MkTM=9tA^GTAw${vp*V>hs`rkfX;-A0ARD=g}OQ0>-imGigC zzf-asPQT2Y$Lm!1wr9aV@;1tt>mRv~%Jf}r!60z8OhOhwcy#|>uYW`Z$s;JC=+UM_ zl%fFbgI1aP6~sF4$i^h~E_nfxZuSQ^4vo4aU;B(esh?-}UtO8MpBv48AESf-#(>Xs z>K|_^N^w#Olo2DdhQDLAs_7Y_==Y3H&?XOL5h}d@gVWn`u`#=Jy6)8i&m$0D;-j-B zf>j<~JXHULSHk}3%O3LgKI>2GracVyK$4{crrM<+?tNZd+T1ymy1$&pshr&}!n<;t zGQk}=_}_k^2ij3ehPnrl*1Lr?SAJQL~QFf|=UAspkVe9Zb3`nR8rbDPqgtXWl) z!AQ$D?Ky(DH7&&2xp+m@sxpSt(>YM~VNuHursd~{O%nQ$CXD<@PDC>6oP@EViQp$f z;Hq!GVgHoK3*jTcAhfvxNrC&SCBuM1x+8V}RgC|SGt{A8>iqS2LW_Sn!@mR7e<05I z=McglN(G+>N%HSzGD&}EZYUtU7ki#4wL2gRwozcrcLC`l2!b(!8Lb=tfSADYW;C5f;Kx~tTMnkQkf`CB_#XMNs{ty0y?hH3o6<@{Tm!ib2_Xfo9G!76UV zjAFg6WmC6iUFT{3Zf!}23UiP$S~l%@F*DuxL7>UbJgwSY{;AexJ+YU5`kdly44Xh} zN+PaCHlzh!9(w|7b-%i^Pp+b(ROa&iAEnx z!5GyPvOp_tRDlGpY;Ypg+81{jq{z^pVAfS?4>G6Wv?~{@A8tY}r3Ii_HyA(jh^q{v z8PL;i4I?h@^qax(7VJ@mRdi-P-9&NG>q?CQ(BOB38W=tkGglWSiQ6J(HChZg=r>5+S3K6mOeZz2D@;^8G zHiJxYmuSl;OwKEg-_?uI1*;6lzMWo%0&5WaAw#I{llcaH+KDxJ$4p}apw#^Mx_Zws zL&ANR?%27qBvc*-)8_0YY^Y;O=}6}Iq&xG2hOJzxIX{5|RZh&J#6Fl9i&-faYMREQ zU(YC3f0Ou(b5!Z@Q@c6$75tCafY!O$Rr(pWfBdBk`1jYq`QIaovXg-mz(~mXQ?0@2 zj|U-RYh?M)kgYT>*Y_E+TTq};g9y5>>Ky#&C@gd^B4H$DBoxpw?uD~@1pt!Tkf>0iJ5m)(7JmC#~fD+&^zqDVspm-E|p(QH{#vzXQ{JCeD&KO&!`H5un zpWpDmBEsLl-+!QnC}QhuXl3$W@sx!5pI=XP`cM0G8>VxTIY3;jSZ{fgn4}V66|E?( zpfo~Muo`X2D~F99IXqM5sLb>P7H5{ij~eWrxMtd!KnX7Kb&u%+tx(te5@=N z=k3Ld{pG{P!^H#H^t<~Vm;h>qrp#`mA7$k+hY>*(Jgiq}j7md!dP8}c>^2Txb}zYx z@}xVf`jWlia0wW~MDVFp&qXLfEU*EO)taEaU+wbUYldnaab^5*Ib7mC4JET3X>X!`y~u%a9|;@uIl6F>SD_izbpCg*lf4kCq17 zw{ib2$hKlLC^PBDW-RiAbg7J57AjTyu(_#!+VTpOt#^{zL|CvlW?2xYnc>scUNXqH ztJv6mKWNLV)iuqe8+?zpvsGhnwq^Wj@xt9>@yoxX}g$nT|XluR6ie;zTtj*v_m zklR|{3)0Hyu<^(+4xu1xk+KpgTXU*?lV4TN$$RW9MQXdt;6Qd$>X0WcSJhf7ME~n? zV&K%Rf8Z#U^=B_SS+|JtFe!44f!J_+7@U{MuBDgJZsM*MPFe)R9RGRKIl)~J>V1R= zhhuDmbt#gncqFmRJNY8*j+05xNQr73yaT6ZDRP|x@_=i|hM&ReG<*WhRzgaVZzcj+8S;Zn#62G7) z#)~z9-bKXp-R{;t?$C9UF}x-!e^1D@AP_eQ#ef{t_g`H>ZK2QScq$p*vsOna^ZGNE zP{xN+OpLeGPUm=yPB}(WqOlRM=i3ZVh)Y(HvwP{%txP<0ySUNDVcQ~o9x20EYYy#f z9|)R#&!Zs>kUiU_`3FD1{1V)rciYrD9(FI&_@3-HiH^Ao%~L=x3B>uoMf(guJyS{* zB7r_2Q5Fo)`+iI9^mlL8l)LB6+z*u8I43De`dAt`tLRf0mf#mI=@9-E{{sYVr2yd# zcNoJ6+DHNA#e{VTN#RGGfU-vTs!3-b+i;iUfIJu5Km4-&vGTCKe^TX(zmz8a7mr-b zz|radGM3La&A*H(lT;)>?e9M8q4rkstuK9Fi@@rWTJum!!&?K@2xc81$D;ZNB9YLC zqpcv)djbahuyGLlLHWPq2e}!Au)zuTCG*&(J#@FM^80#!0QU~apda=DrV=WeyncXaJ501Z2PFbnO$nldJ_ zTqb#!7rnn25;M}Qn)5oVdDYf<7^`0Oh|kop_u^u{;s*LSQ$OausY4AXp~Ew zl#vFV+(z`x$M6uA_bu1?7^eri$#B>q0X}Lt4(MnDiFHCD!ekP)eqJKAe(bYMzCR}y zE0g~X-t7Q(JbCCB8gT+@4P3!9q$C8718kLGdE^UxqKAcL<9)ie+g5=GD!Sb5 z0sIeOC)B0Zm7FJbE)Ui{N+23MZ*YW9Jo`(1QJ(d_nXkQqHQ&&%^{?p&Qcov z;7uxd`T(euCfMo(Sc^uvd6lHCKga}9*OH|0XCU(b|4SzRKf#EVgz=x@NaatXM(@*h zMmbqsDVQP@ia`OsTsaCq&`@av1WFPl(JtGwBKw2opB@2YJs?mbgMRqEJ%YQDsm?@x zMD})zHxn0bn;9!B*YA&S=iET}QA}1kwEcb2QApJQ`>sgr0urWXnqOt0+vyU;W|i_!lUWAQ35n?OlZo!C9kulY=-3! zd?Z#BD(KJ;K%&Sm%+Jafh)&io#DEn!;UC*B1tNE31%9!%oSaORu5;gq#dX9yc$w2Z zgkh_8e|C}`*krO{XoRpK7Sjj)3R51eRV;InfAqW<=Ha}52|yx9`i|6%5)io#)gOhMQtMcTjk!Osd)GF;mi zAYh#Kkoz-Ns9Sq~rb3j_38kvfuehs8EUS7Gk~J<2($hUBP5F1J-658E*{3m)_~c!S z9qik#^LT;l`}v#;7nWn$2lUt&{YZ#zI~C0_w}GxJ-O24tf37PkUDcBL;t&$=ckPNC zzjLo3#R}gavnA`-Afrf}hEL>iKq(Hj5fRHHWja=eY{)5fti(LItc2f|`1)C+Ge0)+K!oS?IzbC=} z!BD!8f!RMUm2<4DTt5RsP)I!`+CTIp9{Y$6%y z7a1j)ti}PrYM?VyTUg05^UsOaLL~Y-{VPxfeYaetIiy$#QT*6v@>mTL1PKB+pt>Ax z7n}?%Fxq6VrOV9A%BAkNmlu4Hk?jQr7bBKHADpEAJp-J+I)otxx|U&LHxOjR%-#ft zm&EXren=x0|CiXLer77NqLIY#1Oq2YStB<#e+mZ!EnafQ5|w>bnTk{cbM#ZozN-Ny zVY7FCAH``Eo`%G<#ib$4#`p`5hQ11pWUxkAt!&4zXvbvIOd8$xK9l7I8uVL5k_{V= zzMs5n2FI4)_bo~SAw5LrqTtFnCJ`oAi;y%8R~I`e^~^A)*QPAQ^yi}TM=)I4thDJS z*9h2|MTaIig(Rj-4U}-Hbm}|vuVezuqcf6EWEo^gE(FaSvI%3GQi38A0byxU?vfmi z&q`r(9yiT-DTmI(i7%@L0`0>yTa^^*F=J;N+Q^nw2{`Hz?cBtRyx^p9IwZt2zH=!O zYK{uCRSOd*MKB~Z%-f;$-inXkZs>JtsiO&tWdJ_vpl^tj6@<|Sa1e-dcKmqrcHq+$ zsS66dnZdlv6}y$e?wQK=di_2$BRfFC4&+aoYfMzp#5A_6dTi=4!YOnz)!2rzbSyZ6 zV*Lcc7#`XxNx`C>y|uo>2{=Ips`RKl8^~}LdIO(|*F&+v;@9Cg!I)F8TR)2t-dGD& zpj_3s`s+H1i!+ad33b@ncsNGBZ7P5HfY2lLkReRwFa*lqM%l*5W?rYIGjOgk~V?l>)9C{i@OB5k}<=RdXk8Rp6f zR%sQuRf#d)JfNsXe+|wEm5PB9(Ldng+Nw&pS7_|*A)UPpz4Ih_f`=O*b~dy)!MbKA zkqq9gpZ{G~cuLfMQPmE|Yim%~tU2O)Cyy8#qBKtCfmvN}sl&?5Z6_u7yolN;Ut){9 z+3tT)F5Xe9NpeM{i6kB;MA&ceI` zhM|%Iry8jjTMBzqWgdK*eu?MEZ318X3TV=E^p@g{bQvA?XUsbWI7lYdKEeXf2l5|m zg4B~*>;9AVD*a`Y^zW>f`@ct?zn3Qdo%wdD=_+HJp!m3aTC%SVf`DL&Sfg6-K}zfuvsz0msA!d{rkrcnlb$Ua2W%h1Uqf(o?FgA!93MwcjmXg7UAk3eH>`k5wQ15B z2S0e7d1l`};XU5w==*@i4x(duFqY)OUk-;-n^WxK;NMbBS%z*C!K6I4P7H(KtFsi^ ztM;>c_3nl+B1uzKSF{om?k-jyn#&1QpRp{~4-xlQhE<+eS#h`|n0L|1EE#tH!m2jW zvq?Mc(`CU!B^@YVYt}|CB+Yb8wr)Ejl_B#7Ax$BnfSK|p+%aCM7cFY4qrz&5T;Kvc zk4FRMQzC;0>uXdv%x~Oh$6MB%`vKl!}CPyUuTwC>S>qC&7`}tCkl#2cYTpi7+6S&)sU4pp=>f1Hw%mo#@1~da%4E^n9p`yl2vMyLRWiIJ~W$4lo9IUVN@IiW@B z1{WE{BBg~dD^uPfujNjTAS9fCUJHZ{OC)bBNo3X!23K^wmTNywucqZsjxbn1s=fEKQW;!O=)0|j%XcmW+w zZS&HHh@k(nZ7)Fb-WKE)waQK_nGw4gPvYl#4U6*<45OZAKvrL!f!T56cmsXj-7&); zYmUmk{5hQy(MGFI&t)b347Wx6LPD+a+;Rf!L_IgUstwW{|#-7R+i3wV<-Xx+> zu!Rh!^R3VJ5iT)5@?8wPdXNjFVs$TSK4G;ERTs?3aT?b`+fUKRZ?hT7hs6xCXjx%N z0I|o+!O#@xRI-jxc8LTsF1dTod>%~1d~^wYQV*E^k3VP9vQv27_dc;C=`XsGf5(#l zV5sO179;53VBr3T?ly_Cv*90q|G^@wQZ4P2hf#+=)H~`UX(bqz1yctCL*h)ZZ|&Tc zp$P2>Fszg}F^~k3O|+wFFeS;F3BhiD5nqZY%&-CC*$C5SF-zbK%vZT+na^3?X64r8 ztxL{RTvmOKUl^@R<~}rab;rd(fSbfSJTEsq?|XVYr!Lwa3O;5qZV~l1!zF|f02?DaNwvC~}?JH4O-6Z7rb^K4<1_HznCXAH4bi(B&t|ck?NC)?n zcnAj*lz2!7=ahJe2OE@l$OmtW+z7qbN{ZYR!&3^~RsxhsTQPIu0;Z+@4{2{1TS?HY zY1(aOX8V|#nVFfHncMzqxl;v#ZtYNGpYurBta@KQc>| z5%E6n9XGYX-L5*yhZmB;!>$`#9)YO7eWKY!a2q=&9HmZCzZpwTvyzRWm3$}~<|cpQ zPuE5rdMkJ1CN4fcY{b%mEzDZS3nTyx2Ye~XJY+}tnuzi*#w5Mwsey%7&!RSBE^PRx zP&|>lpde4WaUR^G9u#ZGk``Xn$lVCPlV$?a1~o%244CbUd1ae}Bs{)ncjiKtAYzriKXrWcxObv9m zilNFb%mlPDC52X8Qq2>NC1nF(A(#_QZx*7|GC!gAC8-)WIS3I(yzyGypH$UcrUi6L z$Ysylr>=__hO%0nBvVA+8`)dAR9VB+oGT_p#IF%Y#>PDKR)%n|A-+%ra-XR^D@*X67LLiP6Bs>B5Xv;2dBpUn{Jx0{EAdg*7QBRI>J zIa%YK@7=4|9lh**`bqJry!v-)T&tcYf1;L$r>CtVfN@`xE_Kdf`thEO)ppP>;6gmi z9QINT6+U!8I_!-F(q}d`v=WVvU9(fFJuF=wzDF-?+b2~N3%RCt?+7iVMr)>j+2D## zw+WtJcQAzDu277so7qI8RGO0>gTTOnRko)cqs^<~2W?L~#6?fVs0z~d?LJ)lVzhZd zXO^8uY-kv2q!ZmAz)jqvn24})voRMsASDdzFY);>R>OQW=N+af?P%1&@D+;!-1U7C zMt09>p9bT4=@YZvgGra(Dseb(gKQMP!DXsT?t)`}^RsCaRQb^^fSZeG8POXE?fU+t z3FfH097cw}jY-$M8Xkf5X|&2=5Ub7H5~aJkJpu zLuU|&RM_MD^3p6RusVsaC$Qd{R39{VI7J3*41NarQ4!odI+d0?r8o0z{I-w(C(uo3 z;_Xv#jjwmYJSZZB4h?Ql$158|$Jc_TP~2YpEb{qct+wG2g`k|@q5PJ@cD4>D!2iXt zHd7LTiMSOUTecnQ@Yr~59`nqDrVGkQ*_z&TH6+)9q;4ZmAa-)f|U=PH^7^J|E?7|&VNbLh1=2f3yf_C~zQC8H;xqW%yI3y>OlRsVa$GzArJiCz++RFlUK}Wl zhVGy|&QG3uvK9e6-jA8K7G?N-LmFrerpKDCd^U65Rey|R%jp@ zW%9%!oC_~-2VI?$Jy(QFouWKeN-`G#SW|FuK-8O)%G9Qj*9P*BaT|tilWw{8Zh3?a z?87wQ+3#rH1@CCOAPwS^SI`ch$h`Q)4HT1CSP!4*y!a&zW|LRo4xdQ8dc+JE4bd2{ zi=K;Il4#82^{#HSxEoXw1~T<%$K{y5f0uO+EibXONC&j>Pj<;_UcSGr!MrG8N`TEYu7df1cHH6kUk7$jG`DbM;c z?|@Q2G3%XKTKhJ7dqv_ew-EM1x{Y23L z(lvDm-4Ja8$!M!NzO&9VC6+k#SDdUZR_?CT;wWyP=zu5IS_Z*U-zPZmCB_cJPa3#& zZ>V+e(LX$Jx}?5d!3&yBN?%!X{-RdBo+bU8yh+hqncewM8U#xnj|wdPRJ- zgx_jqc(t~?P&J*Tq(|!POxsC=$LSXVm*jWkvPa(ddhNMla}gx(v7H4fx)`LoodAmm z%);-igGfrtx5?(Ny$hXjzu+?vpLKuMk?lrpGZ@1~2d3y6L6dh}$PE zgGAG^nXslLCtR2lOvn`)$Q7Hgciiel+xenwY_o5rt)ppRjcD(0e%f}MZ$mIk2{c8X z%RX+q!G=S)sMsOX_u0UZk|XCYR>Q(^e)0<6$J7Sdw+Y|7)CN1ljzxdRo{c456bYmY zz`!ZciB6mvxG9d07hy{3cjWLkLGdO-3$&w%qhGDwXi)VikaV2BPY#XCpW>hzQiQ}u z2aC&xFPKF9g}jrq*kwU_lWa>)xO+SU!rBFamJc0u7`2_+GM~zYmpfIU1efbY_qdL^ zoXN<51DDE8x0#&^k;27F3k2NP;Pm#YX-G=yXRubu8dA|!E$aIU5x=-%!?_{hx;f@m zGmzHA|2C8w=%6zEYOa{m(~_jN4_w$!;gGTpXG|{pi$!G*6tIqlOLG@2MNnO*DkUgw zHcd}-CoF1h9&`njzOZo#*nR`~lj|&Q5J`)qKEvyZC|l-xxPW9F=8ui>HeX$5+cHzo z5)NjnPs*}h`!;d zHIYKuY$HKq!Pje2OV)U-wRHlKvrfDEZ|0x3DRNh@@>8Cqm4!mu#zPYZq9dk;@o;4< zkH-VOZ2c+lst%g2um9mLvh}1Mt@JHHe6`+bT$8ODKt}Zc62g#cC|Kl`R||h z{{V#58*5#zugG%|e+mVL1y1L=QeJ|~Y03Qvss|^NiYZ!^<|$!z9d(5QO%>mi*!0j- zT4HvfilQJXX2Ii%YkIK&?zClkHJx(R9*n(TY;Lsi7H04I+`R8@`pl}7|N8pHqh9_n z;GrleD~5JB$dE?Zznm$d0Jf=a9u$!P>qI~1#1$GgsIL!h5FM^h@}NA| zLpJ#iQIVqgKc1z^Jk>6bj+yiB+f^@JA}DkArOQtbb zQ54Vij}091_Kvk3@($$lfl(nJAIyrMkCgYLCgB=uLi=*NsWIizXtNt+AH+An?Jm`~}YO z-_GVoD(5?%;tMb5Kc^@~&zW+>J4LKq27|q0R)??Q!F-no2u?#51&@afO~kvFXxw2= z#5>2YuVvz|gCdJN0#3;}QfgIL>W=vwl@kEoNJ%apQ~*!MxKY&mycAaPD@uUC5Lo8N zGj#IybpADbCiy#;xncSg$LU|Nq=lmdZXuaxj|otQb&5`WmKAXHseb3i;&2)Z*@v@<7XSMELd^)rj?U}m^ujx+e*7}t3Q?g?T^-Xmv`MiIbpFyo9xkb;58ou2gtapmb^4l)m9Ii!Jz?TqmjNZ`Gp0)<@yy z#YVJ;ZG~~x3?1xmjY<<@!;OKRP>|CBz_Z=MqaND9b3m-?nq)AU1550ue+tNli?3Hm6ER_!`;1iBQzMbGp}Y4snJL|!nS}z9MKuzX%S}3p+eVXDxulJg{~M) zX%j|3rbC!a2RC}^$k(&aVMd78yJ=AAU?2{Q1Yt65P)X%bjG@4CHaBwyXT4wUj#z2C z0;zBh`t?FQedv~03ae}A>l2}b1e+|x*X}W@H0ku&>Tty=V(c$6n2ISo$5RN^!@7X#S6BPITw(vv~jH9?%LKW zN3%rdif2^d&eNNZf{kQpX}h_GN2D968&p_GM45%blFBrKIBXl$#>>#PYg?~2)-j`+ zhqbaC%CgY(cpo-(8D`Fqe|mkt>jDVM0L-Q;85pK+kkH zf)N7!dpZ;ndg!r3L-)wB?V+2CB#nYA`u-t*h16^8Z2u&`+IswC9w$6hc{tD<8hbxyRu8Qik@p&r zFS7(0kE@0tT-g_{j(FkW2G?97lv-OEH%w-M&ySRfcb~8FW3ik@k`oI9lv`Z2(vpFs+ynmin1fo3aN&8@XDqC#HnjN=~lXTUsl ziq8}!4*h3*2{s4g=I^-T3S(15s}=)sWU;fG092Y?ojU^aJ)Pj7)}LYc^(3b6K|sw* zoS}!sY>nAUcd^wnCLD#03o@1vsNvcPip!Z8+ysV0^TDzQi0thKxMtBM;J}0yfEsvXUZ> z>dGVAHhD>4i}KC1k`Upaii+eKgtELeUeW}xuqq7Z!?oZXIV=REZ&Yb9UZtZVL|z6H zrQDS~Yre1DSZtkGm{Zk8=Xd4Ypl-}!re_um z3S$)Mq&l?LY=4?6%LrhJz|n7k9_ z*tjq^Lhx>r-VJ@kc$# zZqY|YkO+R4X~Z4N^s{O74jl^4Q;@SLr(#?`Rp(M}@*5QP5l(o_s&w;63sWxh)}0r# zA3F;QM=Pc_S!C+E&gi{2lLy+JiMY8~_RoOimpKMV7a9?(T!9)1Kea7NQ*^m(>z4vchQAUtmzV~THj6mG`# zi*Nudytn_!G9RR2-6>#&fE5nn536mTp}J?u9+?9#q$kWX3JHk_FY>(FQ50N~3gl@B zJo}FvIzn=d61xY8>s%+RJZG!OO-0SlVLnNlK;5JP9}=9{$AA~_0hw<)g{n9) z?;yLwI6X;!S&4<_(8!NsP(exJEbOl%P;^v6K&ICbdNs`hu>GxCI}^ zw#52|tz{Lk{5FVW>o+pv+Lt&7#_4WTI6?tN2X*qVsfi!lByGs=>Pt&FfVH~UNglB0 z8>I23upWEOQV>M(x?~KiscImnC7^D9PRWHV#W2aRLC~ z#|avg1vY=a8-}g<<9z<}e15%@Db;@gu0Rsyy5CpSrJyDzGUOH3SG0skQ^M<29b;7M z+5x^5+_WFo z)Tl-ZKCLo@{>j`}g6*zJ%8=~D{ApfF)@SNtj|^?}$1n0l1v>GpeexZ_ zj@M__GZO|w4E+e1LN`g`ym}haS}^Z}QX6@$1V~VVLH~rn!T>Vh8`k2>3oP}?O+7W3{5H=J1*K7xVfqJyFSQo=7>Z60K*$A&%8aL9K0yUS+8ph-XVJLs_B(uF>%1`n~dNLcv_QyKIIF* z<=aitg-l}+6}n4|^k%E(yX>x1c>{y%9wBi*XbOcoh@{M*Q8}x?Bizu>Pv?y3Vcx*f zXyfu^qC4s#D6JAt7+Xnxbt*(2bX$&ZnxlBL9L@eHAF@uu>Ea zlk$HTRX#fENdGHDmidVwGUrZwW>Yv%Po?e-M|p*Yh1qC)2VX_)zkV)YtK4O&3}lu=U^yt`XLVO`#G zPVkI%0%QyF_L=+5NDKHdm~HI;@eJ{jI%m%7`Gwo+8*EkVcw46W8(KK5Zd}5DUTnuC zG`B2@m1xnD$p|Z5pbTj<(v9c+2kGSn$&HD<24IP6-vRex_M#-QDcl@uTN-DuQFBY& z@55`YipN^*N?c{va5Pc#V=IMEg_##;N-;=Wo;*H7!c>eIBl3(5#c#Ms4CZDq4S*{q zNfZt_dnY<>NGnJi`pZz0*oX!F3n#-B=x4>!h1F#5nfBLA!?8R21G4LjkHDX;QA-ow z^5pzuY`0;)CF&$yG?iJ?f-#)r%^{UX?FC%-3Cb z;)e3OlBv6yZw0&w?8n}8?8Db+@u=A5@>#V{xd`EmAMZ-OBuD`!x|bY`?J%)a-x)`@ z1<}=LDJUp|wdo6k-3o{;>F|KlXY60lFnAd!7*@3(VPpm`8F)ppBIvb?r;QK8`aV=A z{?2L0WxLjBv_^XOy~XQc_W7fl;%M80aYImI3nTDmgb>MESo|l2`iD(GoAB_a;caMU z$KcUwW(zY8G{y^JLVV%9pm-=$<*798j&NqQU;Lt2_ggcib@IMWBaHF%%HH%h7kh~`^K)D_ch8j%k}tGdZ_r0{6YbUJoD; z_@tOdbDYoIC*YComL$Ft2pyJOq7W#1+MjjJdx5jZBwWyV)c^T=a?T_6g?5YROTr^E zfGU(R@W;WawJYFx3bSMNN#C zo+}Tv@$z{FmLXYY(=T2Pa}LoOi)Yh5%=)mp}5(coc|gfpg=Xa{-cpDl6qO&Bmetsd6Edg9-~mqLd3GSkYEQ)XnJ0gYzK$q@}qXH1a} z>;_O24WnXRhbKEGqH@_X^2;wv>a+vv&K$9a zBUc>~%Q@#Yq4Eh8*fH%TGD}spnL_)<9QQHUP8p2_hmOGOR56H@Epj@0sQTXfHSg|*|2p5|Bsv|<#u;>Q^5V$^W^ zM=I3B6=N0IQ$LIwH`qDHA+1!SKG*6)vovFybNifoIck~27j)OZa$m{=t_dv}#lZdR z!AjqA)R~-EySZtkV#Yn!bH0?CIX%1%Gv24bUVSX7yTq@W^3F%8+ zvXSg}|DS94>Kd3|8By*khGfXQhbh$T*_#G_ z@v5%V>NrwDk3i{w#8;STlYH(;ChzD2)SO(hI`Z)DxXpX-iB!%7n0pFbO2@Lhd(13i z50%R9REx=tpuY?{R5vB&_W&O8?W&S21cuRrk30}RFo*()6UL_y-%F((-Dq=HjA5m<_^2}W?D=76i=kHyO&nO|6F+DrsSv`&=5v1 zc7PgRU=#1?>eqtQlKzlJy#>bivYrc?Y~ub1M!ki}hrQN8ADFve;pc}QAb+973l0#n zO0Kdb(rtOR3fE3SrxoID5xsR>78IM|-%^i@1Z^@Oe=Ub^FTE{v>2UZJJT<|#BwORt zU@_zZgy>aa6Ic>pVm162I`e4MaZbdJyVP(JLdxbyVdd~r7yMx5;y4I(lme(MqO@Vp zk%sLssNd%%P2#v(g;#BpeldUU6%h4f9Z*DW3!BI81HTj;6T*ab_NYCR9b{VVR4 z6r$Ymy#x!TG5A{wmn0{P``4LpD-p_>*I_i+nX!QuF;UbU85FWZkwaS1Ck+)*2I|_< zrK!7{b|W|16RaK!uIOf$Il1Uv*%A+UuyyV+H9L`JOD}wFX%_?x!v@FdcuC!2rSI!p z&Nc!Qe?HiBXiG?HA}IE|w6djGTgKB)+AHR0x~oZ{kJhnS-Le=lGvpLFSh>pk*G2%^ zIT~3h!`wA=4g#=(rk}+b)4=MfQCQB0zvu1yaPY%T7u3DDr}Ln}hUS1;k~qsJDNKLE zC3{oRIT>`r2Wr`>qM&sV+*;v7PTlVZHS#%ov6xf$l7@tNH=_tFupgxOfTV*@N3{XGi(SogW;2et#5#iuU~YslQ7S72(8u^Zjt{Ue3Fpna-YEw9kVK90w8 zyF%yOZ09;)wu8}oW`AW=J>nT;ttH$Di;A;F(kkMa>e7T!ehv_B&j(uWne?lrw&Wtd zo?La6hj-81KHVD|a}b!u|!CQYfou4*5iyp(2cpJ-lrg|2Mt zy%I?THF9R6v0?s44pn;>Nyar6F0aV)rmQL2**^L8kbQzkvep#qmEWCy#W+n^A)bH5 zI8_)2uyt_g^Jfx;91d|V&f%PuL9lN3c%mJ(&ik4K&*TgNz)vi}yh?GUZuNlRxtcw9 zsC)QlyX?mm0d8Fn+@eqXujap%67PW;HiQeW87_s-l;rMc;54QE`)Y24+M%L_3Iv`8 zX8dR=$ucc{GxNY`*wj*U5<^E3P#!dh!QE?!L35uL%L=NNJ^fs!ZW1?` z*h~sF0D+cQI|+mV5Uy4^>yt^l=_nzP4gX|avwpG8xO}HiqPNudN|38GZcZ)3ypqAH zwpKaSp*$f^n0ZTF_ff7BcNXtSKxT5Xa3d(CaseVXN{I-^@npeCwzy3Tx92-kR?Esd zh%C>fIg}7l@1R{=HLOhyHptFTr$@LhYota0gMtkoJ~Pu^!zl3UorUf4Qs4E;fK(#~ zSyJ}sDc3bObxPC^ny?rlqj7)!0QW1CEE>yg{)wOjt1Rp?481`_yX|_kUrkK=&GY^g zZM;g6Bwrwt;!O2a%#UVzDf*1ek7s(ta&Fuk2I5hBIp|zeDxcz99em9Krgyq=-QEO3 zV$Ei@i9{;IO0IGZ&&Q^<6Kk3yqM%YcyK?P{pRFo0tLNM12l_hL!cpN@MqJGXp8VD? zG4dVkV7FjiQrOuyrs~&KFPK|BmW~CRdK&ryl z9U^RSQbc??i!1Kwx; zCU7BPf{vip>w3xtAddMn>b_|+zVjWhnl>6vbuGIB8xsZ&Y*pc~PTsRg135mt)@L;- zx)~3mPx}m09kcByQym_T#tM?Yk6$mRV8>RH&SBg?Q>*^P*zwQ=d@}v?24KF!(JTgJ zf@_2h+l6*+?u&W1qDJ-Gpj@cv9EJd+eW_Z+1#*^2b^^tJ!$kYSVZP1)waiuzNs}f> z{?>~N{BX}m1Yo{O-(XVf$nT$MwHZs0*|gF*#~Ua5$VKB%_%tfJ&li(>|J_|&L?x87 zjPy~}D(bB5Uv>v?q05%w=D_o^bH}xHne)s}rdZQsn@*EvwRiZ{{8R|h>aS6OQ)S0k zEh67UZv7psWC*kyRc&^4@?xq#-nH;oM|&+R8e+-9?a|HGB~)AO?dtkuP*gh|(XJ{3 zw?_K}K)+w^x^F!y9&GiA;?8C9N7pQfyWx*jKZ<(AXUI#_v%o7kI6Lw{eGsE6kV_Jf zF6=%A(E2|h?l^(`IDHII^|T;%_MArA%A-FxmcdpLOp2*pV0J_rm$i;-^K|T_c=E0= z?YmaZ0JC^QUKF`r$9{mB*KP&xUzCMXsQBY29~8;b;arCL3eaDsQz;y6g5S;90fyNd zKe9Jqvo|2KH@2&$VH(yBNf~sKwfB#)ebvD1bhih^r=;U^YeyA0P0F)D_UWZVHRD=T z;~-=aXL!<9L0>!-<*z!(Yp4NCa(6-l=tvo5FU8w(zyKaqUy2&)Z6sA+WEDPe)lD!} zU+}UQDmfsd9LiCtJ)ztkOoj>N_l=yYX4-M)QQ1Bj`x*`O73T|Z! zZb@#x-0D0Hsak2f+oGbYu}w8mE3jSaXEwwIA$g~ykc#~;xJ;&oDehz!e)!CRJRAL3 z4WXzPJVRKuTm*ezZ0`Fa==1+!BnVNT54suvx;hJbi3RdZ3-Zn$_zBtP4`&qb3YLc9 zMrYLa7vxz5s4Zg@fC=?{67MT$bhUO^|F>Aq2hn^3>Jj!5Y3NAiZ+a9#C1Sj&TXEMZ z)2gvVCzvgvAAX;KF={UheSJ8*5fXVIzuAv>U&p>LI)eIMDX3~cnzgGjwW~$yQGXJz zOLDel1DS&>R_i1`4*90p!p!I7iUk7&xXXu5(8(ws%=+~2*PsEq$ru?%fW1#j_EOf< zg4)ps@?-SnEz{PoMA)WY*P*VI-mhX^+;^R7{^tt-dbxf8^6Z`bf?yrwHxKeW3|`Ne z)%VrOX=Eq`b?Lb9qYI`l56OrTq+S=~QUjz5q0a!?i19}~7TBsR$fY@myX1eZs^@iw zK8pyvVfnHt-l_L#m}B-A6GO_+v;aQq$bX(D9~v50jQfIhUgIx!Lp#OQ^`eT;8&(CM z?)U3AMEQPL7;86;GvbULYA}U`zwe{6#XDqJDJtL?zpRaOI)gC}(c20RQ~AF*j;K-j zli)i!UL9436uwkxfmKNx)DBG!)!|jZ>hV{`hgmr>)YuTR;VU`KP2m8gU@KRi>B60m zLRh|k5#@?C<^R^A6Kt9JoVuzE$=iAz;Y`s8 z3VV$;!Z&`RhkC~*d50K0VfGw0-TUf*35Ag{PRUMCfe~Zr9&8rqe740DD}YV-A7xRAPq=;bx1RCozo8lb@3ux{|KG|Y zyYJ@z|AnQ||AwC6e>~wovdI7F2*`vrQfA3~SlCrVQiwTO>_8aAbqPv?YLx zw38chz@$S%ql$yWQwT##bZBWMF`6A%a9%qQNjZ|(wAARR(M43K$6!_TC(+4NJwe)B ziC2BjF9uv$E7~eDjy_BJ=v=8Q(F!g27a5njo_!rQ?bSMWdIB6N&Z zJ&Y_17|@|_Ds;Pgva#m`xYHp9`#nSYwkJm5dgJ3hPc_tA5_vVLDC4YQ!>-bP=UutG ziW>Py0ppvYMC^mC65cJCc(*agX3fM~J>U*$^Q(*ONxCknAc6@pF1_7X?>Mf)?^4w> z`Sv2YSt-;ExPs2iQ6lQpq_4Y%BrBeFnX>sHgRg#zwd^?UYdjfyc zh8&zo=TH3304c5#m{*`+#+FP?7$h-^1-lH3h8)^HXx zStp9;#~PF~6Y*pR=yAw%Ch|Ayd!hp`u|ba{LCf;>! zR&y$xMrR7CvHar1jfC271xysubBK9cbMw}Tmb(W5lE~e;Sm)17I5Ps2YDAJBLSs+Pmt>yS6X(*n;k9?W`f`T$lv zU3YOH;07-NE1S`}?22B(&$Fh?`NKajpMJP7Vp5&uzh36E7xQCh{>o@$U%;|&(}Z}9 z8za=Cf7O?<&So^yDJP4hg*J|i$W0ifWCQi z;&-?$Ocq?FYc;My+GzL_O9;0VKLSnoyw5@SyHChCY;!#4`A&<|!{hc#zZydOa)e&s z()dcl4kaVWweRh>6W^+7-KArj&(l10%%Z_jzZ0*$0`L0Xiz~+~rGVJn#h|&?@rdGD zLjLRAEUB{6RaQpcwC1yN?k?{VQ|;p(fA{SE$>Zs5(>-W3Qlt1DvwA<)C*53|qF?C;Zt^Vt--dmXSq_|F^&VXbJ?k4rFp~v(r zfl$L1gtF3N;VajLQ(q-F9pRqOB^PDhMH!+E8XS?dBf{YN#_(N}MAJX;{q`8i=iG%# zwItf0NU3eGX3;of7_7=f7KKt%BWBD{=0&KiVi+0=-QKaW>QOkhQ{q(i>Fb>zaV7i}H?$4yl}DWLo--w!~dBbkt#($IrDiyd$^}(g0!UeCfPG0y2FYDlTb4P_{DR ziRom#sYMV#^38pk!^qSzEY0L}TxR`hVnudp*fdBFDz!bGBWli9ZvtynbF)+L1L|KI zVavA7aheV$n3hU1hkSozP$%sNZ`o7ECHH7}N4|KYe>nWg7nu)K4o?g~u3a#l`husJ z%h09w$UYi9WFC!M8zbk{8IMDt!dx-_WhL6N8ewjN#(5F|XJQgS0JI#* z#-HRUoaXXKZcNlyWM5fz;jB4$jmChR|22)9@1PNM%qx)VD9kdZN)>}FY_cK$>V;Mo z37En(rbF$CGVa(O-D|tQKL0kTl4@CcL+Kg1 zKm8RAo3kQofXsnXI;wvnWI($M$RlynqB%A4-yjE z5Xvuscoj23$yiU+r+q5iArOs-@&+BgWRc$a!kvl=*i!4ar1d}^&7_;xn8zN{$EHtw zJK4p2yVEYoQ$>rnaLH2-Uy9EI@H@VFLb5kT%YM8T%~uTO z9hM&DS5(cuqZL+wBDIcw9KHSwI||dv&%^SPh8xVR8rZDo&erJ#e@1D}ix1KC5lutm ze?-6k{Z#yjmigDqESn=rpgsk%)OX<9>*IqGRz9T258`a>fqvZ`gI#x|qm*)fs{$9$QKBx`P)2A>h6+J)AC9DM1 zbA&FfbF2(se$O2XkHFaz@98`=HwuI^>d1tNT$1Y81GyH> zWW9vKu#Wb(r7Z!oc2JKqG8J(alqLX0Xc{R3PE$ zCAAy8Hx2GCQ7Tw;8 z`pR@^&aF+V=hA|=0g0E}bK%g4llN2G&9nX}Sy6zy{1~Wy3}toi*kR6K7&V7|&|P^R zC1aG;aX*Q8p;)4zdX!%VpC|D;GH?c?*6r*+oIYKVa$z*Cu{4R$F4AgT+8yNEhLU|` zVVBHVX6D#t3i_GAidkKjmU*nMI%7dl{9-}AV{xueWN$X9a5z?*VrieJN_X$n3%3TT`jkbRD6h-y0y7>Kk z<`wG=*xQ*c$F|A7vTY_01JtAHTge;!zI>dg^&z?i@b|2o&)_6~MWUg?oo>xRoByce zWbDp;6?<7WA1AAIPAARbZ}j*h-jPFIK(XNwW? zHUIi>$5 zEIrC{4a;+P3UYT!a%VqQayhGVA^zo$UiyZgFA@vHPQ=2fVdxB299JL?8fq20&EgDN zW4Dl+nqa%>XbSEm?VOz7Ff5-W3dFox$8#5@^U3SNDVNYnCFsPNiy6B1hF?M|KhOv@KB9TTc1ykKBDrgl|+Gr}i8|p29uGtF2Ra)*hs0t-x74bnh(SM)bf=Yf9_MUXs!A zkEeXlXt2se92W^XnGBnQbEV;k^0;qte80XbY& zN49U)M)}8Lk?7jQRkZsTa6!u6pc&CKRx~k)y~^a|wUJndz)IsjBd|isIL-LipWo_J z#@{fVV|CX;&0%)KZb$`OODrUJy+*z8$*cb+^!GUNH@>*+-r?(=32b8R8w%I-#W74_=WE2!2E9ER9{z zBKlL>`pJyS(4_4nhnr?Nfn?g^4 zKGFcY!@Edq>&g+$i#vw=J)01AX_c4YAsZhLSTdI%sCGi9Xkd8 zn3Gq|H6tLyA>ju5r}&?p#v8uj|M;D-IR9S))^ zFbcVq=`+p$Di>Yc)8&P75nZvjZys_^_-?#r6~4Y5?*&1JZpk7LxRgVlu;ERh4R5V7 zBq>8q`>6BcoLDEO)4PE>Bbh`tz+g&42y3sH>?Rg9oCD$NzDN+2&GL@woShWFDs45ITI)zqx|*vlzZzu zv7WoTJz@W95M4c=VC?>9-Xdg_>OmHFNt~s1DY0?M(q+BPIiCmC=W>YxaCz2vh<;j) zelVrp5m?9wZiK*6#(Wfp!{LhP{pI2wPBO zu!Mj1fTJl3t8q+zv4(s(b((OoRavutE<|-UTzB#nx}A7ku)CODac7PSUY$ z+qP}nNyWCEbZpzU(J^lJ-sg<--}{bx#vbF=sE4YjdZ_RBt-01*bI!OU9KrHKKWH#D*og2?I(3L)* z^g$4sre6`zK33fQx1_`qw_9VKAK)J_lv-6s_Zl%eW}=7GE)G7fZ<>-*%mkIJ6Z>5q zz~go*XiLQCZv3-pj-tZEzvU6Qi!4OlM&sEgO^;FAze|WM!tl0o^T~P}p!5p{jUhkNo$a0Y({H$507eCiK+cy~~mf6iMu zdtA|R>7l+Q^dfT{aTPO^kQa05OZJ4<3jd{O957O_u2Zgv)d0+Fcx{+|!AYM<9W?i; z)QEkc_6q0QHsFS+jZ#b#Triv*$SK3=U>w9dijSfQBJ3&74@xSnu;eS8VSGmWW)%5?SE`{y? z48CG3JK<3XNvMf@jprEjQ!m7J_QC9}%+%H&v{L4k<)sgiR%Q%B)|iX?1Qv(=R7-a3 zOG#ssP|M!Ib%&shAA!1zew|LZEA$*#)fFT!=y6vfhC*Hp6zaim+WWyJjH5Y-go6xC zGRT;P0y+{#LKn90!ZC?p%$`NEX7}R*C2l|$h`sjm5vSD9hOb*RI}gVB?3Xiw=h?)Z zbA1J)YW7k|si89#FHPi(0%ZW-<;YD|40oQ-gO2?Bsk~@XOA?2$lBig?JWKez8LH_F z?a&Od(nF*@To}q!m{TyaA>Ch}%EzSKnk;Og3FSVrRyqGs81V96;4yAPnHyS(l&?*n z4+8gA!EG1m_H6A(i|LPe(xt~N+*4e{RNLI}eq*_ecB7mu|8 z8P;kyg-!;yc0O(HOdoD0)#z)lzcx{T+e3TlmQHnsq#o3+MEW-TEMBC>tirIPCp&fT zkl4E^OFNGqgo=x7ej$Xs7{0IG$zJ>G2lY#+%S~wY4uf_NdTrq8A;hPY0Qo*_K#PbM zr^TL^9NHfO%Xx-AJsL{RAFs~_>=XPSwaIc^F_ikdE(O8=-zXHx|FSmy@7x?kV+V76 zD|3&3;Xy~I|H#j&Qv4?n{4A!`rmRAtpg?ac)uSKrI3yAS0hgMDK$iCc*ob0mTqSI( zv%X@#Gm=I80|NSn_VkMGuNqTYqDF-ydLB)*n08-JaGG|1K0jdk#k^rU8BhgUQn>8l zNcgKxTS7v}hIf?86?$D!9aAeNzn&YQzkghMKd>X&W*rQHgJJu-Of&)Jq<%14uq%V+ z%9uHbbJTz_5D?<2P6IK5k%9q3E?nLmF}L=OdqjSr)DS)W!Wbe3CPp4f{4JU;^$OdFDAsIQIk!sHUWYb6 z(!z3=_UBNHSo%xEKG;Q7FlIF8A4lG+Y2uH^HylI$Hy6_Xbd>rpjMx9k0Ew8p85=2@ zd;F6I`d6QmoIL5WE`&1tWw7) zzGmhNDMWK0Ls}E$x za{ysR6Kg$>A_I+glLp<{REP$PIhlH`B#LU$$-|Ybi1Zzi{AE_Rdp}d>I^6MEflYit zi|LF-HM*54dx6Tr8~{MMddO5204Od?{S_F?$v5A~JdmO!T>yXITWoP@vJ~-lz{LI% zM6_-&f!gA2iXnZ--5Q^trf>cVd}#vsfui>@;9C{1r%9^1bW&$Jy<`t?!juk1Y>F2V5|@K;e}NEZ%uKMNS*$F4!GB4OWcUh!7Qq-Be;ecC~$&Q1e+r`z` zxm94JZP6%Oi7BzPMD3P8X!DYrqxSl9pU_DL=V}mYNT#)CH&h+KgTeHO>gAUSV`4Aa ztIA-Ugz6Q>iJ20xtWTXbOdH}^g62_X7%E@u$NkGkm>*3NCMEuRoPftblS49KF#8v$ z>7XjI+o*FV+W$WF%sbR{c@ZzG!zFo2j+-t%MN0Pxr+*DqnM$!}A(41Br9KHuaFTfe zeUx{CXZv7Lsir^s2oudC%r*%iIjqynYAE_Jygw&V!nJ6aN`z}`oidEjX?~~FtNE~u zQEVAh&6qU|ehWr~QPKu15zlURB%RTQ5H9lP57LUu>yP-H;8n2Aw}DXg0APttDD+!4 zo`PT5-hZs?W9-f!76=P>%U?$qab&w1+#zl>4AEc0zp4YYfso^?t@%(8kHe^Ps`2=B6XlB1ZI zjmwtX6_g0b9KzV{c;|TZ^UYi>4Cno{mczUz=iQC*%@2R5i5s>&iOprD1cacaLj{p~ z=|?>k$<&r%K@dHcfj?HlR@xUYEPJg;-y*;v)945W?6Ol-tu@ZvK?EL7x+=4*RGZa= z=7Wy~a#;Z^{5?rx85$@372r*YI0jZ#)J?=xnBs)J7s(I9P@ofsI^wAaokxFbGp)SG z1|(i&SLvi$@t9rU+|P6wD+C5hw^X8;XkiY>HiWr{M$83@^9b%y}zwW*tYnNk00t; ztsKQt)vQ>w`1o0&r_2Dgr3|B>tq%2Q(6n=C#bi@r#H?@9jIu3&PGBxb=_IV2Hhr(_c)QY3u6iCge(TcU}5fnt|MM7=Pj;XTTz|%cF zAD(QSA#V7lVrG-P)!NWMv!xKMr#50l3XmNV%+tNm7f&yeI_%uo)oAxlv|86T$4K$K z`;7wnA~JD@(f(16>``$r1VwdjDiN!obMK{E*oGCWY-~m=8LxS|m(V`Xxm3lMz>dM? z;4waCe?K#$5w*w*4ZpN$2TTv6u#O>jXOU!s_;ljJ=TYi)A@XsVMTl1#J|!&c!F*)2 z>3XOwbi%Olx%gVol-RDa7Gcogl3+Ge0@+royvL2g7sW7Tq8qd@~4vag7C`8SBP7>qc96WQpJZa~^npU~jai5W%cR^X~dQkEon(iZ9RJn@X=WD^4M)i0fZI{2;Q==^N8 zRJyg4lsZKbeXZ%@6M6a<2FJF18Q!GAfT4W*mTJ8`URH7PzZYc8+-4~ld1ccS7>|Ad zpC@ewq=|LbV2oxa&<4O=Gwi8kbM4LrDO2-_dSer2FV-2xH(g#UX0cep;8m#Xf<-Kz z3b|yk;G0+zmV@~+HS7T5B3P5QA|sY#8b>1akuyaYuVzYDBCLXqFr=xu1T&@-ta%rU z@J z)Q}R*@v?C3_J4Vg4DJJdheK(&Ts*#m=0j*GT@cf7CW;GA0zI5P=Bv zkGUk)n{!t4M3Oy(PgzN7-q^{9;_WVk?1M4-WA_PB-h<4-wHz6hj3j}%75epYqp1-P z$4+@D_wAHV@_+K<9(v_@m}P*4sTWt1mR!@p6>3@g>C6A(V=zgoh-{nLDbrQZ7Dc9q zMvT`f^P937BAlcobdk0I-i;!IYQEjmC~=i52-lflh|eY4vSe;6Y=GiF!y>v?hQ|}B z0DbhB`aOt{N|n7$0}>&^AuuW)dg6yjv^`T;l+rVPH@Og6$MOOZ!VpAr;G0y8sOZFb zd&pX2K#jj9$BjEL{-~hx4PH_$8DvNBTglxDZjpW)IR#QR?+jDf^s(V1ls%&Ya771dB|@TRCkL=4Mw69S|pc+oC(ZTP}594Wi!4L>mb2W zqkC=QXIPxX1&j{S3^CTpVzZ~iqvF|-1>6}K)LWIjw`Z&8v?m_6AI<9SeW==&%j3)? z2so&g(`|qrbwGpZy<%XMtH zmk~#@%)L|e=XhaV*cu;s_;b8@cfDRUbcOhsuugM4px;F=544s?&W)#>c~|8y1D(K< zAlmnt-}dI^`b6stAmIC%fAr6r!A(&YP-=zLzqPH^zDGHan6HF_O(mwbbfik^ty?1c)~>PY1ioAQqpjWM`76&^=pF<6qupJ z_I{rp#b5q(b?DfGiLLy!b@)BIKsO2epKf>-byI7VtLD4yk%8VOjYOH z&Fox2n311Q!Z%6qLMhr;X6zf&ME8UU*R(1c`HxwAwXnxWEjRHv%MbX*9k$x5YTPVzxJ_z@K*p49lU zT$TEt(iQMbwImk~h2k>HFkhzJ+qkpNQtuFB4bKwk41nAsa}A7#MQrOuKhwSrT;piO z!{ka<=+5nJI15?KSJ zd$O$}ooBnt$9Lz6?*a>Wdl%%aMpYgEEcZ`&G;iCSvkvJ~#{WihxV49>`9NL^M*$7gY@k-0s9J+ak&qQmLO10T^*)Tev zk3EY5+A@2;y(FxkG5LLEpkF{P_arM(d~ZhkEa7uazi0&W; z`$h-34vCr@gt|Emn<-Ml=`#43M6u`aa*_}ECenTNqV7>6CgP=v$7&+;v5EGgy59&jvnz2g3(cdkl| z&7=9wGKxd|pEdeFLEnE7!T8VKS0fl={~`&Mw-x`H8euacP@j||?4wjd z)hzBuwqRjtUYE9(fdyPtq|nqZj;6M8F}Dd1ejbJRD)$94>}u*Y6Y4VL-#f*@`)2xl z)sqYGY@o?B!i;dnxB_@ybACs>cN}NE-#*p!0FUhPgCN^bwGQ?~Lc{H`rSdA(4)nMt zgzXb|drhRuK0Bn+=aAiEHj+qC+!ystJK5A#>IK`T{5%pLbe`EfhLH;KcNeX} zFrJ*J7ViHG1Gq8+Tr!k`kI!XymbF!1F*$X#8=4*EU$urwQDK`{qNBj6+%r z6KPw|hs^~<-A|`8*^tKwon~kWQ;OmU%e9b{D)*4|Lz&`;=7xmDrKY=b0PXrBmHx~! z%inraJI*k3s!gl0ALHw&0+&=+DZH8$DNe`5Dom$^EoP~d0?~VgUA`F1qY-_!gQsfS z_kD5huVEN_sc_>r#h7$_k_M3|nJpGSnvM|~_9%_8x5NA7RGexk63(TCXGrE*`)`$c zdze`*Nx4-uh~?U?nJXi@#ckCH2neTX9WPZjSL>#Q`KrMWz>62ZXQo9g?Re;m6h}vvv@q@ zsOCm)236`}JmH41)a4odnW^CWzAf$TWd_~5wRYCo?d1In`hrVxiw!`Zl&uUT2T|zC z()a;kTpmINv-`2b&%qHb_R@pSodtU=3UKqGJJ;ic^lzl%g7$*U(Gh7J@l_&-NwUJJ z_p@Y@`vmo3!K3gVA0GodN>x5TT6;mhsu-Li|l1rhbY%OX{2l)Wg~Ry zp5FqY%Y_FbokHDa{u#HtFa4+;Fz=iad{t=rTv%KVaV$9c*-;h)Cm0gIZ;i32%ilgE z4?4xknxLu-66e3QVQY3!2uP?P+GB4G9_wJ@P7&pp4EMRico6)M``iFP+vs}a=N1_K ztw4%kG(V9;lc7>P{)F;K>iR4LRz=pY!`LBPNf;K}V`4|$-ku+A6WE?|NIZ>=&@YiQ z2(LmMq#*Q38Be)O*rGtN*M&oaax(u&K>BrsEQ7DSfc7F+>5Yf_X>%}48d+voh8BwN z4?=ca@)^sTcwtKs#9Rv`*L{@^2L(j4VHs?;qI;|WfZB&ckC0>4h|pP@`CvE5XF-{4h zSZ1AsgBSx_-WePWWO0lStRGk$9|@GSZ*$wt=3bYU!-1wuw|_p+8GBv5kzC~VV4hX{ z`0(bp^KLzxmknHk)DA2BYQ^!G^^oLvY%QP~;=2mAx?dJw$^K{4-tm zMynsCl-olL#S44p`)MyAJbP;|Alx7jCz_P$l!T{MYW<$R^Gbky|1I_z3aOl^0MPO6iv?zOY){y`B>!boNN^WJzLcYI8}WUq(h ze7<}_0*QO!^#W@_7r?6arwy^DREvsb=$}F$(o?2I6C7-`m+c%vow+kcs}eQdQz6z+ zx@q@TL1EdGf<+&5;xQ2#xi1l${iX{5JL+fI*wOdLKN3_scws{XSJ67qBu#+>mxS4p z)1#u0grYMq)~P4SlE6OlQqY`Zg7siBM2QqBlXA?UG)- zke*-i3;HdtTZi&POmA-F40%DRtT3|x{QGVZA6}&uz}I8xLuB?TPg+zZ5u=2bC^p~{ zVLzdk1j{!ikGd$8->urw>rQG3A%Poe8KYQa7E}_krs6i&&8b8=cDm1CQ_amTZj7IW zVa`ZDZtB3SMY}WRy_Zu+v9UY#TMch7D!?-vRU>b z+?z03?zAatsvq3yEZ0PBC^RL_ihQzSrWp%R0Thm`c-Tmokqro2t4pFa&Ural*u>kN zXl#DZa8`WQ4{8AnbeXRXTcvSt0+Il+IF!?qwGc@Tvom4C^glxC1%32Q6V8H5wmD-V-Nl$&?6L0$2>%9eIk?>wdk_6z^Gg_V;%v{qm;T>VKPf z1VzO+P#OeR;hV~Mf#0Q{5P?8uk3~C~%!ObO{xaN3FU$d7o!}>I z)!lZp!lL^b6};WB9cD~N?PL)8OZ@E_w5<2UxNXh=3O|KFuMEq*K|?yGY|b4n{d$c}742R!LNly`h$V z-GB@GCnL1une{|cc;=pBW|meMEj~UZW?AR2PKLQ8;J$^Mp=%8A4+ydE?fr;};Ft=- z!=L3}25=0TL{oTsX^kg5VwLU#RhBpph*nG$B;VoTJ9ZWRC^7|I{W~4|2B6-$kJQok z64%*nfL^CgYLZCO;w2*ECZZ#-rrLEeREpgmvqiO2%fWDpi>Zr zT)Y1yj=1E+OtkBen$FCB{dB_d(uK*`As-%Dc#n)Fl(EO>kH8p?$9OoObMrv1^}$qZ z6*bNw<@i$^`t`afb;Nbn3+AlnAB83|2Cnboo9MFnw<+y^O62}qxs#&1jiH%?t<5*x z_0J8ze?j(aCCPsVz1h4=T$p3s4MYFf}j!fMo6QV1%-hi6V&gk-he*Chh0xdkyT&rgbikS9%niBTz4D;Jip$L zk9C0$ZdBkL?I}93MCs`w-Kzq7R1HSP-INV#$bSg)Pp~rH8=wtz5+1duu@BNjv=JT^ z(`ZKQrUyTD9Wj##!RdomKUUElWwlD5c&E(2s@nBvq3eej`Z_=^yHQ>krmH5;JLcErxE5;X?@ZC6#&p@%+Nk(m9} z&1_|lD$KekG@W5Q&sj4wKhi!BJe8rYoJO^hyqM)9OJ9xImfuy^t8LdvQ*e^Tg#Ny< z7wBMLWso|F7?ps?H|KZuq3Pky+EQCT^%pPJ7=8QaExdg2O8G8|*2m^4Su)gVQG$Rk z*ESBPL5k$iTcr;mvq_teT+4B^9wp|I))C1x5O*?aE01E8FfY?IF1-)sb?#-hxL$iN zxFca!2vq6D{E_2Sp`>(d0gd7Ulmn@{Y8wB~l23kYq zE&>?}7yfe5E@#$4+)!xCJ(><1qp+bLT+MJ!pgruALL}Lghbk-mz{INa1o+t`k z^N$ujU#UGGb_$YtNET#I2G8G>?!!Y*tEDlfz4T+(7_T$a_I~tg*Z?7Nt`qD+a^Y$7 zAP!J2AAgN0s{-qBY0n6@GYGO9mZ~FCeW+p1kfLthKkgTsY}Qng8utb2xslw<>pDWfsg#9D|h!I5`#EB5rXK#?zcO#5X_+%%Bq{W5k* zYMw`;LO!C6K9S3o%_~=iRHx9sAE5QZ90>N_R_>p%6S8LbIP3hPQ2QNx1iZL-+tMMv zoe_-eT=zYiR8}%UKsb3kxJ%K{l zLoO{x!!E--cX)ICw1T#{FE9nd9+Ir^@o*!Fyln~RPxwizxMl(`Hw;OZQ5g@__`fNY z(Z-moC}MFk>L*I2ue;EayfnPV#C!Pm`gubl6EpI;BVtk}H^cWs^sw#wh z>NvH@CL0-n+N*0l3>w>qGb24kM6$pA6DFsKL07AM!(`8Io#+37$^SWSVE!**vXZ;q z|Gc)66|60P^8fH@ZabK>v|3X$ta!ZCoKrxbAdiMo_z~2P2IudyVa0ZuGH%_vj`FVh zT4vCTKZCEF)iqGKA}|;DokZ&nFg^NyJwD+B;k@yd0|N}1f%;YaKy;qnPWMp->naMx zgOuT-HQWg4!12{_Z{Co?h%p<{H(%@OyV~GwI^T^I{g4XLAb@Qci@N6rrP0 zsXO<{@t<)y3n4hpzjo+OlawrKuvk>1OOXF>pTS;iMZ8*2SAeLP}0+7=5i^ikbrRU4uoItoaz`MBEJ;O?>j(m*h0k4Ae`a!6Ss0{y3 zIuUl!5Kg}XWIhR1^KUWUL8{*P$QTDiy{6<|GnLI@1i=6jOjkzYrawXcQM2r~jKq__ zi6DyqD-rbTzx>z#-$c;=8Z@cHdTB1Yf8mR#7@e-EWUchp2)VB(;EO~3NZ`0GWaL1I zi;KHavf@OOCm|knpJ7@;SnB)EF!hXM%0;oOJB_^qdH^req4F>_+N0`J4w=Gj?-b zgyTcf?>lmC$<&GWN1>Cjf!*7U+K<3TYmEMjQrCy5p~d)7<_F(kIDt=ytFfDGch`0Q z^x=yx(J4Bxm!B@g4fXq4sO-y4CeYcLP4L`11jrz^#W>Q~)V@+>AC zMCkzGhjW<066bF#v4CnPS*_l6^w_@xFI!vbQx_JIe}~)O_N+Hgc|7OJXmUo4I=NHh z+!NNi$7J0BNm3ubkM|09HdaUVrModm_<`I z2CVOEgL=9QF>4xdC))d`UB!^L3^75wFXQvHb%QNxctwmrl^56DpRH`Et^cNrx6(AU zRktueLW5Zxq->=dk={`nO&zITpU>ge>%QJ;rJiakABrKf^khm|TWmHzUfh_hA`MrP z_2N@6lyd%nUO!ummPT-YncqPp<~(w;7@pyjjcIglUNNXB>PmkAAi(-fgVmR*=Egu$ zMI>KDlR{2_Qsjq9P=K9kx5fOz_I2e-jwDrBh31%J>HRfI#dsY={#zn-#Z|)I^V#84 zIbG_)Z^XR45uN^&w#FCpO`o?!?xlHRn;Cg9?(Dg7<9VAV_XvX!M{ za@t=Xr$*B%=NOVzwq&r-{X(`xGVT_kZ6w16bZrfL-S-js6lXJ=qi#_|AK!6a;Zeq+ z`ANJAPD4R|WR+Q}Bpm%~mIP+{N|!;FGMf&fb(w!i&b4Wsf-}*OEIdqAKoex2C(@u| z*}7u|HkwM|{2(E~_tm9YH!Z^VrR(BM6)$u_wb1uYrsan8um;2wErND++0XNgR#A8B zIxsK?`Yk~+)QBme#QvNnQ|V9ZKyFi=Gx86#$-Ayqb+@x7V0PyqUf3;!54V)AXMcyb+_c-_H8b zgNi)ZhUuHPaNxyH;xW(+DV4~=!}R5 zq*ByLGx1o|1ZiTN&&%0CYb6>d2$}Ps={6?rrw7F`>>?Ex>~`SQEHmW&ruJR_!*&CI zTrL>wDCrUj^>@^9n3brnSmJ=SEA|_st{a()D%b=k(d}b*Dnc{}8oE}F6=C5Y_OWuf z=Ku7s(6XR>F=~lU(@WVx@cLuJHHl>(Dw<-S;keVWEwovL_pKrJ%Yz*$fIjVTfqwbv z*DX{*0DAc_TczRHNwz;RRjGnRKgy`P+;cl@wVAp@`7K3@{mB_8v>2DJy)4rG>7m~Q z^@fkz9~@jL1|@U!%uV@w7UaekVO$iV=L$ka-xA5x)x^mr^%JyhcE+D0@>I$eVI*aV zLBlr|A@GLfL1lN%K~wjcg4GKMst}wBTFP8mZSi>2HH|&ku8Bqg3!PeNn2Zy=L^PxB z;wu-?{m~$9@T}%A_}6K}hU`(}+O zeq~0t4d<;;6{FEgmpu(J)JO5W%Q#)?fVV8x7Lz`h;iHIHJV#jqLv;CRI4coUl#HDr zc!eP#UiHz5d2TO9%(<(4RAocKr+QVfL$C+)Pzn%5Oewn zsxhsIie^-x0!Mym#h?7xSQk-OPQYmm+IM*lFU@ibGHz;;Zb(w6cZn|(Ew3~2K`UU_GzsK;_g5TVfCWj({8{CjY|% zPeG<{%OKN12!=-m)Lc{Qa$)drB;43s2_8e#%CmPpnRFqo{sFnQZQ;Z=~mRVlI( zA*S;Pizm{&F|M@@mVNH@^E(@$kk+=3rd#yZlq?Dg9E_pAu|TbD5Mm+VgX1>=-JFi3 znZaS~+KkQo3|a)Dy9Y~m1oUlmLSI(gub@86#fHU^d&b`^eo7a1AbWNYXZCjn+94xi#gbzs1qb9g_RXAuw)q5T&BKN zqd|b}Sa1B#D?xxf(xMaN4joY^Hla%-{4-JUK5wY(bgl5zOz)K-?I#94d(#Wprw}Zk zW@r}@k|UpgIiV7I`(hx%FpJf&5qYJ%mtxM!(n(_9fzHAllVYgd(2$9{FC43ELCP1` zFsG(+qmGPY!>NH&Q*V5Z+OI1?0xH=iPOb=)TsHr13P<8Z}592mu=ss zX`iExT!Ptr-3zDsla^7<_2)9#GP=j5t%gs5zQ&SXtk++RNvB)1$a&Ml!O+XR*R&+6 zEnN^CG*<_m(DQS2PM+vx;sR;NQFK}?bX?<8Q>Rs;J64^(NC8-}2!0mnj6f+#LK+ql zrSm%@nh2VU86CPrQ>pTS_%~3x`mCRX8Mo!(`kc$A4$2RddDturNM0KY9g9PY7U!E5 zL?~Uys~+1Xsma=FLy5S?Mbv$a8%$?ER9?KZX}0vTI>om=$Mr8pn`cH{k{O+n8992g z8EEs|+1qrM>(OvoO*j}Wio^A?K|sl%rt?hH@o`?_J7#!onfW^dJ>HYTcffw`u1i^5 zukxNBqr(c+fmNk3-IITr&xK)4!tD`GoLJ0;F8r`&L_CEuX}235;r7ZLoci7qI)nXr zNB{f?Y}!LotjnnXks51+j+Q<@;iUNiQIxz zM24`uqfcyU2M+6ogdxAUA?d-oT3Vp;PYLCL-kJ3E>!n%y=>fQsXu}nW5bK`MU36>1 zi$&?)i^Ns$f`wSS`%>wNI91a*vPiSU2D3!RnOro(VyZ9;3bRJg)7>m3VhGjtc|v9gs4OHbIt9&G z+Yn=Z8D8>*iF_UVN)u+_$aXMkd|OUl&vjw&o`)r{=` zV|xP0`|-D*g^#-uP551Be%a~h^WjgKn5hwFgO+wkne(BgM>v(s5$uNGcqYkl2zyA) zl_}74v%SjL*4_BYvxYZw;02X%Rjw#K@};s|eI-jSQ5tOBkP{Eu<804%yD|M>3f_^i4qnlh}*_5?h31`i{_?)53e0^3E<2guL)9djD9r>BJ@?p1l4iG_} ztI{K5wsj`WWu~f%RGYUTb!DDA;&wFWWHi)zVMcoN_(z-~Z(P(f_t3^TT3RDX*ws0Z z=Ejnn#uS$Vo6oiU$xwMTV_#K!4Ai@@yRLLWVWW01=oU<6J z;0!+$|3V^FCBDt@{G9PIN@|{J-=w3GXz@=RLqHH9!JndDQA_AVXTEneds+oh$!>O0 zwAf7JZ2^3F!%pirNC%GYypJ5fQ$<@ZS}WBCEy3_Ie459jU+56&>|X4`$73_K4qG=- z`_Q!#?Q$xR5$|5YDzN&i%iM;XApraL;Huf$omYFx$DGBUh}gqr?fBk(pJcAn@1uAv z+$;Of?W>%K%%&RL0QTwM`l!RUH=mZ-Zwi-A-C{{R4=>>9eTNq>UdTm3VE)xz_wZ^IPnbYaPhK-U5t1Y*-Lh|ZmuZ)t3_>QKUEe`n`>HUHH=T**gfuUSqswOe?&l4+GVdlAI=Rv(cYfeVox{)D za@&?PEvfhZ&kb|-Gyn(y2?)rP>VHoE{*$}-Z-qLF#!kvM=JwA2L#UIj>h7kbiu$#g zKH6z?hdd%NDgaU(CnbQKO9LSWFR5n%)l8|EOGVF2KiZ$pzB>sAR#_!^uJBYvTNN=# zN~e}52@(zB60fnWk=ne}+`RM`@$bFjmmSY>cWUbDT=ez+l=~CFbL#qnJ@);n+YyNC z<_(B9B$oO)C_olsr?&*;X3qq?1!Zpu=)JWKW7sY;U>((q%g?}z%nyjSV#f`r=otrp ztCyP`m(-|n0v~yLhJi&y8FyO3I3~EM`|%WzhJ8+e`RB6<(B(6l;;|d&^c_9ejrGPf z5I)5~VCVghYp+lqJNe#znC^-lBs6z{-X}0BhzFyb__!}Y@y)ped&%GM>BTnIF&5!L zfFEhc43kU~vL`8d!mj5kePNj$0-9h0s34@7`zAzX>7$z(EJf%+Io>SKJKrAFAX`BI z5>9W(MnMfxDsv%ju>%i(aQ&s(fpzK5%|>m>Cu;n6y!O9`hh@ z7-A0&88avUs!4MP%;VRT?pD^hylC@X`7UCd*g+_?50L^74s!-vQo4}ZaTbJPCwI|5 zEu46>m__<$A7v|XHriG2!saEN^mt^3tW4?M+0wcSvC;A5_0F(v$nyTmH3%TzcGv6} z#qk$tY6*rKDX^L@%n9;=`AWH@R@1C42hXb&!bBj-ljbs;oKAkZmA0#rXL|`If{s(* zAkh1z-QxH$nnq1f&`Ru~cO!%Z;31f^!{T`6=iv!I(Te-GFReI7N0 z>tZ5JEzBJO*A>seHppgPlsq7jChD*I3FeW!R?O-u8w$6A?_z^C?`e9+Tmx9*gHFup zWHk}`EJF&7X}3oEaa(4^`SReg<c$CI{uiKXWv94gWc1Ke9R5%aZVba6(NZ^X zoYt-~xNe^v;kpk2K3(w)uOo-lhZ-}zzFKivJ-r>9sq~&={f-ML?#+@nz+6q~X=YNt zTUr=rX)vXTZ)~)4_}z^WRq%^vb&U4${RoeZp8Bb5UC#7+*+7ZKABm?eaKVC@>!~co zOIankCckVt#l!^**^;DrXedF{hBY*x+v>)$|1+OhfB1;q6i%%wVv_c3suP0L#7Ov2jW?q4er z5?8Q7=ngzHpXa?_<#Iya29VxQ^ULBWGt#+yZb+o_H;5_JiWI-_e?=1UBfdwNgFyt& zQ{ZIY7sAZ2R_pLjq&0cE>k;JVD>iNXApgnWUrXTA&WU7}2Cnfy}| zce8#ad}xj?#EJ=h<_{kB0|yt?=><8eT|yjcORSurOk06R@q!m|HgM&fLR-AYO9i77 zGTBs))v{Fg3O|WSIdeFkvK5^BDHLbMxmR4t7Vb_0Pm_QzR`6E(&oR&G7)^5LHPHq; z@<%sIr!(CaS0}VB*(vzJT8m!KfaK)%tSQGU7KZJ*y4GH=bt&9ZvvmCSMHLp}<3xLT zmKWSc0P==}4VTDlE045wU`4aP)GGa?RUD8SZ8W8*HM_mz1_(3S5@5n%At*`1+ObUm z6eUal)BsB@rqYpQT(+l+raTj98QSRu?R6?2z}y(#vWx;|>24YiaOIGoT4*TgkjXZOROO1_Xi_{onRh zPi@-=3D{o)tHk}gMcNtFF|_0-nTqz>wbsb+n@kAN+T9-0_DM_2c%t&PJ}{9_c19~% zq$nAU6toYM#p^^AjlBFTfWig0h#MY3&uPN2W9Sc9D)LPdyuze9GJ; z#^uY&hSR)roEyg#s+M8R>WG?#wVLy)`YR;zqiE8utof##uragjwua>?)XVByVACD5QzBUuN z|I57D;q3g7KuPVdioX$aEU?ENXmg5;sxsW;r?rPpCgYSjf>TW~Syd#V@~PsSNww5R zKa{df4ALzP(i8Ioa;joR`biQbn|ReU*@Kfm_)}WFkSp4~e(9ysKir;7Mp(h4$VWQJ zr>dO)tPXHxv{AP_~p2e)m>poWV>(k`I{VN4Or6WMs{0ZTusQ2UJN@>9YrU7qA($@)uss4 z>3rJsLkt%tAJ~PVxe5J<{C`OM=IBnhtj$U)w#|xd+qP}nwr$&}*tTukskmZKZg+n( zeeXBZ>(0zt`K^`r|9#Hh`#BGUDAoiymco@z5U^M9*lUAMzFhVB^@*yGe$tUHwM@Ew zXZnqKgF{a&xZq(XZSSyk+@_zCxz8`pxz5G{TJ*hRK*k4thJ_<{8(sadmjSNirFa*c z@OI=L`1sH&I*x>(kB_C#yYCagQ}%b#zQ7ah``R=WEccJ)82R4cX`mO3N7N*fm3Qj_ zeV^a|cr)y5Obs3e|Mo2g`QK;7zrGazU7m}QwUv#bnX%b_`4{|)=c1(L@TKeKI-_BW zK2L0bu~IN4n_-2iJT>tx%nM6EYP1F{6cg)*A{aN%kEV1ZY)#NR!R+_h(Md$*Uqfg2 z3R3ZghJ|ub2`5+=uQ+uT_ISM9tUo^Q^mt$Pq4@-o?R`YJ6iuDR_Y1-jej@SvMT=6K z*iU~c{zM)^iFDb;68Tzsc>RrHL;WzPn#i-?wr>$zfQiL%n90&YOU+RC5$(6qx;@w8 zZ)U~%%93X9=hqw`lbp|qSgVuti_+{V+ge4Ba&83*t7%#arv7_lVh?PnvhvN`mAEf{ zCdGxZmJ3d~QvzoJlSYAq5_{H>AA`{x^^e7vgfu3~{tN@wRi9rVR(H-&DZ9#(&P^2N z5{u4v;l?Z(h5o|x3ry2H%)`|c8dB|gobaHa*J}OqVo4XYkx6~@i9IrOVvV!9q#(x` z<&9cul{`cTX`{n}GbqfcOU=?h8(g*+(We4WRX8Sq1j8AK0B7N$%qAC<^iwJAM$tuV z)}~M9f;|O#5-z@U*OqA!O6+Y@$?o%rbIjWE(P~nd$^zR(W3o^8r0}RUy*Eh(MaUda zn~(91PHlBzq7$XAqgKln`NGmkiQHpIw08rw8R0T2zt4Nb=a_>x(l?zMy;gUMl+P>u zDX=2+%z1%>n&~!NGu#vGV6H}=P%IE|##($~2`k1){jKfxWbfJzn>47_Z|;W7BaZ#y zQkAgqu3^?--4w+WetLN2<($GJpxJ3S%%iJ31_>E)`t?R^_V_GuT+bs z=ydSw*LQ>*K*IZ^cL9e3So8Ktt#L##eCbrQ0=cR8O0NM2*wTqiClX5@VqYo);t{ui z3+0f(47`!HhTV8ou_73X+n{TT2eC#{d_>%F(Sv#Luo1>X2ix)apT9+a2wv-bqsN3B z>*9BIfEB3rc-V%W9d$l2yn*LN8P@3&lq_5%h!syo5;c+p7F{L{#tvvenM=GdeIaZr z7WvMo6b7CL)67P&I7?meTOHgCnQiQi*8!p&DF?oM z5KI{$(McPgUEHs&VU6O{1G?XmevZ8{;G?&3Fw{Kw5WkEiCzg06z1_g&Fq-v?dpUkU zgNB#fs7X4v*CNmR2>X`FJBAPCkBqf?A;qiiQXSi?jNfDo$|PSGxXvM zA$Vrx8<|Trm-$^gGn3eM{c{%`;D1MZ`r;$Z{fUY4S8*!O|1~G!zj>p4g5^r#;|QS{##4&q(Du$Zp4LDg+xR=(t#B1& zdUG(=!8j3kPHmi9sZmD#LsI1rx4fh=#`NNB7pMoRg7eah);a?VHxh{iY%ZJCbc0nh zzh2h|&GwmvaD!BG(0O^VEBF(OXmCMkr%^nqn?M$<1qfijIM-qn`o_63_f!rNviNnq zM2Hs?fL@p819qLM1PM7ntMuZYCu9kndaZ61b~{P-=WNGpACOV}M!^0X$-b+|P(=sV zK6Gw(F@uSPG3g_6iQRHTEUl&JBqr1ya^dr^mo)F$no874NcVo-G+^o1rEwMe*7%=E zKBU<a3*}gLl*LtY+w$#M`Nv?Inky_kl;?$$WDx(Ln4 z8@*b9R(zz&`j- zEV59N&n%$T*|p+#LYy9P@kDvXa^JBL8I%G8OqCmg(3*&jwW*q`MDvo!MwM-GVM#S? zyIaoRjhzWYX{25r*6eW&)a}cFwJw7-x>FC7XVH0Y8y_(t(0&>iP%GO~y!Of~IRbNH zz^eB=4MAm?fk(LOU9I(;%-icpT+R!lD+@`wTDvV=x6Hom&$+DT%Z4}04qHJmE!X|p z)Lt28u5nwf>Z+VYyqmHA+^~aYp#(&%Y=o64tHfY0-v1rR$5O`k6^7F!xy@94}M>_pHIdp`n!o zk<3gVs|+f$=YWW)5n=#DeStWE5JLNbVS5Ddxl^pqBhe0iJbc!_-@5#M#MS8rxQ1^b z-SyxW=j=8x+zt29I ze6);qe#jUPg_tLP5Wv?>Q7_VgnQ$nW3V~C7BZ<6XIA!gWwb<3I3 zaPv%acRyz z5~wLhy!T7m1!a;9c6jD)Cx0*ZP!C|4bHR43H$TK|!gYbnkSzc`_`yfwTmKlYYR2j4 zJIAJ`iRQ`0@s)U7G;e)WKl|R$cDp3oKL1GO3s-Km&8I-hCAF%RkBrZ@D;LEfo%SQZi58D5tCH|i&iQIp) z5&Z9LQ~yOzQ$17B{K6)&(TvAz5wrR5@ne`}>3L7)3Z?Mz;YjUV)kXQrtsK%?dkFhA zI~+n}8`RgIO0Pt`7DTMP7`rmeA&O_!Q^pq?-*VqUJv|$}7rpJ7J{~$##%ZBafj!wC zIUhca#inVEHwPcHX8v3KF4O$Xjcc}lo%!|ZbCE$pwtbz$~7;B!{Xa;B%9PpO*C%g^MO zCF(hm+&iv`QUIwOjn4%q%_JBECrPK4f#!2Tl*{O;G^dHLyN}__C!iOY-aH>!EN`j5 zb@G!Qks{<&2=c_aXM5c91x0nDdcFCO2mM9yL`n3#wKZX3>pu7aPEw5t4+&_M$C zo(=T?GRLSFb$S)QfWZWiE1jb0b=s}6)#ziU+(g+{WWgClh<3k4S_~9eNcpKnz!KXi zyxJKxE2SJ!Lg~Pq9*zll=aGmL>2^FPHBrgFSHmIpgtO}TN~^`;3qLh6=(LWeFB*8w z)#fn*9vwHN(RZ0Hxt@$uUmq*fy?JjbFC*0qBcq)g?y*1y`nu4RiyVGL^hBh&e9;$? zJG@^79%D5hctIM`n6BzE6gx+HWUg9v6N>9~qgw_*G+16(_ru=Iw0E3#wq-;wDgr4!$q6=kp#8c1gf^bj zwAZFy2z>9!DRKO_*yrv0*5-;_8#dFWZ;dv|kOHSko9-^g48dzl1e4WS_IL%xL*eM1 z;AIL-&jT^xN*K|*E&PY&L0ZX0JmhB>TR|=sCp~uX=F2ld*3g}*>Om9Fui`NWqn*B7koPnt53>h1Q&?-WA zXxekv5^v)DOtl9_d|L6w===C@>ite>-oTPKER1i$Al-vPK@96WAggamL5Lbc@+}?~ ze1n-a_9?9+Q&f*+g^oh%N$o24`xi z&8p#+?6sz>GF)96+|@~diF=+C2@WVt`tI-U0qBn9?|60^nD_E+6}R5mmjs#a;A z$rC-k5vZ|gMP#h@cVSC38L$p)gG9-)_Tkbsn)b>)Xgt3be{u(IwXcHyxAV#PRj=rQ)_WFgFa-l^&_ zv6s)3s2qLd?wD!5*#NME^&kG7eq+M<~&_~&dnv8!l!^D z9yT}^CH0;NcU}mBuv|kra22E`HerJiZfZ3+ZfpB@iLMoIAbp5&o#UkFk&HBa7TUn} zS}!IaIPZ{JFTvkkXOza+DN|I@@cl)~&|@(Ut?2p9;+B6%O^&Z1o2mC*ZV2stW&6@ zotoxAs@m{$aOzga0DMb{_RcW03Fmwu3vx%keq53b0OveGTiB@u8yW9ie`Sk4PkU#f*@xrRR0$9A>#?~-z#+;J_Q2FBQ5UO}w$$QOrhf81NH zFV%TL?>6yD?KllpOJFQA`4ywe4h^;?mF*;D_^1+jCx(1)%o%`yED5E zm)C&Il4i^KzMNDpk?($-=dUAOIp?4w-m&K)Bi^a!S0t};bv(^f54G5aKD4l}AtN7p zbv}XT(+Qo@4+)02B(G$3Ia?sFfCG9p$Pb;`)DQ{7_+moM$Av$V_<7Svl^xW|NY4vG z=z`4hr&-DP@O$qeTT(&aVfc75Be-SmBm{Lb2Yd<2uj!V4@ z&UYCxLJ6IiRT7nKl#-lGk;s)(zor>jwTksS*JWt9LUi;c*k$9~!YmOn-gs~@ojo&# z(~^vBmrQb2cylL$ux9T+2F!eb{sDl62H!+de$B|>DF10LVf>qOiHN<8i=*iu^5K6@ zBS{KcHkd+RF=(5vm?jBG^DPbd4T;ID(lwA$fQ&?ptYUUXjj(>auKHFn@s-T&i8P?7l`<5WsSbu>FkIqF#FGh74@X?Uj*OADOe9ysZ_Pfb#T63 z1^TLir&nZ^wsv(at^FLo#xA*}OZW*4{hQtJm`yAlr#rvYJ9C0)*<~LYpn$f0u+Mcl z3TSHC-?rp@!x5vsZUgM$p)|eycvSejTy;08I>hJqdAYx8J23}LbuPhUE=EbmD~K?PQ7TyXXEurLZ#bC* zCHda*dfXaSCf=!DWI=GFh2Nq?s+NNBvlF~t0f~kz0m>_}m{oNi`Dc=1ix7z)IXTS5 zw!uqINmapl4rkZD)EYDEZcxZkmMoEKto8bbkUOjlP?Rufb}GWdnMvm`gY!9&*+aSBAMF!U*zGX}P4G^*3ege$zW$Bl(I*>x6*nBjVnd zaI5r<*zt;6`s6loR1+3%4q+X1mo#|;!GZ3kVKX#{ zXX2ep@4lY-b8j`<9dzF}*(Oe_uVRl?(p^%F8$2Q@ipIpt>g3HgRu@`Qn6@Z<{sCwg zCv=Kff9<`Ce=?2#EBWDXWE=j&X+_aq&)UJ*#@_1R1yGgBR)1KncwZ6|#!}KiCqi79 z{#+r3B+5%F=Z#2eYO{i9>}Wu;(qcya@>*eUhg7%^_`u7Wo&CdO#rxrybzf!J;fh*J zlvzL`OY$uJIa`mSc^o`igCRT^IDWW6fb$C=yk=bL_3z+eaP?o_BLf z21n(VQv@WF)ajJwD6N7PL{(=wpfu|CE#ujzHQHv^S;wDBeYqu84h%JcS|o>3sOc;W zgvT2YyAR1!A=6ii%dO3Z73+7zD$Y`Srf>@BA~Xri7x_Tyc6EGQF#Rh(YxG4YRilwN zbW^=L@03IJYK-Cr5{54j!;msyB2x=l++>s4j(*db6Pc#%I%>x(S@y3|Qdig@l2kqP$Em@;_4T2YCE}{enSurBDbQg9@dqAAXD!$ zTZifo!HIv@q`EonL!1)@<0HMnQLK81`-N>Sw`UvWIla^ns$qm8_Yh>9qE9w#l>Okc z)K7pmaz?dtFw?l(s>GGZj@=TMlxqcr-p|;26_Y4V6x{e0R=z{zMm{Z}pNhvHvCZ0x z0!vvht;-KLLfOWVJ$j{@?*fv(7YQkejOEy+BGaQVNOUk*Q>G8e0L3MeBu^JkhnzxJ zr4Oj0C>g$+p4t@yE2t|m7?LV)hg}c#D9x)^I2lEvYW1@vEJkT!H#ywJE-w8w70juf zPP&s`>|~9o-ZoVhJ#V0!KfFiM|=HmKPQ3##)PM);fA zZ0oGMyrOzw5dj}AUS(AD1;MifG${eg8IY@re-`YftS@oz973{~L=QQT1TaRgc3z3< z*@CygaE>Swq9-Zc;tWZjVSZD=d;I~`o=GED;WSRJ0w2RbK`>T5le*eVh-`c>31JvY z&FptavZq>b%Sz}Kr4Eu_;&p!`_18neOlLm8zTQNO2A|h$?Lk~Td5+k+W zOTiapzM>E<;hTaKR;*c9HK93B^&ll=l}Cy_h{Ed@(2Ckoib!Vh1XMYc!uPN+^)MLd z`<%$nX!*sa$b6`3L$-{$I)cZ<7Rf`ZI!qr)PGV0?o>D}XWjE=XtKE=8G?922Ms1WOTfhM!*4jc&sUvP*FB0yRAkvwg9h+>feqo9>T}cu)lYs7B+)QGB z?+n|-?nomw(Y=Q-f5dQ}3bQEFjbNmrl{UT%On3Q2$|S1yL?T37XzETfkiXHfHa{Of!|I)scD0(Yv8s?XC4s+`6R0B1|Afu@y$nutP4?44G?S+pV z68GK;ZAdt!SWRuKMGkX$;{i6oJi?<*W2+;O5MTcR3a5>9=;|H*rkFMY27&lBCCln+ z#YT-3!liW1VU~y3k5t=>hRVJ#+pmlit$m6>`40_>Qf7NFN;b=rKjLw5bjfof8?pgt4rCUmcDT31FQTca?W7En!1dL-NCSNO z59)3lMJ^cfqEZPc!}fl%@Pp*&%B7*YaTEIFFrzc%{q(CE0nEq}GZlN@=+^!0$gm^l ze4K?pqNB)}^#a20={X~X_^_1ifMQBr6)TttPzL0XW59RzMM1vUOe97(NbblD+D>j1 zs$Ndwdmb^z)yq~rLwWq;X6+zGb?A`+#O`k-$~C#A^34~{8qy_6Eb~Of0H^Wta+E~C z3c{9N3pKwN&XAf?KK$2AB$dVFgV~y^10zDjCee$L>VG7L9|`imC?3)>6|XP!9Tts- zi=TNkdJe71mA|AnIL)@*)Xgc-E`DE8&NpSULQYW~(di+U?JeDLfjP40j^WWTN}XQh zr~JJfVW%iK{45uT-whB)+O4-HTY_b?V~%Wv>>Uu-_EIk^-IkK#0CfX-my6)?`xr+S z(zpel<%R-|f-`io0ZD@ifh&T3FH_hJo&@SyYg4SRT{dcyT3MiXt3Q5qQdNwRPwOzx z*`suKL=EUieHc1hK=_YKMi3wI@M&*4J*!IDDU`0Xcyf-V{ zy17k8iN4BfUBH$_lBH94$f$(!Otf==Elh&40HQ#C?z~u;(nX&j=_}-4Vx**n+9FJG zCFiW(yVGGOA!$PdsZ*D-2WnThhRrv$4h<;N62P}cilij0Unz2eGWd=dN^*yc0xN^{ zyf2LYvxr?8Zk|RvX3^8Mp(dvfY#=wBLXUu-&7GR#TEkP3L8ZJD9_}RA{@(wxH;G3 z9IViq#`9%Co61P_cOgx5AtwQgFs?!9qcLd$K_mXvb8BK09-s8XJkg zUf)kTQa{H$D2uP9In6^MI((yG{|wdmlu7d-6gCX9ZSbAF6r>5q zSikbvE+HpOD*K^)P|hmQ`xo)pzJ>OC@Q>G~gRF9|Cv%!y-?u8)T$`J0I7=h-!^*M4 z&N*EDHFfD?1**~CP7WsB!D+QjeyNlMQ2^}R>Qz|X*AzeNz4fcQ2_CP=!fqokL7nq) zPk)nS=a|HOPKdt@7B$67qbA7umjHzSgx63-Md1G_;zBNSX=_mwCwgJcJT?{wnJDnc-fok(Eb>~AJuoZHF z<4!c)l%KN?gK9t`Awr3SqKH^u{LdElg_VIQe@*48f3j5hE7j!hZrcBq;zUUIuT48r z0-}!>PVndZ-~bp-Z;-^7e=raqoaPDeP~K?Bs33j8&Z4I4H&`NPBv@S*DW%y3kFHDD zZxCjIr2PD%Fq1`09b{C9#ly*NDlf50FXiAjyGQ)Jd5rMHffZ&BMbm3Y6_N_eQMdU^ zb>K$Fm5ht9wW{#EqRmrw?M-VQ4}of+%F6AU7cxmm;Nw1}sgU&{S9eDEX1=>5!}eis z-~@L2EPuca$|^#91z%vo#nJX07wQo>o3`e~TRoQohr#0LHWv4Yosv z8IQF()Zn~!+8a#Z6M^h&jCnaQ8hc45Q4=E!|w;7I;8NTO; zBm@5=!hMwz;e;}8lb*Vr?Wd_`b{V(_q|z`QrOR4sGiub{F6uDVdKLo~|9q)g+9h9K zui%!mxS1Cp%>??XKNpXU26FbeQNd1n9d!mWOI9U2^7^dFxbRj3HTobYBtz>iIzOug zDl|XncvRW1w~F0N6efO78`Qhsk(a4;k3o7aQx!GO7&v^BYRS8X7!B$+3F)weYpnSsC2*6^XT{HvUBT5Y4kxd6GXPYyX85Sx|i7 zGoRJhDWPAa&yfA)J|;!}VuTjE3ni>*m|KR{r-nSer-?LO=8EH?L>MQ3<4>BI!Z&Q4 zltGiHk3tZrM+2a=Oj%OjbjSi&&p?w3thK>y->OSF;$OC`3hf>l(O1a3vTS-^O6sqL z-99W&e1IXjzD9qH5q$}v{3hKu!L@r3n+5AgY zKHMN|*W)~wD@yCwyt)&)5iF=^_xU}Q;V!?UZ8!WGAtD16%V4(QXOdI(2-z}SW&E;j zmeM$#c;rY-feticRQJLscXU5POAZft=UWoQ4bLOSLG^YHXh$osp0zI(p5@^tr$zXs zZ}Nuc_rf5R+!44rehM&;_2wtlUN0P3L|&Cy!D>9=>ih)leh_!;_d5`fXU`gtLBgh2 zkdT@H=+R$%glIvpDCssY9nGN5rsJWW{><5ZDl-j%EluIXTS9Ku+CmW`Mp1*pf~kW} zjgWFj0 z46?w90fx(|<(nlZ8mzTIOJuW$_EN7yv4~PYhQI2QNWD&K3+Rs}k$FyeSx#(Zz>2V) zjnK^~4O&VX@SegxL7iHwJ}KC)3GzNZdGpJgX$IL(fIn_&$vgTOhA;Oo$vKLpkR9k@Cp*B@P;FQP?%L)pZau^h} zy0)UZ@M&9u&;;xlo}+vsF8JnkyTmybsG^y%l|1pr=Co^4FC-GHRVYy!h69#t;Wna1 z1fce^A4N8F6)Gb6!0m6~kL>C}*|Qev#G1pSzxz-EIuTfi`UP`;Jm=0^j~FJf@c+() z((mo3$|f!FkX|nwq~)>|$QjwG5{i>l=FcvUXWqgk+8TpnS0XBTuuex$MivNW$$(N= z)ZyUAxp0NWYE31KbLBLl@5^H0Gn~rBY+Cwv^h9G4xZC4#o zLN$`)P_?HEP)j)q;w+&Xx4q(7^3}ViY48q`zj7v61V?rMeCCiJ;F{6AFKun%=AThy zp$?QZyY|9(zwk+0;%ReMEf@;{{p1L?=#rVH7qLOfHO^3;T@HFS(pC5z5|fE-gN)$h zt!;V&uTcI3JL3|A96t5wXurcUa1{<6x{W9>ur+n8HN=w@cIL-*jD_U#Sj=Mo6Dl3B+cq5W!6i zg}Swog?X{^5M!H7@=!oyjjGpu%&Se1r`DU6=DnEtzNpt#c-MO;P&B1Gykns~tnBRj z5zQvmHrgNGuuZV0S2wNaYFL{lSks=nXtuL&Iga0^j2%~xfaQJ^P2u=sJXkdJJYW;lMW$G6znRHo#xFz=d8>ZMjL zm#yi=er}rd6#pX8$0j|^NWiNzSy-OwvzA)z=!mR~~rlv+&X zsoU$6=>_?>Q*X-~-YZkw0FIexxDhlFwuK8&N(N3%zAw28`0sj|;u#8p8xV;fRApYZ zQ`uaEyfPBVOhm95v$D1TgZS0tbF#jy;^bzbr*wqVXap*$-{PS;lsB`J?|-fFZq!|| zyq|mtoT?uayl%~o($bv52x1o$1>_edpuaiCg9}(JI+@{0FrM2J3DjlFIC%YvlP5bO zx&)MQyN>l~FiyQ_t>U-N)n2T?&7n4_GwbJsG8J%CNS7Q(xZy}MCv0V@La-7*I9x>y z8{W61Nu?v)tT}}oF(2awDKeCwGCZO*H%F+UrSFnA$d?EftF=7iUOY*GCQ1{r)En5k z`61nKEL=%#{Ij=GU0G%f8^UGwK<*S+vNW`0mNXwg4*s^5cK{y?g${OH(6Zkd-eo5= z^bgfg+=h4sN{ziHH?j;$(`{zx@z=Ub5q&fFWwFcJ{$ptm7=Q{fEJvz?bdRWmau2zK ze2=MPDsO{KA2J%ObQ+Ukek+ZM-DAC>B7Lj^U3x44N~$qEWzGB~d~G@T;v%W6bZnm- zIU&BBp*=d){rj*R8=uyk>TthxQ7DUD{3a_=t{o?SWI7W^S0jnRiTqp*4ka2YGGti= zXoDh$&|nnb=JHs;WpI70x+mFm2KbVO?~!3j;*`9flAxwXqg!T?O=FqXkd)?-#Bj)t z>#&vDA^p=|)7=(38; z5E<683hXc;G|XIJu{1eSjk`URsa{63n@<}TG+Mfof@UqVZ5&U*Q5$VWSNpG1h3Y_W zMwUrLXpuF6J3S$R#3i(M4M7esi#$elz-c#yim)ZT3tm8N%N~CAuw=M&F#uxT2{6mlu%UN|(U=r8)raoc{sSZrcG4(R_`V}>tJZ6NQ$$O%}R8ehtJrR$U5?VYY9r+~etoFO4uSX*viO8jpk0*vtpRz9 zOlZ4|)aNhCaTrW&XQ^AW?>Bu!jqq7bB_XAj5@yvdXIW9VGPJcYfzwE7mK3{Ru1PpgZc7-tk$ zPVH#O%wY)_`N;rgJVcJhC^2-$&gzsIdlz86YtIxWHPs?~z%=^7#)F(OhFEO#<8j_% z%W5q+>I_9*!Uqa8vP~3{ngo4~Yzn-`Sigj6U)66m-U2E<#Fjqjsf4K%Nji*4peGsi zFefpri`mvi+W^uVHysr?F9P?RHMot}E*SG%(yjqELSD7-#KS|Dy7@S5>$MYi_#8H) z)+ZsZbzwSJ(A*I&9L!*6ark!rp>O8i79}nC0ut8X{(Xo3D;Cc8H(TI;_qikd10Meu z8lE8W#VSV%iXmybCG=yKaudko)yLVYB}0-GA}S=s^Q&{o#CNhgA8{rhuoy?^O=hwL z2!ogf=JCZ1YGGg|Zn+G$G``f_^tfa(InU{S@cu?STgE#qj*c-EcG#h+9MPgWKm=SQ z*5iWZgF!Cq@exZ=x_QfqW7(pNWC}qN_QN@gmi`K= zkF@5z^vqS}sYaqqDX&Sm9LEQPY{r?=Mf?}!rj^Aoz1BEp+9T*XAwSa#^sqy|6L64o zi3}AcLLr}i2Mac=>-7jmOWkTSRkICnG%JZ1)0%y#Ls_SeT4<-)w3FX+xdTOzct#~B1^ss?OeB5v&!{2%J zQxr4DfXNK`xDWj^r$E2{=|UXY0>D!O@3R$t$Sk@-qc7M66fb=T`D5R>9L$t6_!{aY z{`6@5*NT?^f3N62MR@&X;Yj+|!ZELP6&PWDm5~Yb`5Nn!%=2^x5H}MMfEn1H{i&Q7+Plw zbqXf@04=gG3q8DganVKbg06{E!1p>UKiqv zdSxsNR?3%bqPV8s=#sThPjyt|!8usP%}&HHT)9X;4QA9{4M|JjmytVpy`rsV2I?lU zggb~Xjnb|}hWxV7D>@|7YwiqTQ%VCuE*8llY^ zb48UE!W3L7?{JltDuvEb&#+~;;)%(NiCg}#v9y#)3gtXP4z8m@v-N!a#h~H5k&$$z z`Uw5OSOqlpt=>dIQ`MgD&=F{hw7wx2?laZ92-Fs?gjN#r89hmGI2I$~<8_+xsfMO! z2Wa-6K^$Y@Ifk0nBAtv!w*=V<`n1)^oG?>v)o^eWPX& zRyIQ7#jp6@g&)36&8|@yBrcyQZ{^CkMcf)nFy?&4#eS1X@H{d@r4yH-kCannn9grb zaqB7|SoB@vy=LJ5g<3kctel-2DF=b0bE_uBT_6pkT2EL+BVI96qJXCnf;Wp2NG%45 zaE@I?FrV&)?Qd=(N*U^{Vm&|G)n58C>81wHCVNpr5n<`k3EAo$VqGg^4#u81w!v7402R@j zB|u>ZQxtc6e_~O}N8}#TqSSA|QMA$5nU6216%>rh@G1H5>yYjI>5%<(ssFp1lcb)z z+yCNu{bA*esDkuSH9Sf<#hQl?4g^ZuAVoYBJzl_xKwIe6u-^tk#u!>!$&RBlk$WS_ z2n(U+yHMxvg{oDjhe?QIAGbz?&>bknvRPBW_2@1SR=eO!nZx$Dar@HcV65Ho@ecb< zC{x9b6*!oH3~Hw|+<@zeGl($yG5#j7g>5xNAr(cx7`DVt*pvu=3gRoIg|a`|_qFMi z(t)Rj>rulX+b;=y&LJB!uo#m%LwcZHJJ|?-9n6_~W{R^2{1zNdzEf&GV4{?$!Nyh9qmTsaN3REgUdc6 z;JuJ2j@BkyI_7p3mTRmB;IQYdkfxWb;<`}qFVK;yBExo#RcGha_=yn_j}`a>9Rf* zdjxD?7Bif&6gD)S}S2P6UC4P242^XY?ot$oF z5u`PhAeM8N_4aS zytQVfWNahtGqy5KaTcImgU;G02Aw6+`4hLR-G7|<%B?7!#4k43!hbyT zB7d{7{>ci5@ayZ33*gV)v?zX48d2^`hFGs*N~X~Z(d4ZnWQn>rbcR5H5+!9$$49q& z>B!~xh2FKb6LBXKBjlrU`@#xku2un=BN}w1F&s}!*mO-z&tLI;b5*4&2wZm{-HQ$l z*1QUDVTpNFCDU&V4FTeqCDY4uDUD8K5trJzIBAd~1tQlIaIyqbY`L<6g=wT|T7^bT zzXR86bfd1y_@!DTw~?*e=$y6`wq+q^z`uzL4a)9a0OE(@eehFPWl;F?*#Mu57Tm+Z zahmYdhPL-KI4_z*Q$2q*Z$4trOU6s~!|&nElr^$1a2juiKI#NOL;~7I;MT4%sFA++ zz?!n(i(1MekOKUkq?TDj;TY~r&v5{FUCOMk12IZpr<+#I0CkQ#-V_v>5qqNFjy9w& zfW3;XB^pzx;lMFMmB8}DMJCY1M=y1Q;f5Jh41?m6(plnF4yH^>tBO&*wMMtk{&xDb z;Q=h>vlW@~>1XoOr@Cr9daZJ--;G(laxc+!_s%+w$BHL)n*|A8O0-_<*>Fv_VQmEE z&vV#cy207`k{YVH$1M|AQFd7CDSnde;TQ@+36Usg9jTl$9PQtcm$~@(>O6z)pDDvy z0<`l5H=!;gvm97Q?Hy!!Ko`>(`r$Nqw`nbQwUpltcdKP{xyu`(Fgm%1tBx%pSs2_R zK#82-U@rlxa_=DjC_4yik0QXYRs--SvD05$jl};?+5Pv@t4y$xnV0>FPjALtC;iH4 zVHC0@9YY%#Fu~3T8H|N<_0z=@pL1H4J71f14xHXAnGxil5!`;wi#&Fm#BzwBqm!EA zdfamGKHkm#czQm>^aac=7u9P+J&rY@>t9zxVNsp9j~kUjx$Wp2T)SYsB(zl#!o3{4 z!HW(7gqL{%EL-$?m!(tcMOZqi*V?k0_$ZhWdt z&+gunP6faH!s?9)C&EX($%Gi`Ldy)J}ZW-(T8o;tu%zU~)&f z#kWa+eNHPMiAzkFMg_ZBe#WA$mIN|bp_08xcToWo(>=>l0%D#gz!{6+Xty9@YEO%$}T_tU{!<58!QG@P_MW=w{KD()TMJle! zzdco0rk;3Gf)V|N+ocIu*xZbNv~v!@aOLl=bXl)yXN(44r8^VxPJTKZj?Cev=Wi?L zJ@05wqw_Y&aCC+u=$Nd7?3`%8VGU&cM%ZI8^YdzaOq=~yGA6g z2nA2oL-T0%5aG=X(Ml^WvF7u$M@gWSpq={}a{Ks`iabLd8Zd;4Qv^l_k^S6T( z$7qts%An4004lNjn_3FYsDq8ckqF0v1xUlIT(g@Bcz|vZkW&^4Artgj>zSlmz5wt) zP`kD>-uVJU}l#h6?63g#P=0};S33Kh0<>1GJ0@EpWOxfcYPRF2)Tnc z$#>`5a8zdDJ$H^q*#+;F1{E=@nUBcRBCj0NVq`+3XTG+C4*Vn0z!|nOWcBMrJ^x48 z`)|;C1#O)4EsbRC4UN7+6s7cR2^s&3L6D_rWiw9;=bdQ`ecDGq1Y!V%R=}&HYqko) zkJp7nN1mj-R_x`1SZ^$zFlIOVq=M&{%DV=;BZ5C=#*-`VDT;kK)wOZE@$7kX#lu4b z;A)zvyYCE+!fb_PClb+4w9%jZ_0Whzi?oO*IW7eWi{7)-u&+9zJTR|V2-Th?nCeJm*|KDt`p?`!HoV$Fq_~P`{SucS6X+6*>^YYtILJD9^qBI-ed? zrQN+xw<(^Nwk3-eW%H(n=75ewrw2 zJ+Ey~ldeL!Jd5EY%mY3~rc?VfQgo!*F)^};W-EyOa*c8~TA0-}a2O_8*3K38Lujq!!kU$UjOkwP<*FB6%i$E^&@tl~yCI9N>c4Yt#co9@qN$wD@t>m`+jtb6jG z$cafQ39uTDN~$w1ec_jyb1Hcud{+pX>NN8eL4aJo8b5V>tv-C^e)@>)S{%7X8OCAN zUPp-fVxq4MI#n1eQZLbGgk`AaAY9I+!_`=9>!MKCTpI=dqA#!~mR2DD-b~->Cp5P% zXlg(ou3#0{Xo=x?YgG^&^^b8uS?#^&^D99C|4&u+*L(YKRGE;gqmi|tk)f=;jjfTr zqnVMz|Ew~3EeT9MBre2xt@_pSLiLN3dxFFPe+#p-2q8GLJUDfHqN{{SCx*H-=z2sm z@5EBr{JT7!9$cc%`UCtE1?<$;$LutR%i+t5&7AIUKNh~bs+R45YftPM`Kq{H>_^2Y z;o1OmuB*6tiR>6qFo+R`&|fMbnFR0^J2aVz*D6hYzO2Vz%3X~Z3eYRdb&<%L#WY?d zDA7rH$*He;`E3pnG^Atu{nlF|@Ow_4yE9-siGL<)CnIQ7Mj3A)h_b%{qHLc7#)I=- zPM^>tzs*E@e)~K#g-aX%qJsV#{#amJT-^$D<^Fe>> zen^Ee-5@PBu*=9hfTz5Wb>4h<#47^M_O^sTDYv)(BMVd=hO*qlGzCvWLOj=bJj4qk z6q#euQ6<;7b)=&-P>_v?Cy@ZA+eVgcvsL`WwC)A5ANxxLKYrs#&qb~gZbv=R9gS#2 zVeM_OK_sZgCZgs^gHjLO;qNoRX9xDqCoGh}5NKwHf1fyw9Gb^=D_0}CL+E7>|IH`r zLT;6emtoqhcG3#Ewng*npNNsSB|WX;`*nc)o*@5=tn;t01MRg4d#Ak9L=}v)@9$t=hkKCzHxEc+R}PvJ@NVL%iGhF1xxn8<7?md>*~{g zB-_Q`_mCAy?XD7cy!9?6L!4lZq+C)oIIWu1R;OgFWC9mC!mR`(cUq@1=x0! z7^8e`k!z-4!Xrhfg;)ECiTenmT~Iv~2%pAL3>@u-Q;37V7ez2C+NC3eVf-+XR|-G* za0}HlW!%I%p!|fFua^Zj%Zea}s>B>hrwML-(u{j1@xnQm22i`$LEY;DqH8y+i{qEa z`**@55XcAvTa_xFR^Rm6Sik5_IavLgIX4}rIm!mqF?3QLyE{q)#;|f4W8#sFyN=0{ zuWqShxgfS%oqgq`TR(t()VR1W`+Ld6afcp!)}e?GcWapytTMbL*@@59Zk>>D@7{ad4gLqZUxd&N=E0jLU3E+jdw#bisYa zRsj;W53dyhx6Tml+qmkWsEUrH1;7Tx(iSyFV5OvprPJ0j9T(8mElha@h6dnOkf0bf4&d%zz zo9y-k5gwifzU1wuhW*z zJ?vI2t!{OUM74oFiP9QzqeF|kf$ke=@nrupmB8d2KQ+1OS?a4btQe?*AL8aQnFAe` z1PvKrHh}4{Ly8&?Ya|DNjA^FFEI zQXG{g?H12S1fu-a*0m5t-eahS^;{E;A8-dHD8mT9+Pc26b*LFW{EN$BIc(R|M6GoX!nyB~cPj1~&< z)U{Qab5>q5u-X+5c!%EuVKP5f$6JwH48ND{#-qNRKL@dyn{^>5qL;PF_82THxlap* zd8Q1PamuzuIyS^Zy9taad z>@Zkz+#nzfgFQV?Oel&1DiSlKr|UHDS(y=nW;UH!w0Kvo8`BwX8l>w{!cVRf-f? z6Jf=T<^UaJ9{2&1?0KbTBG)mDsE~Q0%zyB1wfV)m*M)urD!`lTl#TBe{ifj9zgBgy zjb?KX=eFJQ1WR5#pd9J=qSKGUKu85lkC+I@4?eEb^YlgABtYB%PjQ=yT*3}J&BYc# zf3f_X${uO9KHy?7St`Z@PRjY4XW2L)9VXH)Mk9h$ZpoBovUQWtLPR^Z1h}3=qxEQ; zK8?~D#Zk|e$}iKA>&%WLCPpYUnzy@sbo1PlZOgbv0Op|QW39Qccfd#m$7QCGBS~I6IC}w479f*=X0gQZT(A*P6^v~#b#d3wpoQK%CVyq}6mjMaI<& zCdA+Dd*6^o{`h5I=hjf~xoW5N_Zg+Xu=N zlL`Jx$oi!au$%}SugIFrCyQ2zm`zHM3rs5F@&kg~FK zw!c}{ur1|IB4YK;%Gh|FuLh31+lY#1b;(Rj=}{eCrNA3yKPsh*adz^IdYGdHVOy>f zPVxuS{7F5`1ak{r2jrEjJfICHR($DBJuV_>!cK{NS8?K?^xkHN;+&lgOhku>F~D-u z5>LA7kAmxtbt0bl=C*&}DYr;zcEctsp)QEClH&M1*nlSX3wC8A%QCvX27#6B<;G7% z*ql8dD=lpr?q;@!)TK%Ugg$mn|2f9{S+-K-l+6I%6S88j1+EjEDtbI4rHslCRQwT( zm?h%`-SUU#>g7gRv}-W0I@k?L&_H|3kyJ#XBiQXUxmU>_xZp6z2TgK;xm0nw&WG0*+8OC+aiSPeiYvFKOX5KV zla!~PT4Q5(ti>wz0g}+L5RF1 zQj@yckq@fxIjoRq2^pG*f^{=yk-na z%rw9yYJLaFTy$!3z)Gl4<=0Y_;ZSDBNrnrDAmPPgJGcyQENRk)(hcKQqB6=4a5eLJ z_<>hfQ^BwlX&shJ(p;7QTvj>oPV{g*CCD+)|4|~IKjeb@a`O)SVhI*omZ~aTZArc* zl0Q&uWl}P;&qrnb#JN}t#wO<{g@x2|8-*bSVQQFgZaRPCLm7KMpei3ftLvqjNMMod zI65JV8e%W&#T1^%-3ytl@=67<7!$O~&pcu9O&=Q{_-TlW@5|b`LY7n08}EIPy*D0y z39l$PQ5W1`d+v*%8}FHWdj@uxeNcCN2yUMuMu5hu{-9(u;8az0^Pr-1_5)&H5ZPfE z<^{?F_3gC+lQ*X*i3Kgy7cl3PmE~n@jE#EjLLldrNzStL9OcWffC_HIVirbTIBcMQ zepOs)VI?cpz?Z))vEYs`@HLIN$TE+09C{eF!^2`l%ccZ#F}Nx>Gba_(8umB~%KMcD zd=D;rN6veXi&jKJDO|}1m3zR-I>$0+KP67GDth%}BtGykzarHSQdXcGXRdNn>~}z- zA5`#XRGtvq2kr+3<$IQX!S?L-!WZR*0lY$+HD`LJ1^QZo6gP_8XUR5Xz zPfTxyb_XMr5q+TR2T1ew5db*73(PY^(aJHC7cMhD5G27LwB4`t6R8os!5OfTBIx)i z9BMqUbamsDUMZZh5F9RbnkJfIN^T zkyM7V)4m(>4~6cLkXNES?laXBzCeTvuz`tp&K2ki&!xJ7K9K)_9Jjm*_N!Hy&AwK> z(@;R9MLw6%ZL~R51%l@HP$_1s93YX{XHpSxR~Zs*iHsrq+0dLbLX{^Y{l7<&ClrH;5NI!yZfk9Sc6sej0`s+5w;j6?7UO(NIii5;er0r)pz8%eJx72 zfGy9|Mwg`Vw~8VSte#U&Jyu34%#4FoluNKQpXXgtkJ6YX#0t}&!v7lC zVL?xnVb<1GtSWF+u1QVa{AJH`utcH|t zwP8>s7lLde`M3of{aQ%Q1Ge|#j%BpSH#pCkab+HoQB6+Uea?UotBu}s#TY^^*JpgQ z5~FF{9Eau1yWe5d!}Sl|G~DNe#dR*;Wvtf5Q<9%M_0p|~-YUp4Fp^l}?*vu4Z$o34 z%M#)SD-z}xD}Eu{Oh~T`dfSp@N*i8SQS$)>3xBm#m35firn;FS=2-L5-4lg&TD0}} zv%XTvu9xPL=V8=I&SKQ)Kxw-z%HGgG=bDmzBsXw!?6;#Nmsg$Drb~)Ll#zf9r}wk^ zs{Ek_d59ghsKI1kVQfa=&XIjx=y1e4QIGRw87$FWRg$BW#1}*IixYODf_^m_&dtaOB4O43B8PTHJ6#np zVcN-dHumyIHm{7!K0GAsUtslWzNGB=KH8s{-8G$rtvaZ!Z7jxJhz_m;hHt-gxSBb` zXd6DCd(vxcKij}lk(5&cGf7(51b`2Jmjwz7KlV1di!JXrU7M_)| zCn`~+=$?XiT*p%8RZS~PEF&8v)}7v)0L;`99e|XBzi8Pc101Tx(u{0k$5GOkK}}cH zlT~6wS+$?(r|HG3to~@>)^ohCLXL(-1bW6zI^5pe+{F{KaHNnts7e(P1V{MLs2WDM z!2l<@VSzR4v5I#A@99aQv{YB9c4dvX5Kb*T&KlE+(zLKwEzz$3Y*{GPhPe2iB_uW! zyjvj2nkn@Vp0iu*JJn=n?Y@`h%kY$Fu0$oZCEACCYnU4I2nlci)AFJF_zbXP<-vD% zMdm|709zsFClM+?-pirH{S2cv661S@AFw@za)zI@K(MicO69vjN?|#^;JSzQ~F9)QsxZRqJNVO&~iErQPt;RE`_Z~U%b0A zoUNBm!Yz%}mVv3@sMV0__kj-ZT2|L~ykqHYrmAf1e>TEUrjAwToaZ$*$+)3j42|+F zS#O3^ZU6lZJ{Q!iFEzR1Y-*US^Zk?-Y z;ZKqHg^u)JJH;0d(-;F`Eq+R0Y_GotLchd%zrg3+(2Kl&sjw_nuKli_Y?)Y^r%#>L zno>@7CrfHm@I$J900r6T*|ml=fY~if`73UP>bCL>eowTN(EfPX!^S^%nEHsv82!;s zreU?Hvj(G0J|(#A7+M^xwUgcKKDPL$Som8BF7?JTwfLueZ5@JD<1GQ*+CT98NY4`{ zkY+W!xrL-O(s*!r356P8hC&^R zcPZl|&hM&yb4b2qoKH$)Bak`+y`s^XFOYhLETh^!@cD}1Sg*~gUI0HOr-Tp0%-piR z;=H(3Xha>0&IT9FBKB#A!RaP_mO#l4>hnqWy$km}neVv<^*y7doUH0+WdTzxxtXWR zglYP;X}EmAr>MUhZeKPR*9XkNe9Gj@Z|JEvXtf`D`+}37iH!(zAX<(&M^-!8V|RcD zsh764eC~R9nOPN_w^u6xcH&EM3jwhPBo~g(*Ar~p!L3+P0kVd<3wzw-^59j@1N-~? z1tVMCGkc$+{MvzG3bXx?D0Jc#T}%}(9K0v?{MMZ~wgusJxid=94J&~bl_2=}7RUjP zqV{$W=?}q^0};UR?U8tr0}Qz@ba}ktrsQM(!*qK;R-H>TU=<62+hiWA&S|)U<WsaSm$( z%fCQ@^V`JApTzIUP0mItT$cQ3laK4^ZTe+;?fqkh0Rbq*aZZ>aj)uj$5P~Abb7D{m z1`6%6kIHN~h0D$e*CCtJq!4FBE{BcD$XL0cjtFGL&BAQf(dX*+o(srHsla0X3A^wj zw5fF?B{C3)!|yx%Ru@q+jw=r(4rcIfpb2=m#2^*8YdnsEfz9TQ*<&Wp9qWYQ4XuA2 z^vDI3wV$kkMBb7|6>bV8G<5*8aU05P_20XBb8)ZE;Ri!&6UtM-9Dm`_Y zb0vbb3=FwZ9YMpDOd~@*-C4{~!LPmB)}TeE_JS_$Pp$zuxljm&p`5RBqU#i4eR_o* ziVf(`H&?J#TUsdGNrBwu$Fkj!#xiV&JDo5;FD0<2iKHT&Yz}A zx2CLsnK8lT_iA2E7C)AX(Yv^Lz)G2BI4S_!yFnpS7yF1YV;D&m3f6Mj{J6c8sx)ib z;Usa`2)2}|Xwp-c@kSndVW(LlpQ$49Z+{Rhy|)?`ZTsg4onYW@oCIyXcM~TbJrA54 z-y#x6sSCDBjaWg7Q3N(i&j70*j{8XW9p@AjF%CAZwE=A?v%EM;`UBVDyJVIuApM+vky1A&wbD!yPQdW zDvf?yf@L6R2Yj5vJO?nk9QUJ*-|ePhvmki@dtXP@-l*|o-9yQ7q9RGZa{8(xnOBQH z04}G|=XG($&E{(y+3CUVSr2!>MP<@#Mc0OKAUvZ!;@?~1y5#K2^~rkK`u)c31HW0}A$%aMX#8pQK;;A3p_d*W_v#sZ%NW-~fPPi>X8y04Dv z4gV(H($KA}duek*7`cw6zpSta2*5Xxiqt*(o5e9}q+0FC`K8?IO)4i1V)4lyit!ve zP#tzv`goP|z2&6{Af5xIepx{r#*1F{OOCKAz&&#Sf5>Nrm%Q9zu}VB_nSA{-1lvBI zlCS=IU+)j`e;0%QA1dQ-L5`8DE#P}?FJ=#L_WaM?y{gVX{JcJg)AcsihWk2L;o8zt z78|zO73rn6KrQL*taKHliP4}+B3UBw*ln7+=ud5sAU}T~^WKQ+-~IsB1wsxgmwu-l z$z)7`BYo>Rl2;mS(KyatzG zi~G}jqYh7^Ik|&9Q_cI+tbY0~EcT4uezlz{;a!psk<#{Z;;r#i+M(`s`tg@_2wUL2 z?}=M#z;`lWOFvpa`cWIGa`gq?`jkT}uWOfgea-vRL2GqJ$yUN;+PzLUdv<008Z;=q zUF%0r)%mEniW<&EaBwTe?0IKO)zD4Wda54B&xz?yj8_EC9(d54?7Z@KH4X4U;<6Lt zk`|oSP3pcG2@mx&^|{C~&5+*Ey)kBmOUC4u@_rrLNl_>MX>1zCZ3+|0OhOS*okZWv z0)pwGLX($L44)z&=*1De6Y#I3W8YILZ|{6+hj6(ti!5eK@sC1tC2tm^H~ZtZ?w(!c zB0cHUu8qrAxR$v+dpXz^qd){ib2(R^rG&zDC&pM7c>TegU@2LyjH6@LGTUxCMtqa* z;Al<9Yh-=&3~Y4Any#*i{@opPcFzi!2s4QEo2cIYuP#<#lL36Cg|Fb?b<0kdQ>dHG z5P1nt9^lkHseO4btW;&3pb@|e6zB9@GM+@xpF7Z4DE3r+pCGzYE{MLc1x}Ib3D#r{ z$#i_7_W~mY8^xgEXh|cWnSh=}Lf+^jOY7d zplDWlBUFuulCrUKVqlT!Ihc&4&N3%ILb;^BJ}F@=s>Y)$R-1z8D^z`Oa(?XG%M>#< zJRx!NXNy5~c~UAD8#gFP+fQS3J)RWHQ81KQ12n_XGG{pKcOcw%yMjIH21#b5P`_T7 zgy#o@-AqDL6xqYCFq?4sbuHLV#+gPcKL0L^1(bw>&~y1py?!9+V6#&XlXeMt;3 zOq5 z5yPq_IegSE%X-pm~woQ5UG+8xS zt+QI@+LC8eHL*;b+pZG=Qx^mUFd+K;u70LgvjqlLQ$qE>SGYE~ws_d=N;b7{dp2$J zJ00=i_rA*IIr5p=|4u>6?0&0T`2(8J-^J|KA6XbRggL$I11sb6fQWA9^&S!vej|ky zzoUc|zpKK`A3Jls>%`AXv?~RbpL)aPlZT)n<&~A=&NXsAB6tmsyas$&G zndOT_jVkrrUJ8AH?=rPUSzD@fWmJ2~*oF~$plqCLi;C7G?!_3UZU2juuoJKAbSi-F zu1aanXSb{HZUwF@jftr45Hc#_6FtSa9WZ6v9`^V+ZFOh8bd6pd{E*03mZk%?)p|LI z)Wol#=HdAytin}0#Kq^45@A_3z+z(B%ua)~uz22Fs80QE``XRP1BzDIasn^3+%w6U zRik`*pfQEaR%G}n{rUZOazAom~#wCc(MogB^A<`@)*x6ypCm6fr-HPuyvOHxxv7W|i z(U&z*Nj9|sXm^Cw4oI-sZL2{G8Zxf7b1Je&-(Q-L4DPwik@-_w7SA zkL*{pQ|{xZ)jxy!j@u^l43_^S^Guc>PWm1-13{*Ha0f{s{^A&N>e-YTpq=;^F6A0} zL|{6ccYyBfTN~`F#3p`j+#-r$0caU8la!;kywTnnQFEc!*SOz9MZHmO*&CFbh@7!@ z`ZMdypqq4U1NOVG8d~*Tz0ZtRMpNk;TR;7p2h3qd4$NT}I@F+-PW9SbH}M*x_K*Or zJC+9ea=;17U-{aiy4_|dttw$AxOeY)mV0gv^DEBNC98+ zghJfGd@=066me;A*30x}r0wG*_xdmMIp_TmUO{)(8u0-OaS0_CX5lvAp;bi~!EU4{ zLAHzKmV(E64!R9Hr@A;Uyjj%kHCmTn4GX6*<5Bmi>nBhiuMsURNiCA}zu2x}=m|L% zR_K>f+?4*@VuxOo4c2ygiRldBGX<6Dxldr0aw2%@d7jyAmMX-6wInS}^9WyBQR9?( ztR_J&(n%}1sOne~nMx4+tPCMea~QFG<99x57kB&j$`StMfP_16!~P zM#2kBZu3dw4)@d|O8{q}3ET<_#4T!|x`q>AC-h-4hjP7lvb z#Gx#Jx;65?u91STL7khaaE{CGk@A4W$`$v^n}|I*^j|}1V{`kp_ji%7gNxUm0M>a2;vK$Qwz)MysgKp8&}cQz!igID z4dEYXe>}0%#_hYQhhYBS1OC5irG)=|WB-4e=lp|K`;YXh|LF3i$#VY)l?mH^;C8~6 z)p-?zK^4}PPHKJbO{@Y|6BdRBQ%bQpEUR7~Y9QIDMD!0}`2rVf1tLud z@DIw+Dz8MH48?8a>B{sp|FiNqvdsYhgHw~9IKG4EfN^F5Odp+Al~$E*5!5;RLh=Fz z^;AFSJE|JF-T^c)YT1V)PK~x+8=)9)#I9>f?~rvsod(u;-PeE(C4Rp}9yJ_kWw~c3 zZ{2+Uo#+y}4RY~Aw0CpU-8Zn|HLvT6`xnkRXItxIgfQ0&8pCyxTA)N~-#VP;$BN|= zINUFE`(y?Z)xu?-8alKsxm@h(aJdzS_Qa8+%hJqqFVpPISL?F%(loyoWxQ2cVAqNX z&_ZUPX5-YKXK^dwtVy9P7jCa!ii?sw464k!<5@$ps?~Ign~*$8Dtb?=IhjAp(%V;u zA<^wn9Vf%4CY)e(G?6v2M8kS5zf2Euf87dOh|DG5^*~sa{jC2x@ihle_F8pII6!Dr z5B~ZHn^x$qEZimb8!1M487c~YzDMd!_kv4QjyJe3`e5iM-K|q(`~<+Kh{&Wl4GQiB zyNtIt!6(w_1$zG$uIx}}a@?JA;t8|7TRUnv1V5lyDk>zdjFK4uNE%K;l{4z(NfF_( zIJ8zEB6wPFWFAGpwkwC?yEip&m@{~%YVrUtXO5cs+?&Z9Dt9W=>6TujrJ5NYBk79r zq4`Zn@!PszHEW6Fpan}dcgh^=nFl;;gE$>?L?;tmu>x2kv;RQF86%dRJuUK zGm6-YjEanvU%d5MxTpbN4o2PDtx=krZsxVnbesE{gJYrXya49ZKz6h4b~>2jdvcm~*WXV4 z@_V@F3czk{%INP5w91)xS`P@Cfy?Q`a9&Lq(BfKj;S6VRd4|q*=45!n=B7VxAN>K| zbkf=Hz{v|K+FKB+$3t1e__LMw%RF}bue!z}ZQaVtNb8(ywFP zqc#rA#*L@VdK%#k;)14DoA4vd<#7}eH8;$~uoWa&2<=vy^^ZTb*T45mh7ue+(cRtJ z9VT2GE63}xT)+q4U>ivlYq&wzGK_*;8 z?7I$}T5->KHhZ)-)_cU_*r^4W85P7|r;(P1F!-+Eg);LNtW@IQ>aM~}1>4u2Z5Ny{ z|BibDTfr(v^i}>Ex*0*$ojF_Ou$?2~n^!Y)h7G;3Dy5Tf6c~@T&f8BT3n~B@n}uRJ zn(PfLvC+I0$eq%Avb6U6a)^{^wLLnoSa!ndiNrdPLscx6SHRV_Qp?hxcUl_^=d|5} zMwerCS{h_)2Iz9!0HFh#9f1@H>6~zhGgXs1@PRVh7*4?#x((y{v47A|2Y)W*@Po; zmL~3+D^kP{juCrBl^5}wxlJM^-46C)zDH-2IU}B0PADQUR3#u%)B8j@ch@ex=8wfb zA^boNx3nMUf}J$t?1<(jo`7yQM45HiIO`@Q!X-=( zL`g6+uM-fF>1s{#%u+*v0Ve2-v98<@!08tsQ}|CtQ>+%QEGHy?pM27iOotN#(4{x776iq2LJ z&Q<_VC08@o|Lj?2adPq?Ot7K(C+{iB1%&Mbs=^09Y+-0hl!+P)F@n^TnUg7#D;KL> z`+zu6iO1kiLj`mmy&s=uK4AiS#bWQUS%fQLWfU;k?l6RF-rkl&^)3ydQZKz810A<` z?GMzUNxE7zf7xkfSVdbS2@ycfWs(C2rz>W6Px?*uv|Q`*z6 zda5&D^Xv}4wj{_`A)t@9)?BUD$6d(&Z`u%h%lB2gRrJWOq!=hm*LN03bRtG5Wl=8%$I6_d7UYsC)2gT;UHdM@e`Fum+59kZ(caCO*`zSxlHCYTf7s6IdNM(x4)w z0uf#K3Tlj0q7zsh#2h^v+`b2-k!et~mx!@E$#YnmQ1Q{ zaYEK?nmFcS(BF2Ie!8_XP}ca&+8*f)a^9flRoPbL?gIL znJM}XwyTYIOc4{kMRVxqJsI>zauY9~V=4m!P7h2CcL|ba+bx ze6k97Wo3&?QxIjkS2vmi;T1+(Z|I{Q;Noz52B?=%LNnT|kBp6hjE}PeU3fA0$^`AS z-d=4TwvY~GQRN*fZcs*f;qT9uXhZziCe1p8sO6sid+?gX9pHI}HkQ(){$W?>St~mV zr1pKk;X{q^=wNLiH}3%>R_8)2bm>St@cr+|Zr5m}FVx6@a%7MbF=Pl!^Ttf-91BV9 zKM&GV_lIV+1c;&YE_I`mY!I6@4iJZ1z|;P(n2-bg&uXnOwTi@ zW^w9a+em5nC=tKp+U6crQk#>Dz&?=@^~vVrk&f~g5fRiQD@$nxpQMsthtMj|6r@(< z0eCoSINWt6t&N#upEnLj3E|2U+?|;A#c#G;EIN+T^0$|8&9bCdm)q@uag7oi6X?=rZD21Fyjhq*rC(4X5JpWWLh z>-I%HePfR_sPkO9k7I*9!v5wScxHSepWi|pOZa2<@XMn$rdtR6M~a^H&flxY??SEo z-%|Ac6>JFp`^xkG1RMX&sZ-6)0rfjnz}~xaBUipnrgTYJRiC<9=bV^<_$n0bSQtjK za8_Njtf}o{_GFTqM<<%;h73D4a#+*^m_RP%c`T!uEK&3qw!m|8%+a*Gg?iwiZP!VM z#dOaT*Nn>*7mNSr$HvtU=ZvM<*nKL%ZU{348|=O+ayeTwVV%=~9U6bJ5yLdKi##2s zlD<&po%Lf7bMbggsmG%+ayl!Z>SCZhXOKrqS8A_Hu&Di;?;s^8dlM|+p!WI*jf?Br z(~+aZKIxgsvNa^OQh9B;F@H~YcvP)F^bmuk6Q?~LL>sG(_EjNh{a(92BeTtnb)Ipk z`3V&`@Bvqd22Ku2d6iZo2r+Uvbh;OFUt47coLgLLwTcpEQF+8D86{v*y9;#;Hj=3S zhn*U2?8YSa`nVcQOE>y3<$yU~Rj8one2i?OMjg6E)8*@jgi4(5;|hs*q(V!z|9xD8 z>4EJ)=7e5W$3SKrwO+p(a$eS+-TY&6JNax?(u!%WWyI5~ANWPR$XApuAf5D%ducXz zFhg3z9Is_Zwd9Cql~TzsPpwjtXFnUpLXY8!zO!_vz@yrnOK1&?f5L{zuC2eA{ZgGz zC9fsrZ=S^=figtdzFBvX35=I(cSs&7IY4&=E^zC{N#BKf$$3q!gg&*@f>O#NO-@Ta z4%kCxgvgA%L16^7%(c6EQf_lzX%GmnEtP5U9M8@ly zzJttWnfWVQf?8Vwn}M5tP28b!M}~p6C~E`nP9FjLGfa6g%EcdK18hDo$0R(P1=Xvu zAqX~`#X}ACh1o+fmx^&ypnk5FXlY7z33{AI{e1=8+akCt-!I=*)v}TJW1_E;>dLsF zvuD&n?knoPI*v@r=u z-pE-LYIzP2(w3JZeTSwl1t!rj&OD+uvmp;BrAb-CfF67H+-^{71UEyf0A&QG{uWCk?p+3S~(==}k{4(UoM2klU zKApnS_ot+cYZ3c6h7GPTmaRil1&i+<|8-O(&SzO=2$Iey=g$aTXSCMq514x+J+#$C zejddky13xPDg$A)1!B{$AAE(`QIRbxb8zJA%M^PX^Lxj4qUXXHnow0n1Y;zE4>(^?ZK@cs1QTNa)3KU!<@{riflY-au~;j}j~`^PXR zW9IqaN48v*?-Wu&M830jr@i)+G;}9AE2sn+6$(i-VX=}w*rZ;NI`gWV`dBB6*pVZv9a_5@gQlIu{t4twGa`N<^jQ%gJZ%k^07iVa z)F@G7-|D8AmI|+{6|@{fzkZr8rd6&pwqM!%>6uIettf<85aJxborSLr#9qHwNOyf8 z@Fq^zX7p>3JbQQApx>@K$_mNT)Dt$aqjIz8MXOwN>P$P?@&#gCkp)y6-Bk5N;lB5* zd2oR6Bv=6mULoR|w~$U4eoVUQ0Z+c^0WP!-6i>IXOH!UP$0!g${++$Fr;QK5qFF$U zmujq8><;h_>|jWLK4N*FPnk)yPr$e{NT99fC@1{A|nFiOmrshc$SE!Y!_ShrrH z*S@gVNth}sYi%bY4WYcWyfD|X!Kl%*v(fl^@|51bnw*+4WzKrNcD&U3eMfiol;?1} z?yry!q!|0uqZ#So)d2lQUf*Vr^;XJ72m?{dMLK1~5$C}Kgz$V#hx@QA#CtF>aGd;i zqj48W>p6~f+jTz!L(D_9jNs0Q8~wh0qU12?wxcP?a5Lle(pF=ORn=WJ}@DS#TeMxWqRt5&g|1x+Ee2)atEuce9S zPu~_84RM2Hl~kXWQb%UE#t4rr7j9%G&ivMexv@$G-*{$Gng=K97Ou3YsjVD#Wi6x` zt!*R)ceMy#p<}uhUYxu8h>4V6u@Xy8l%#)b2Tw{|Sp_&+Ik^}b*ZA0yd`&CM;#{Gk ztzATzaqbe%MqP2iVX980o$ixZF4Gw_nWsG41d|45UffLzPb>Ey6eJ3?>nt^;*CJM( z)TP$xS9T1J%ti4AhX}rI;xGFsc=sFi9-bmbHk%E{g0yISC6>Vm&;A=tYSc(2q-{qH z8Ki%90d)^ zwbVc$CZURUlChR8zDj+*ze{-$a6L&;!Hor&h@G?ZQjxX_xp zWf>oY0BD^>)@|85oo^`>9HY*}nVnJe6h{Z49Fi7omiB{6s49Eq%a^cxIg@MnT^y*9 zpv$$1rTX3~@R%vg#fWAJ9(|cxYrOD-~cC)2M401zF7*VY!Oww}jY%Fx4mBnjy zlJ6zS)&g!a9(Q8htN zyHr;8)^jq!)!vNXI~Wtk=jn*|Gmh)@Ef&K$te6HF_ku8_O=dKovjB(PDf5KX?BUjl zX;t?YZTyf4jPZ$OGcW2HB}XW}Xz*_qHSzii6wcu7r1w=~9s9d|g6DG9ue}N(?l1H5 zsIR(*eSIIH!qZ~T@RNk>{>i~8b5CPv2{Np}?c~3Ejl5F%;o!GQBa1$DKtOzHC}Wlf zOK`H*)+h`4b8D6p%?2T^=2zj}3dK`%xT=mlYt=j`5_f_9>+u;)FOqupIqC5PcUVmR zIcFX-ODXb2Pf4IPx@r{@bg=yIok-M=qQ;d|g_c>i$~@CcrrW30CI=&<_IeYR@t)k1 zjyZ0(KAvLmiScBQN;4s1#d~={iVE@H95BUHhXIJYGuZySV2$cwr`L*$VcWFAYC-OB z6!=0J^%Zy{*^eGwe+#Ev+i^EM2^`M4=Ui;e0Fnavek{kl5Te*KDc`D4J1AXS9798- z=yh#b(+6&_iH5wU&q+_|_0c+^H4W`X5#EcPHrDua!FmEP5{#U9;MQsvdQB0LC(-o_*fulBM(tpnO;BoELG4;W@d{hOf75{I z$oHC^7j>G2*SE_89?z|za{^d6L!flb;d^-?^HJ;?=P38ZP0ZJj+GF`Kr%k4j;LLCE z4QaYp#TQytqHUBS@mQTHvW_X{XnT2N6a(4C$EeyixNDmMDSy~>QzPsOn`2rbIMa?7 zxp9JnuW4*G86$*4eKYV39g2hn$d|Cp-gc?jAGOBW9&^3BXf=LQN^AlAV+0)ca?bjI z`7_ugEkDw()3h=~VOnjj7S~^w=Ckk?hx>YXI!+5>q|b}=~P_9ldK z$_o;ig2IV?#TfA1P@EiDoE&A)SHqkN5L=7=8^GA};b#cRc@m-nW=x5CEo`oukY=jG)GSa{Q+V0Bv_S`o z%F;IIH^!iDkyaxEU<7g)j$>v6*QhfUTCfpGF4gmcVi}S4;Hv{guTBd=Thv>Q3S+d9 z2>^KY5sssQGrmRQN;#NHQ8$v2HO&v!&y!Z1{3LL3PJNl-v`T7@yw%G?#012VHaAH{ zlWpUMjI1q&rx_QY3#qP_j2VSbWs9qXaq(ol`yN!wp6Va>YQdakJ{XIzPvR;yr=bHM z?UerV8|qZyVwB^;!Ub_jftgSR!cM_Sr($TOCXiLLEDk(f7k6EsT(@GX&VMH#bw_5& zX2pm;QekJ|H6{9;XX}mL!WF|aVyp}7DUUzyOT%HeWXh?E1igrwmp^__IUHIA+G35J zR;8?S2$T7fhwTFWHgMGpsQnLn@gMS?QuTG}Pta#Z=Im?~0Gm55vkXFVW|ojsKc{z2 zEV086f{k9){PN_kz69On+IC^Dr0rV4N*P2YL|WGq-Z~eYq08b7rE_|E&ZtTlX}uw^ zq02a-NebduMkNK!VwaJVS?JJ@3`EV@`0-&{1oi~T0_)>GF;HPTPgf>-MVWSADr;3d zAVq~Av;%BaKt?UVU1}tIRZvzf$~fL=Qx%3wgdxX!3oV!&%$uO_1a*ApW6A9!ZbSIl z*b8a#J*1I6IW9?@>#nMx)bD+4^>^CNi2a-Umu_PVA?=JfT%^Fw^}aZS=&-U{4sUhS9EGAo412hG&5|ZStoEpTRAT4Biq-JiN%5wqqhOe zM(KLdf2;`ft(H2((7n}ZB&oQilQg<3?8*EbCI*Va-h29z+-lUUr%556gR|zJiX9=@ zbfVDV3Le)46Nc>N*@`cVcDkfgo)XF~r=T}vzjIM)s+J8aZ`XL$d0h0|4DhS*ZY6-u zu2t0S+N~j@Gb?4Z&t+33w2w~SsdLM4NP8qVhK7m0(@Ia$xM$tUoocT(-+Yh$z{ctF z#t-2w0(mS7p;n5-92zNKBGIZM6vS<#ol?@PBdl+#NfGzxEF9yiza-hne~*u5eC-jv zFT6{1MWtOo^I@M3{tsjC931(&eGgA;JDJ!vC$??dwkPaxVoz+_b~3T;Ol;32ljQBW z=jxnW@Ar4Q>Qmi+byYw8Y^}BT+F#meIS*qG>-4`FAXE-qX)T3?DN3B3=>&<5KRYR{ zYf{qTU4$4i!*u4+Yc}dOLvgp|+j&-SYA#SU_#NpZVzQq+`0MiS<-pS_MdKQtW*U>T zNxo-_7m@HT%$I6R=SpSu;XcqURUFkybp>!dkhqto*85^M@~RE&QQSe#!mnGbUyG^d zM7mvLq)hVy+ui!FEOQV95BM+H3w$5d=&x;XedRYwp8WB*XZ9C)NYQQHl3T&E|JeQj zPdN&51uRc1asHcb_$%ng@&7JSg&o{}i@^McY51e0FpKGe?PvNpc(uJGUJ(@h1HK(Q zM<@@tXmXOiIj^`d;$CD>!sQwSxId9TJb1uqBlc74^2-f)FSA)V_Aoq}aOr95V#W@m zh6E_>5WSMe>JcBYw5?7Ni~3sL&{8u+;_8$&{k*tV1H+&iGDq`RTWk0|otO3aT*lhZ z7S+2Re4{1$HcX16FqK^@qpgBwrHuCs;=mp5pO@`e$e{2aj)>EMn_)(npZ}qO;+Vz^ zT?YKAo51Hk+{<4N<8M&XDrQb@zsq&ge-SXOf1E~@`X4RT=C)UB>uz(cQmrtKIw~JO zmCbLgCCtqM3fY}dd&!}X|^ z)4e*K1fBhoMu^9}W}Ow8ij&-cJ_oPNV?keQ;p7L%u5+&buXPC9SZpj?Rd*Y$=(jNk z3+7q9>&B9z55C>?_8TnH&AXK;De6lwhTf$%_sG$_Od2%Y;F4&C=DEyuIGXNdZc4&z zrI`Zt>xCH5)6lxHMoa<=d&M8WB!1b8X!ntsJ1+cTmv6MzPZXlbzd^O_tq_7QO}Kb# zafa8YzCt-)c)}BC#NCLdy|{TV%WU!O71z?jQ{8)xIUEI_a;9bv1AvB~pKGiy0RhK@ zSy#BHhF`Pm2KYt_Au53(2B6(!(7(0rM{9CsP3f{DRUVbYpWZ8s;jFDR(LCjeN{CU) zEErgHQ&t{*EO2rgLgF2OFDEgSBn(FtDU-2X1MXD~y*e5eKiQbZ-)(LFKKo{tTN!Dn zuSjt(Al(=ovE^ZjLOxlp>RP-nb@m|-8Ev3=BjY^VRqODQ^q@fb=gVgBug{#I^{#vt zL=LslydPAN1o@?&5%!o*1>~z>9KAuRYN6Dr-VontAGoq}m5K4Lk*>*_+*SdAl51Hm zg>-DH;_>TVii}m}@qqH3Z!^qD#x72LD;=ZP5=<;X<{@;)N zVvz5+{ocl)2m_fBD&#)I)g@MBo zm;fnHTb-bInpcK7q`cuPB7$}MJ##X>H}-GOkht%dJnszm@pe0GW~QV#u#<=3yd@m? z52IJ;iwP>q&ue1SZ|YXgXg^~We=5*#B+6a7s)%BnKrwr_tT%37wq`S=Po2fK)V#Ot zKi8R`SBt?cqYYm=7UEL%gir+|jGMc9=N~&phdrWsW}K>^uk*7JB)@r^QsXkO9akpg zhqQ-R?EK+2rHbmZhJakj?w`1lzp}J{Lp(K_EEjO)p_DVJKILU-_WODV4|L&+eqgo| zuTe%XHe@5RFp>0w!g*Cu9_G7c=LLnKh{#aX8|EH(#8_-hc>xP=B3D$D_i-|rds@Iz z6HY7711n?)y-DAWN22V#_&~QJAs07GrK{QCJZm*-LpHXZ3lSjrb~Xs}z+UfywH6Vd zB*h{0GJf|To-;3zSq zj?($2skpCEkOLj{y;dR;a6?V1@MrJa*2(g*M)4Byqjx(}HaQH}`*g8-j8S=%TvYg$ zx+>$UyU$%Sq{$Jj5)TLYQcd%;G#9n5w~!L6A>>Z*)8-K&^rwbU#ReL(YU$mfIGC?8 zt>QL0=5`aaP(QvLD%4IA*5XcHrM+l#F(kTfX_-}7r>iNI_ynzdd zc%XAdcY`<9AJW6O+L*8Vpb{xYEv-x^Raco`X&edyFTUs&+H-PEgbXquxY8KBK_XIi z__Kpz`$%0SEoIr-%U*EJDFkC}&VR4zEN0~vuOI8nk#A3b+$O*4KryskRKSwmG9n>! z(w!eEhC6nWTn#Zcz^0j2zfs3+x99u!AtvoRy32FN?Ua2}<#;Prx+j@ro%}}jPw4ze zK!IWsgVKu|F#Beab>@n1yg#V|U$Z^uehMdp(oG|@U7+rJ@;`dCcG%c2K82Smdk*yS zrk|9Nmq#&bZ-EHmWY0TV#eUUaN1zUHWKAJ$C9G3~aJAPWfp$I+vmRORu8`EB%`6Bj z^B634@Uh!QRj|`qztOLOXrl)c!RBBJ`k35xwct#S(_U^o*~_lW=}4#oNwAX_Xr&6j zkx*OIZA86l|3t7HJaeSpN?+P(b5v%a*4%f_8e??5ed9@i*kPv|Z^t`rmK)6Mu|)le zPpm2N$w2>1X_a6OiVUSG=6-9pN1Ai*l=|^M~6SrckGP1S_;X za0ZDq4acV7+(8?Gcz-?Bm^|N0p)_u^Kov7AglO)7t+y0{2W(&(ClCM*4{q4`6LFzX#k6D1s?AX#YRS;l3jWo9I zxP;KeluX+>OFRt>aM125Up~Sa26oC`XSBT#YFv34}1Z#nPfvSI!G5)Jj z2>ib@QaRv6o7KM(Fm)qaH?zOcCaO9L3yR2Z#Xi&>s&NoXoq>^K40}PI0}qI$qJvQI z5#4Db+(uEG?(^;lZy1DrifGKzB&duxs9z}FsNCeKbwmx8_$SiSS??wv?nkCu2tS}R z$BW^`n8gn`0^0VqGJBYMY08DNM(4f-inLZs;FE~h|?6VWcN(BLQ0_jtrHF`andi78>2 zYhlW@05_-SD6FTL8&bcCPa;;@^fPWFs||mX6>toyho?&vn$nKJ$fSgSWDiNmAtsa9 z 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

tyv*0yP}nk-pv4zbBt@DbR|3V7ZQ73LXi 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 kF-h#lNtCW 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 literal 0 HcmV?d00001 diff --git a/main.nf b/main.nf index 778966e04..96f185545 100644 --- a/main.nf +++ b/main.nf @@ -9,57 +9,32 @@ ---------------------------------------------------------------------------------------- */ -def helpMessage() { - // TODO nf-core: Add to this help message with new command line parameters - log.info nfcoreHeader() - log.info""" - - Usage: - - The typical command for running the pipeline is as follows: - - nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker - - Mandatory arguments: - --input [file] Path to input data (must be surrounded with quotes) - -profile [str] Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, test, awsbatch, and more - - Options: - --genome [str] Name of iGenomes reference - --single_end [bool] Specifies that the input is single-end reads - - References If not specified in the configuration file or you wish to overwrite any of the references - --fasta [file] Path to fasta reference - - Other options: - --outdir [file] The output directory where the results will be saved - --publish_dir_mode [str] Mode for publishing results in the output directory. Available: symlink, rellink, link, copy, copyNoFollow, move (Default: copy) - --email [email] Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits - --email_on_fail [email] Same as --email, except only send mail if the workflow is not successful - --max_multiqc_email_size [str] Threshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) - -name [str] Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic - - AWSBatch options: - --awsqueue [str] The AWSBatch JobQueue that needs to be set when running on AWSBatch - --awsregion [str] The AWS Region for your AWS Batch job to run on - --awscli [str] Path to the AWS CLI tool - """.stripIndent() -} +log.info Headers.nf_core(workflow, params.monochrome_logs) -// Show help message +//////////////////////////////////////////////////// +/* -- PRINT HELP -- */ +////////////////////////////////////////////////////+ +def json_schema = "$projectDir/nextflow_schema.json" if (params.help) { - helpMessage() + def command = "nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker" + log.info NfcoreSchema.params_help(workflow, params, json_schema, command) exit 0 } -/* - * SET UP CONFIGURATION VARIABLES - */ +//////////////////////////////////////////////////// +/* -- VALIDATE PARAMETERS -- */ +////////////////////////////////////////////////////+ +if (params.validate_params) { + NfcoreSchema.validateParameters(params, json_schema, log) +} + +//////////////////////////////////////////////////// +/* -- Collect configuration parameters -- */ +//////////////////////////////////////////////////// // Check if genome exists in the config file if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" + exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(', ')}" } // TODO nf-core: Add any reference files that are needed @@ -73,22 +48,15 @@ if (params.genomes && params.genome && !params.genomes.containsKey(params.genome params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } -// Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name -custom_runName = params.name -if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - custom_runName = workflow.runName -} - // Check AWS batch settings if (workflow.profile.contains('awsbatch')) { // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + if (!params.awsqueue || !params.awsregion) exit 1, 'Specify correct --awsqueue and --awsregion parameters on AWSBatch!' // Check outdir paths to be S3 buckets if running on AWSBatch // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + if (!params.outdir.startsWith('s3:')) exit 1, 'Outdir not on S3 - specify S3 Bucket to run on AWSBatch!' // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (params.tracedir.startsWith('s3:')) exit 1, "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." + if (params.tracedir.startsWith('s3:')) exit 1, 'Specify a local tracedir or run without trace! S3 cannot be used for tracefiles.' } // Stage config files @@ -105,13 +73,13 @@ if (params.input_paths) { Channel .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } + .ifEmpty { exit 1, 'params.input_paths was empty - no input files supplied' } .into { ch_read_files_fastqc; ch_read_files_trimming } } else { Channel .from(params.input_paths) .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } - .ifEmpty { exit 1, "params.input_paths was empty - no input files supplied" } + .ifEmpty { exit 1, 'params.input_paths was empty - no input files supplied' } .into { ch_read_files_fastqc; ch_read_files_trimming } } } else { @@ -121,11 +89,15 @@ if (params.input_paths) { .into { ch_read_files_fastqc; ch_read_files_trimming } } +//////////////////////////////////////////////////// +/* -- PRINT PARAMETER SUMMARY -- */ +//////////////////////////////////////////////////// +log.info NfcoreSchema.params_summary_log(workflow, params, json_schema) + // Header log info -log.info nfcoreHeader() def summary = [:] if (workflow.revision) summary['Pipeline Release'] = workflow.revision -summary['Run Name'] = custom_runName ?: workflow.runName +summary['Run Name'] = workflow.runName // TODO nf-core: Report custom parameters here summary['Input'] = params.input summary['Fasta Ref'] = params.fasta @@ -152,8 +124,6 @@ if (params.email || params.email_on_fail) { summary['E-mail on failure'] = params.email_on_fail summary['MultiQC maxsize'] = params.max_multiqc_email_size } -log.info summary.collect { k,v -> "${k.padRight(18)}: $v" }.join("\n") -log.info "-\033[2m--------------------------------------------------\033[0m-" // Check the hostnames against configured profiles checkHostname() @@ -180,13 +150,13 @@ Channel.from(summary.collect{ [it.key, it.value] }) process get_software_versions { publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, saveAs: { filename -> - if (filename.indexOf(".csv") > 0) filename + if (filename.indexOf('.csv') > 0) filename else null - } + } output: file 'software_versions_mqc.yaml' into ch_software_versions_yaml - file "software_versions.csv" + file 'software_versions.csv' script: // TODO nf-core: Get all tools to print their version number here @@ -207,14 +177,14 @@ process fastqc { label 'process_medium' publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, saveAs: { filename -> - filename.indexOf(".zip") > 0 ? "zips/$filename" : "$filename" - } + filename.indexOf('.zip') > 0 ? "zips/$filename" : "$filename" + } input: set val(name), file(reads) from ch_read_files_fastqc output: - file "*_fastqc.{zip,html}" into ch_fastqc_results + file '*_fastqc.{zip,html}' into ch_fastqc_results script: """ @@ -242,8 +212,12 @@ process multiqc { file "multiqc_plots" script: - rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + rtitle = '' + rfilename = '' + if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { + rtitle = "--title \"${workflow.runName}\"" + rfilename = "--filename " + workflow.runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" + } custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time """ @@ -262,7 +236,7 @@ process output_documentation { file images from ch_output_docs_images output: - file "results_description.html" + file 'results_description.html' script: """ @@ -282,7 +256,7 @@ workflow.onComplete { } def email_fields = [:] email_fields['version'] = workflow.manifest.version - email_fields['runName'] = custom_runName ?: workflow.runName + email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete email_fields['duration'] = workflow.duration @@ -389,28 +363,9 @@ workflow.onComplete { } - -def nfcoreHeader() { - // Log colors ANSI codes - c_black = params.monochrome_logs ? '' : "\033[0;30m"; - c_blue = params.monochrome_logs ? '' : "\033[0;34m"; - c_cyan = params.monochrome_logs ? '' : "\033[0;36m"; - c_dim = params.monochrome_logs ? '' : "\033[2m"; - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_reset = params.monochrome_logs ? '' : "\033[0m"; - c_white = params.monochrome_logs ? '' : "\033[0;37m"; - c_yellow = params.monochrome_logs ? '' : "\033[0;33m"; - - return """ -${c_dim}--------------------------------------------------${c_reset}- - ${c_green},--.${c_black}/${c_green},-.${c_reset} - ${c_blue} ___ __ __ __ ___ ${c_green}/,-._.--~\'${c_reset} - ${c_blue} |\\ | |__ __ / ` / \\ |__) |__ ${c_yellow}} {${c_reset} - ${c_blue} | \\| | \\__, \\__/ | \\ |___ ${c_green}\\`-._,-`-,${c_reset} - ${c_green}`._,._,\'${c_reset} - ${c_purple} nf-core/chipseq v${workflow.manifest.version}${c_reset} - -${c_dim}--------------------------------------------------${c_reset}- - """.stripIndent() +workflow.onError { + // Print unexpected parameters - easiest is to just rerun validation + NfcoreSchema.validateParameters(params, json_schema, log) } def checkHostname() { @@ -419,15 +374,15 @@ def checkHostname() { def c_red = params.monochrome_logs ? '' : "\033[1;91m" def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" if (params.hostnames) { - def hostname = "hostname".execute().text.trim() + def hostname = 'hostname'.execute().text.trim() params.hostnames.each { prof, hnames -> hnames.each { hname -> if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.error "====================================================\n" + + log.error '====================================================\n' + " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + - "============================================================" + '============================================================' } } } diff --git a/nextflow.config b/nextflow.config index eee65030b..50fcf4274 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,13 +11,13 @@ params { // Workflow flags // TODO nf-core: Specify your pipeline's command line flags genome = false - input = "data/*{1,2}.fastq.gz" + input = null + input_paths = null single_end = false outdir = './results' publish_dir_mode = 'copy' // Boilerplate options - name = false multiqc_config = false email = false email_on_fail = false @@ -34,6 +34,9 @@ params { 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' // Defaults only, expecting to be overwritten max_memory = 128.GB @@ -57,10 +60,21 @@ try { } profiles { - conda { process.conda = "$projectDir/environment.yml" } + conda { + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud = 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 // 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 @@ -68,11 +82,33 @@ profiles { docker.runOptions = '-u \$(id -u):\$(id -g)' } singularity { + docker.enabled = false singularity.enabled = true + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false singularity.autoMounts = true } podman { + singularity.enabled = false + docker.enabled = false podman.enabled = true + shifter.enabled = false + charliecloud = 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_full { includeConfig 'conf/test_full.config' } diff --git a/nextflow_schema.json b/nextflow_schema.json index 8641ae9a6..64563832a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,12 +104,12 @@ "move" ] }, - "name": { - "type": "string", - "description": "Workflow name.", - "fa_icon": "fas fa-fingerprint", - "hidden": true, - "help_text": "A custom name for the pipeline run. Unlike the core nextflow `-name` option with one hyphen this parameter can be reused multiple times, for example if using `-resume`. Passed through to steps such as MultiQC and used for things like report filenames and titles." + "validate_params": { + "type": "boolean", + "description": "Boolean whether to validate parameters against the schema at runtime", + "default": true, + "fa_icon": "fas fa-check-square", + "hidden": true }, "email_on_fail": { "type": "string", @@ -153,6 +153,13 @@ "default": "${params.outdir}/pipeline_info", "fa_icon": "fas fa-cogs", "hidden": true + }, + "show_hidden_params": { + "type": "boolean", + "fa_icon": "far fa-eye-slash", + "description": "Show all params when using `--help`", + "hidden": true, + "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." } } }, @@ -176,6 +183,7 @@ "description": "Maximum amount of memory that can be requested for any single job.", "default": "128.GB", "fa_icon": "fas fa-memory", + "pattern": "^[\\d\\.]+\\s*.(K|M|G|T)?B$", "hidden": true, "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" }, @@ -184,6 +192,7 @@ "description": "Maximum amount of time that can be requested for any single job.", "default": "240.h", "fa_icon": "far fa-clock", + "pattern": "^[\\d\\.]+\\.*(s|m|h|d)$", "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" } @@ -218,6 +227,12 @@ "hidden": true, "fa_icon": "fas fa-users-cog" }, + "config_profile_name": { + "type": "string", + "description": "Institutional config name.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, "config_profile_description": { "type": "string", "description": "Institutional config description.", From ed4529ecdb228d1c77ba8c35e768def7695cc343 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 19 Mar 2021 13:07:26 +0000 Subject: [PATCH 166/538] Template update for nf-core/tools version 1.13.1 --- .github/workflows/branch.yml | 12 ++++++++++-- Dockerfile | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index d737ff7c6..0615f2af9 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -23,11 +23,19 @@ jobs: uses: mshick/add-pr-comment@v1 with: message: | + ## This PR is against the `master` branch :x: + + * Do not close this PR + * Click _Edit_ and change the `base` to `dev` + * This CI test will remain failed until you push a new commit + + --- + Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the ${{github.event.pull_request.base.repo.full_name }} `master` branch. + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `master` branch. The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.base.repo.full_name }} `dev` branch. + Because of this, PRs to `master` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. Note that even after this, the test will continue to show as failing until you push a new commit. diff --git a/Dockerfile b/Dockerfile index 4ade659e6..b107fa319 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.13 +FROM nfcore/base:1.13.1 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" From c55e19a756625fb8f643110c8b387a822c59a806 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 23 Mar 2021 15:27:17 +0000 Subject: [PATCH 167/538] Template update for nf-core/tools version 1.13.2 --- .github/workflows/ci.yml | 2 +- .github/workflows/linting.yml | 57 ++++++++++++++++++++++++++++++++- Dockerfile | 2 +- bin/markdown_to_html.py | 0 bin/scrape_software_versions.py | 0 lib/NfcoreSchema.groovy | 2 +- 6 files changed, 59 insertions(+), 4 deletions(-) mode change 100644 => 100755 bin/markdown_to_html.py mode change 100644 => 100755 bin/scrape_software_versions.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e38792283..d37db83e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['20.04.0', ''] + nxf_ver: ['20.04.0', '21.03.0-edge'] steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 58e281df6..fcde400ce 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -19,6 +19,34 @@ jobs: run: npm install -g markdownlint-cli - name: Run Markdownlint run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## Markdown linting is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install `markdownlint-cli` + * On Mac: `brew install markdownlint-cli` + * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) + * Fix the markdown errors + * Automatically: `markdownlint . --config .github/markdownlint.yml --fix` + * Manually resolve anything left from `markdownlint . --config .github/markdownlint.yml` + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + + YAML: runs-on: ubuntu-latest steps: @@ -29,7 +57,34 @@ jobs: - name: Install yaml-lint run: npm install -g yaml-lint - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml") + run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## YAML linting is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install `yaml-lint` + * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Fix the markdown errors + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Fix any reported errors in your YAML files + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + + nf-core: runs-on: ubuntu-latest steps: diff --git a/Dockerfile b/Dockerfile index b107fa319..5bbd3e687 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.13.1 +FROM nfcore/base:1.13.2 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py old mode 100644 new mode 100755 diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py old mode 100644 new mode 100755 diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 78e8c65d7..54935ec81 100644 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -219,7 +219,7 @@ class NfcoreSchema { } } } - if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').containsKey(ignore_param)) { + if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').keySet().contains(ignore_param)) { rawSchema.get("properties").remove(ignore_param) } if(rawSchema.keySet().contains('required') && rawSchema.required.contains(ignore_param)) { From b16d4a9e49436b2d10b68ceb3651370d4b4ebe4f Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 25 Mar 2021 18:17:25 +0000 Subject: [PATCH 168/538] Template update for nf-core/tools version 1.13.3 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5bbd3e687..bdf7c5b01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.13.2 +FROM nfcore/base:1.13.3 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" From 0cd4788381c90cc66dd257fd94e325aff203e69f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 26 Apr 2021 13:53:26 +0200 Subject: [PATCH 169/538] feat: remove social preview image to use GitHub OpenGraph --- assets/nf-core-chipseq_social_preview.png | Bin 48953 -> 0 bytes assets/nf-core-chipseq_social_preview.svg | 446 ---------------------- 2 files changed, 446 deletions(-) delete mode 100644 assets/nf-core-chipseq_social_preview.png delete mode 100644 assets/nf-core-chipseq_social_preview.svg diff --git a/assets/nf-core-chipseq_social_preview.png b/assets/nf-core-chipseq_social_preview.png deleted file mode 100644 index 57778defb25d945e84ca4b1ead9f3ecfd270c4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48953 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - ChIP-seq peak-calling, QC and differential analysis pipeline - chipseq - - - - - - - - - - - - - - - - - - - - - - - - - From 769a517e57d5e2bc7e5ac457e83d399111c45268 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 11 May 2021 11:09:47 +0000 Subject: [PATCH 170/538] Template update for nf-core/tools version 1.14 --- .github/PULL_REQUEST_TEMPLATE.md | 7 +++-- .github/workflows/ci.yml | 5 ++- Dockerfile | 2 +- README.md | 2 +- lib/NfcoreSchema.groovy | 54 +++++++++++++++++--------------- main.nf | 4 +-- nextflow.config | 16 +++++----- nextflow_schema.json | 6 ++-- 8 files changed, 52 insertions(+), 44 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f1d89ef72..f782cf452 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,14 +10,15 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) --> + ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint .`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d37db83e3..6123bcbc2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,9 @@ on: release: types: [published] +# Uncomment if we need an edge release of Nextflow again +# env: NXF_EDGE: 1 + jobs: test: name: Run workflow tests @@ -20,7 +23,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['20.04.0', '21.03.0-edge'] + nxf_ver: ['20.04.0', ''] steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/Dockerfile b/Dockerfile index bdf7c5b01..be6f50b2f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nfcore/base:1.13.3 +FROM nfcore/base:1.14 LABEL authors="Philip Ewels" \ description="Docker image containing all software requirements for the nf-core/chipseq pipeline" diff --git a/README.md b/README.md index 9be9fefca..1f0ee33a7 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ## Quick Start -1. Install [`nextflow`](https://nf-co.re/usage/installation) +1. Install [`nextflow`](https://nf-co.re/usage/installation) (`>=20.04.0`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 54935ec81..52ee73043 100644 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -112,8 +112,14 @@ class NfcoreSchema { } // unexpected params def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam)) { - unexpectedParams.push(specifiedParam) + def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } + def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !expectedParamsLowerCase.contains(specifiedParamLowerCase)) { + // Temporarily remove camelCase/camel-case params #1035 + def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} + if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ + unexpectedParams.push(specifiedParam) + } } } @@ -191,11 +197,11 @@ class NfcoreSchema { // Remove an element from a JSONArray private static JSONArray removeElement(jsonArray, element){ - def list = [] + def list = [] int len = jsonArray.length() - for (int i=0;i hnames.each { hname -> if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.error '====================================================\n' + + log.error "${c_red}====================================================${c_reset}\n" + " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + - '============================================================' + "${c_red}====================================================${c_reset}\n" } } } diff --git a/nextflow.config b/nextflow.config index 50fcf4274..1dd986558 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,12 +25,13 @@ params { plaintext_email = false monochrome_logs = false help = false - igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_base = 's3://ngi-igenomes/igenomes' tracedir = "${params.outdir}/pipeline_info" igenomes_ignore = false custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" hostnames = false + config_profile_name = null config_profile_description = false config_profile_contact = false config_profile_url = false @@ -65,7 +66,7 @@ profiles { singularity.enabled = false podman.enabled = false shifter.enabled = false - charliecloud = false + charliecloud.enabled = false process.conda = "$projectDir/environment.yml" } debug { process.beforeScript = 'echo $HOSTNAME' } @@ -94,7 +95,7 @@ profiles { docker.enabled = false podman.enabled = true shifter.enabled = false - charliecloud = false + charliecloud.enabled = false } shifter { singularity.enabled = false @@ -129,21 +130,22 @@ env { // 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.html" + file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" } report { enabled = true - file = "${params.tracedir}/execution_report.html" + file = "${params.tracedir}/execution_report_${trace_timestamp}.html" } trace { enabled = true - file = "${params.tracedir}/execution_trace.txt" + file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" } dag { enabled = true - file = "${params.tracedir}/pipeline_dag.svg" + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" } manifest { diff --git a/nextflow_schema.json b/nextflow_schema.json index 64563832a..278dfb9eb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -62,7 +62,7 @@ "igenomes_base": { "type": "string", "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes/", + "default": "s3://ngi-igenomes/igenomes", "fa_icon": "fas fa-cloud-download-alt", "hidden": true }, @@ -183,7 +183,7 @@ "description": "Maximum amount of memory that can be requested for any single job.", "default": "128.GB", "fa_icon": "fas fa-memory", - "pattern": "^[\\d\\.]+\\s*.(K|M|G|T)?B$", + "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", "hidden": true, "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" }, @@ -192,7 +192,7 @@ "description": "Maximum amount of time that can be requested for any single job.", "default": "240.h", "fa_icon": "far fa-clock", - "pattern": "^[\\d\\.]+\\.*(s|m|h|d)$", + "pattern": "^(\\d+\\.?\\s*(s|m|h|day)\\s*)+$", "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" } From e201a4e56d60f6486f441f8389b02a6992fe0d85 Mon Sep 17 00:00:00 2001 From: kevinmenden Date: Tue, 13 Jul 2021 10:39:12 +0200 Subject: [PATCH 171/538] Template update for nf-core/tools version 2.0 --- .editorconfig | 24 + .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 5 +- .github/PULL_REQUEST_TEMPLATE.md | 3 +- .github/workflows/awsfulltest.yml | 52 +- .github/workflows/awstest.yml | 50 +- .github/workflows/ci.yml | 19 +- .github/workflows/linting.yml | 21 +- .github/workflows/push_dockerhub_dev.yml | 28 - .github/workflows/push_dockerhub_release.yml | 29 - .gitignore | 1 - .github/markdownlint.yml => .markdownlint.yml | 2 + CITATIONS.md | 32 + Dockerfile | 13 - README.md | 71 +- assets/samplesheet.csv | 3 + assets/schema_input.json | 39 + assets/sendmail_template.txt | 36 +- bin/check_samplesheet.py | 146 +++ bin/markdown_to_html.py | 91 -- bin/scrape_software_versions.py | 44 +- conf/base.config | 94 +- conf/igenomes.config | 843 +++++++++--------- conf/modules.config | 32 + conf/test.config | 47 +- conf/test_full.config | 38 +- docs/README.md | 4 +- docs/images/mqc_fastqc_adapter.png | Bin 0 -> 23458 bytes docs/images/mqc_fastqc_counts.png | Bin 0 -> 33918 bytes docs/images/mqc_fastqc_quality.png | Bin 0 -> 55769 bytes docs/output.md | 63 +- docs/usage.md | 214 ++++- environment.yml | 15 - lib/Headers.groovy | 43 - lib/NfcoreSchema.groovy | 528 +++++------ lib/NfcoreTemplate.groovy | 266 ++++++ lib/Utils.groovy | 47 + lib/WorkflowChipseq.groovy | 59 ++ lib/WorkflowMain.groovy | 94 ++ main.nf | 405 +-------- modules.json | 14 + modules/local/functions.nf | 68 ++ modules/local/get_software_versions.nf | 33 + modules/local/samplesheet_check.nf | 31 + modules/nf-core/modules/fastqc/functions.nf | 68 ++ modules/nf-core/modules/fastqc/main.nf | 47 + modules/nf-core/modules/fastqc/meta.yml | 51 ++ modules/nf-core/modules/multiqc/functions.nf | 68 ++ modules/nf-core/modules/multiqc/main.nf | 35 + modules/nf-core/modules/multiqc/meta.yml | 39 + nextflow.config | 300 ++++--- nextflow_schema.json | 255 +++--- subworkflows/local/input_check.nf | 42 + workflows/chipseq.nf | 141 +++ 54 files changed, 2811 insertions(+), 1884 deletions(-) create mode 100644 .editorconfig delete mode 100644 .github/workflows/push_dockerhub_dev.yml delete mode 100644 .github/workflows/push_dockerhub_release.yml rename .github/markdownlint.yml => .markdownlint.yml (90%) create mode 100644 CITATIONS.md delete mode 100644 Dockerfile create mode 100644 assets/samplesheet.csv create mode 100644 assets/schema_input.json create mode 100755 bin/check_samplesheet.py delete mode 100755 bin/markdown_to_html.py create mode 100644 conf/modules.config create mode 100755 docs/images/mqc_fastqc_adapter.png create mode 100755 docs/images/mqc_fastqc_counts.png create mode 100755 docs/images/mqc_fastqc_quality.png delete mode 100644 environment.yml delete mode 100644 lib/Headers.groovy mode change 100644 => 100755 lib/NfcoreSchema.groovy create mode 100755 lib/NfcoreTemplate.groovy create mode 100755 lib/Utils.groovy create mode 100755 lib/WorkflowChipseq.groovy create mode 100755 lib/WorkflowMain.groovy create mode 100644 modules.json create mode 100644 modules/local/functions.nf create mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/local/samplesheet_check.nf create mode 100644 modules/nf-core/modules/fastqc/functions.nf create mode 100644 modules/nf-core/modules/fastqc/main.nf create mode 100644 modules/nf-core/modules/fastqc/meta.yml create mode 100644 modules/nf-core/modules/multiqc/functions.nf create mode 100644 modules/nf-core/modules/multiqc/main.nf create mode 100644 modules/nf-core/modules/multiqc/meta.yml create mode 100644 subworkflows/local/input_check.nf create mode 100644 workflows/chipseq.nf diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..afb20bb1e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_size = 4 +indent_style = space + +[*.{yml,yaml}] +indent_size = 2 + +# These files are edited and tested upstream in nf-core/modules +[/modules/nf-core/**] +charset = unset +end_of_line = unset +insert_final_newline = unset +trim_trailing_whitespace = unset +indent_style = unset +indent_size = unset + +[/assets/email*] +indent_size = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 81a0933ea..af4dba190 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -74,7 +74,7 @@ If you wish to contribute a new step, please use the following coding standards: 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. 9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yaml`. +10. Add a new test command in `.github/workflow/ci.yml`. 11. If applicable add a [MultiQC](https://https://multiqc.info/) module. 12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. 13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7e6f4d86a..dbc527cc8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -18,7 +18,7 @@ Please delete this text and anything that's not relevant from the template below I have checked the following places for your error: - [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/nf-core/chipseq/usage) +- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/chipseq/usage) ## Description of the bug @@ -51,13 +51,12 @@ Have you provided the following extra information/files: ## Nextflow Installation -- Version: +- Version: ## Container engine - Engine: - version: -- Image tag: ## Additional context diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f782cf452..8a29e2412 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,8 +16,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint .`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 3f1420d3b..906aa559c 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,46 +1,34 @@ name: nf-core AWS full size tests # This workflow is triggered on published releases. -# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It can be additionally triggered manually with GitHub actions workflow dispatch button. # It runs the -profile 'test_full' on AWS batch on: - workflow_run: - workflows: ["nf-core Docker push (release)"] - types: [completed] + release: + types: [published] workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS full tests if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job + - name: Launch workflow via tower + uses: nf-core/tower-action@master # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-chipseq \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + } + profiles: '[ "test_full", "aws_tower" ]' + diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 83bf06058..6fc417220 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,42 +1,28 @@ name: nf-core AWS test -# This workflow is triggered on push to the master branch. -# It can be additionally triggered manually with GitHub actions workflow dispatch. -# It runs the -profile 'test' on AWS batch. +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch on: workflow_dispatch: - - -env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - - jobs: - run-awstest: + run-tower: name: Run AWS tests if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + - name: Launch workflow via tower + uses: nf-core/tower-action@master + with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-chipseq \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + } + profiles: '[ "test", "aws_tower" ]' + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6123bcbc2..1e8f2eba4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,28 +23,11 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['20.04.0', ''] + nxf_ver: ['21.04.0', ''] steps: - name: Check out pipeline code uses: actions/checkout@v2 - - name: Check if Dockerfile or Conda environment changed - uses: technote-space/get-diff-action@v4 - with: - FILES: | - Dockerfile - environment.yml - - - name: Build new docker image - if: env.MATCHED_FILES - run: docker build --no-cache . -t nfcore/chipseq:dev - - - name: Pull docker image - if: ${{ !env.MATCHED_FILES }} - run: | - docker pull nfcore/chipseq:dev - docker tag nfcore/chipseq:dev nfcore/chipseq:dev - - name: Install Nextflow env: CAPSULE_LOG: none diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fcde400ce..13b4fc818 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,7 @@ jobs: - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint - run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + run: markdownlint . # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -35,8 +35,8 @@ jobs: * On Mac: `brew install markdownlint-cli` * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) * Fix the markdown errors - * Automatically: `markdownlint . --config .github/markdownlint.yml --fix` - * Manually resolve anything left from `markdownlint . --config .github/markdownlint.yml` + * Automatically: `markdownlint . --fix` + * Manually resolve anything left from `markdownlint .` Once you push these changes the test should pass, and you can hide this comment :+1: @@ -46,6 +46,20 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false + EditorConfig: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v1 + with: + node-version: "10" + + - name: Install editorconfig-checker + run: npm install -g editorconfig-checker + + - name: Run ECLint check + run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) YAML: runs-on: ubuntu-latest @@ -84,7 +98,6 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - nf-core: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/push_dockerhub_dev.yml b/.github/workflows/push_dockerhub_dev.yml deleted file mode 100644 index 828dc0fa8..000000000 --- a/.github/workflows/push_dockerhub_dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: nf-core Docker push (dev) -# This builds the docker image and pushes it to DockerHub -# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) -on: - push: - branches: - - dev - -jobs: - push_dockerhub: - name: Push new Docker image to Docker Hub (dev) - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/chipseq' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Build new docker image - run: docker build --no-cache . -t nfcore/chipseq:dev - - - name: Push Docker image to DockerHub (dev) - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/chipseq:dev diff --git a/.github/workflows/push_dockerhub_release.yml b/.github/workflows/push_dockerhub_release.yml deleted file mode 100644 index 69cfe042a..000000000 --- a/.github/workflows/push_dockerhub_release.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: nf-core Docker push (release) -# This builds the docker image and pushes it to DockerHub -# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) -on: - release: - types: [published] - -jobs: - push_dockerhub: - name: Push new Docker image to Docker Hub (release) - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/chipseq' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Build new docker image - run: docker build --no-cache . -t nfcore/chipseq:latest - - - name: Push Docker image to DockerHub (release) - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/chipseq:latest - docker tag nfcore/chipseq:latest nfcore/chipseq:${{ github.event.release.tag_name }} - docker push nfcore/chipseq:${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index aa4bb5b37..5124c9ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ work/ data/ results/ .DS_Store -tests/ testing/ testing* *.pyc diff --git a/.github/markdownlint.yml b/.markdownlint.yml similarity index 90% rename from .github/markdownlint.yml rename to .markdownlint.yml index 8d7eb53b0..9e605fcfa 100644 --- a/.github/markdownlint.yml +++ b/.markdownlint.yml @@ -1,6 +1,8 @@ # Markdownlint configuration file default: true line-length: false +ul-indent: + indent: 4 no-duplicate-header: siblings_only: true no-inline-html: diff --git a/CITATIONS.md b/CITATIONS.md new file mode 100644 index 000000000..89046a380 --- /dev/null +++ b/CITATIONS.md @@ -0,0 +1,32 @@ +# nf-core/chipseq: Citations + +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) + +> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. + +## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/) + +> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. + +## Pipeline tools + +* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +## Software packaging/containerisation tools + +* [Anaconda](https://anaconda.com) + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. + +* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + +* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index be6f50b2f..000000000 --- a/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM nfcore/base:1.14 -LABEL authors="Philip Ewels" \ - description="Docker image containing all software requirements for the nf-core/chipseq pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create --quiet -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-chipseq-1.3.0dev/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-chipseq-1.3.0dev > nf-core-chipseq-1.3.0dev.yml diff --git a/README.md b/README.md index 1f0ee33a7..21f112264 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,69 @@ # ![nf-core/chipseq](docs/images/nf-core-chipseq_logo.png) -**ChIP-seq peak-calling and differential analysis pipeline.**. +[![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) +[![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.04.0-brightgreen.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](https://bioconda.github.io/) -[![Docker](https://img.shields.io/docker/automated/nfcore/chipseq.svg)](https://hub.docker.com/r/nfcore/chipseq) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/chipseq) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/chipseq) +[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) +[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction -**nf-core/chipseq** is a bioinformatics best-practise analysis pipeline for +**nf-core/chipseq** is a bioinformatics best-practice analysis pipeline for ChIP-seq peak-calling and differential analysis pipeline.. -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible. +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + + +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). + +## Pipeline summary + + + +1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) +2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Quick Start -1. Install [`nextflow`](https://nf-co.re/usage/installation) (`>=20.04.0`) +1. Install [`Nextflow`](https://nf-co.re/usage/installation) (`>=21.04.0`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: - ```bash + ```console nextflow run nf-core/chipseq -profile test, ``` - > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! - ```bash - nextflow run nf-core/chipseq -profile --input '*_R{1,2}.fastq.gz' --genome GRCh37 + ```console + nextflow run nf-core/chipseq -profile --input samplesheet.csv --genome GRCh37 ``` -See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. - -## Pipeline Summary - -By default, the pipeline currently performs the following: - - - -* Sequencing quality control (`FastQC`) -* Overall pipeline run summaries (`MultiQC`) - ## Documentation -The nf-core/chipseq pipeline comes with documentation about the pipeline: [usage](https://nf-co.re/chipseq/usage) and [output](https://nf-co.re/chipseq/output). - - +The nf-core/chipseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/chipseq/usage), [parameters](https://nf-co.re/chipseq/parameters) and [output](https://nf-co.re/chipseq/output). ## Credits nf-core/chipseq was originally written by Philip Ewels. -We thank the following people for their extensive assistance in the development -of this pipeline: +We thank the following people for their extensive assistance in the development of this pipeline: @@ -73,9 +75,12 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations - + + +An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. + You can cite the `nf-core` publication as follows: > **The nf-core framework for community-curated bioinformatics pipelines.** @@ -83,7 +88,3 @@ You can cite the `nf-core` publication as follows: > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). - -In addition, references of tools and data used in this pipeline are as follows: - - diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv new file mode 100644 index 000000000..5f653ab7b --- /dev/null +++ b/assets/samplesheet.csv @@ -0,0 +1,3 @@ +sample,fastq_1,fastq_2 +SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz +SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, diff --git a/assets/schema_input.json b/assets/schema_input.json new file mode 100644 index 000000000..a024fd708 --- /dev/null +++ b/assets/schema_input.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/chipseq/master/assets/schema_input.json", + "title": "nf-core/chipseq pipeline - params.input schema", + "description": "Schema for the file provided with params.input", + "type": "array", + "items": { + "type": "object", + "properties": { + "sample": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Sample name must be provided and cannot contain spaces" + }, + "fastq_1": { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + }, + "fastq_2": { + "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz$" + }, + { + "type": "string", + "maxLength": 0 + } + ] + } + }, + "required": [ + "sample", + "fastq_1" + ] + } +} diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index f46cdb701..1da35e63f 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -15,15 +15,15 @@ Content-ID: Content-Disposition: inline; filename="nf-core-chipseq_logo.png" <% out << new File("$projectDir/assets/nf-core-chipseq_logo.png"). - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' ) %> + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> <% if (mqcFile){ @@ -37,15 +37,15 @@ Content-ID: Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" ${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} """ }} %> diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py new file mode 100755 index 000000000..a47ce7e57 --- /dev/null +++ b/bin/check_samplesheet.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python + +# TODO nf-core: Update the script to check the samplesheet +# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + +import os +import sys +import errno +import argparse + + +def parse_args(args=None): + Description = "Reformat nf-core/chipseq samplesheet file and check its contents." + Epilog = "Example usage: python check_samplesheet.py " + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument("FILE_IN", help="Input samplesheet file.") + parser.add_argument("FILE_OUT", help="Output file.") + return parser.parse_args(args) + + +def make_dir(path): + if len(path) > 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise exception + + +def print_error(error, context="Line", context_str=""): + error_str = "ERROR: Please check samplesheet -> {}".format(error) + if context != "" and context_str != "": + error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( + error, context.strip(), context_str.strip() + ) + print(error_str) + sys.exit(1) + + +# TODO nf-core: Update the check_samplesheet function +def check_samplesheet(file_in, file_out): + """ + This function checks that the samplesheet follows the following structure: + + sample,fastq_1,fastq_2 + SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz + SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz + SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, + + For an example see: + https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + """ + + sample_mapping_dict = {} + with open(file_in, "r") as fin: + + ## Check header + MIN_COLS = 2 + # TODO nf-core: Update the column names for the input samplesheet + HEADER = ["sample", "fastq_1", "fastq_2"] + header = [x.strip('"') for x in fin.readline().strip().split(",")] + if header[: len(HEADER)] != HEADER: + print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) + sys.exit(1) + + ## Check sample entries + for line in fin: + lspl = [x.strip().strip('"') for x in line.strip().split(",")] + + # Check valid number of columns per row + if len(lspl) < len(HEADER): + print_error( + "Invalid number of columns (minimum = {})!".format(len(HEADER)), + "Line", + line, + ) + num_cols = len([x for x in lspl if x]) + if num_cols < MIN_COLS: + print_error( + "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), + "Line", + line, + ) + + ## Check sample name entries + sample, fastq_1, fastq_2 = lspl[: len(HEADER)] + sample = sample.replace(" ", "_") + if not sample: + print_error("Sample entry has not been specified!", "Line", line) + + ## Check FastQ file extension + for fastq in [fastq_1, fastq_2]: + if fastq: + if fastq.find(" ") != -1: + print_error("FastQ file contains spaces!", "Line", line) + if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): + print_error( + "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", + "Line", + line, + ) + + ## Auto-detect paired-end/single-end + sample_info = [] ## [single_end, fastq_1, fastq_2] + if sample and fastq_1 and fastq_2: ## Paired-end short reads + sample_info = ["0", fastq_1, fastq_2] + elif sample and fastq_1 and not fastq_2: ## Single-end short reads + sample_info = ["1", fastq_1, fastq_2] + else: + print_error("Invalid combination of columns provided!", "Line", line) + + ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } + if sample not in sample_mapping_dict: + sample_mapping_dict[sample] = [sample_info] + else: + if sample_info in sample_mapping_dict[sample]: + print_error("Samplesheet contains duplicate rows!", "Line", line) + else: + sample_mapping_dict[sample].append(sample_info) + + ## Write validated samplesheet with appropriate columns + if len(sample_mapping_dict) > 0: + out_dir = os.path.dirname(file_out) + make_dir(out_dir) + with open(file_out, "w") as fout: + fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") + for sample in sorted(sample_mapping_dict.keys()): + + ## Check that multiple runs of the same sample are of the same datatype + if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): + print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) + + for idx, val in enumerate(sample_mapping_dict[sample]): + fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") + else: + print_error("No entries to process!", "Samplesheet: {}".format(file_in)) + + +def main(args=None): + args = parse_args(args) + check_samplesheet(args.FILE_IN, args.FILE_OUT) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py deleted file mode 100755 index a26d1ff5e..000000000 --- a/bin/markdown_to_html.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import argparse -import markdown -import os -import sys -import io - - -def convert_markdown(in_fn): - input_md = io.open(in_fn, mode="r", encoding="utf-8").read() - html = markdown.markdown( - "[TOC]\n" + input_md, - extensions=["pymdownx.extra", "pymdownx.b64", "pymdownx.highlight", "pymdownx.emoji", "pymdownx.tilde", "toc"], - extension_configs={ - "pymdownx.b64": {"base_path": os.path.dirname(in_fn)}, - "pymdownx.highlight": {"noclasses": True}, - "toc": {"title": "Table of Contents"}, - }, - ) - return html - - -def wrap_html(contents): - header = """ - - - - - -

- - - """ - return header + contents + footer - - -def parse_args(args=None): - parser = argparse.ArgumentParser() - parser.add_argument("mdfile", type=argparse.FileType("r"), nargs="?", help="File to convert. Defaults to stdin.") - parser.add_argument( - "-o", "--out", type=argparse.FileType("w"), default=sys.stdout, help="Output file name. Defaults to stdout." - ) - return parser.parse_args(args) - - -def main(args=None): - args = parse_args(args) - converted_md = convert_markdown(args.mdfile.name) - html = wrap_html(converted_md) - args.out.write(html) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index f2d0a5cf2..884897195 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -1,36 +1,18 @@ #!/usr/bin/env python from __future__ import print_function -from collections import OrderedDict -import re +import os -# TODO nf-core: Add additional regexes for new tools in process get_software_versions -regexes = { - "nf-core/chipseq": ["v_pipeline.txt", r"(\S+)"], - "Nextflow": ["v_nextflow.txt", r"(\S+)"], - "FastQC": ["v_fastqc.txt", r"FastQC v(\S+)"], - "MultiQC": ["v_multiqc.txt", r"multiqc, version (\S+)"], -} -results = OrderedDict() -results["nf-core/chipseq"] = 'N/A' -results["Nextflow"] = 'N/A' -results["FastQC"] = 'N/A' -results["MultiQC"] = 'N/A' +results = {} +version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] +for version_file in version_files: -# Search each file using its regex -for k, v in regexes.items(): - try: - with open(v[0]) as x: - versions = x.read() - match = re.search(v[1], versions) - if match: - results[k] = "v{}".format(match.group(1)) - except IOError: - results[k] = False + software = version_file.replace(".version.txt", "") + if software == "pipeline": + software = "nf-core/chipseq" -# Remove software set to false in results -for k in list(results): - if not results[k]: - del results[k] + with open(version_file) as fin: + version = fin.read().strip() + results[software] = version # Dump to YAML print( @@ -44,11 +26,11 @@
""" ) -for k, v in results.items(): +for k, v in sorted(results.items()): print("
{}
{}
".format(k, v)) print("
") # Write out regexes as csv file: -with open("software_versions.csv", "w") as f: - for k, v in results.items(): +with open("software_versions.tsv", "w") as f: + for k, v in sorted(results.items()): f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index 41dac7b60..467dd2fed 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,51 +1,57 @@ /* - * ------------------------------------------------- - * nf-core/chipseq Nextflow base config file - * ------------------------------------------------- - * A 'blank slate' config file, appropriate for general - * use on most high performace compute environments. - * Assumes that all software is installed and available - * on the PATH. Runs in `local` mode - all jobs will be - * run on the logged in environment. - */ +======================================================================================== + nf-core/chipseq Nextflow base config file +======================================================================================== + A 'blank slate' config file, appropriate for general use on most high performance + compute environments. Assumes that all software is installed and available on + the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. +---------------------------------------------------------------------------------------- +*/ process { - // TODO nf-core: Check the defaults for all processes - cpus = { check_max( 1 * task.attempt, 'cpus' ) } - memory = { check_max( 7.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + // TODO nf-core: Check the defaults for all processes + cpus = { check_max( 1 * task.attempt, 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } - errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } - maxRetries = 1 - maxErrors = '-1' - - // Process-specific resource requirements - // NOTE - Only one of the labels below are used in the fastqc process in the main script. - // If possible, it would be nice to keep the same label naming convention when - // adding in your processes. - // TODO nf-core: Customise requirements for specific processes. - // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors - withLabel:process_low { - cpus = { check_max( 2 * task.attempt, 'cpus' ) } - memory = { check_max( 14.GB * task.attempt, 'memory' ) } - time = { check_max( 6.h * task.attempt, 'time' ) } - } - withLabel:process_medium { - cpus = { check_max( 6 * task.attempt, 'cpus' ) } - memory = { check_max( 42.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } - } - withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } - memory = { check_max( 84.GB * task.attempt, 'memory' ) } - time = { check_max( 10.h * task.attempt, 'time' ) } - } - withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } - } - withName:get_software_versions { - cache = false - } + errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } + maxRetries = 1 + maxErrors = '-1' + // Process-specific resource requirements + // NOTE - Please try and re-use the labels below as much as possible. + // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. + // If possible, it would be nice to keep the same label naming convention when + // adding in your local modules too. + // TODO nf-core: Customise requirements for specific processes. + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 12.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } + withLabel:process_medium { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 36.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + cpus = { check_max( 12 * task.attempt, 'cpus' ) } + memory = { check_max( 72.GB * task.attempt, 'memory' ) } + time = { check_max( 16.h * task.attempt, 'time' ) } + } + withLabel:process_long { + time = { check_max( 20.h * task.attempt, 'time' ) } + } + withLabel:process_high_memory { + memory = { check_max( 200.GB * task.attempt, 'memory' ) } + } + withLabel:error_ignore { + errorStrategy = 'ignore' + } + withLabel:error_retry { + errorStrategy = 'retry' + maxRetries = 2 + } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 31b7ee613..855948def 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,421 +1,432 @@ /* - * ------------------------------------------------- - * Nextflow config file for iGenomes paths - * ------------------------------------------------- - * Defines reference genomes, using iGenome paths - * Can be used by any config that customises the base - * path using $params.igenomes_base / --igenomes_base - */ +======================================================================================== + Nextflow config file for iGenomes paths +======================================================================================== + Defines reference genomes using iGenome paths. + Can be used by any config that customises the base path using: + $params.igenomes_base / --igenomes_base +---------------------------------------------------------------------------------------- +*/ params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + // illumina iGenomes reference file paths + genomes { + 'GRCh37' { + fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + } + 'GRCh38' { + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'GRCm38' { + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" + } + 'TAIR10' { + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" + mito_name = "Mt" + } + 'EB2' { + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + } + 'UMD3.1' { + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" + mito_name = "MT" + } + 'WBcel235' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" + mito_name = "MtDNA" + macs_gsize = "9e7" + } + 'CanFam3.1' { + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" + mito_name = "MT" + } + 'GRCz10' { + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'BDGP6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" + mito_name = "M" + macs_gsize = "1.2e8" + } + 'EquCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" + mito_name = "MT" + } + 'EB1' { + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + } + 'Galgal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Gm01' { + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + } + 'Mmul_1' { + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" + mito_name = "MT" + } + 'IRGSP-1.0' { + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'CHIMP2.1.4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" + mito_name = "MT" + } + 'Rnor_5.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Rnor_6.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'R64-1-1' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" + mito_name = "MT" + macs_gsize = "1.2e7" + } + 'EF2' { + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.21e7" + } + 'Sbi1' { + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + } + 'Sscrofa10.2' { + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" + mito_name = "MT" + } + 'AGPv3' { + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'hg38' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'hg19' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" + } + 'mm10' { + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" + } + 'bosTau8' { + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'ce10' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "9e7" + } + 'canFam3' { + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" + mito_name = "chrM" + } + 'danRer10' { + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.37e9" + } + 'dm6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.2e8" + } + 'equCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" + mito_name = "chrM" + } + 'galGal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" + mito_name = "chrM" + } + 'panTro4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" + mito_name = "chrM" + } + 'rn6' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'sacCer3' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" + readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.2e7" + } + 'susScr3' { + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" + mito_name = "chrM" + } } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } } diff --git a/conf/modules.config b/conf/modules.config new file mode 100644 index 000000000..0b1bfdec2 --- /dev/null +++ b/conf/modules.config @@ -0,0 +1,32 @@ +/* +======================================================================================== + Config file for defining DSL2 per module options +======================================================================================== + Available keys to override module options: + args = Additional arguments appended to command in module. + args2 = Second set of arguments appended to command in module (multi-tool modules). + args3 = Third set of arguments appended to command in module (multi-tool modules). + publish_dir = Directory to publish results. + publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path + If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path + If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" + is appended as a directory to "publish_dir" path + If publish_by_meta = false / null - No directories are appended to "publish_dir" path + publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension + The value of "directory" is appended to the standard "publish_dir" path as defined above. + If publish_files = null (unspecified) - All files are published. + If publish_files = false - No files are published. + suffix = File name suffix for output files. +---------------------------------------------------------------------------------------- +*/ + +params { + modules { + 'fastqc' { + args = "--quiet" + } + 'multiqc' { + args = "" + } + } +} diff --git a/conf/test.config b/conf/test.config index 3f958b4a6..cc60ec23e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,28 +1,29 @@ /* - * ------------------------------------------------- - * Nextflow config file for running tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a fast and simple test. Use as follows: - * nextflow run nf-core/chipseq -profile test, - */ +======================================================================================== + Nextflow config file for running minimal tests +======================================================================================== + Defines input files and everything required to run a fast and simple pipeline test. + + Use as follows: + nextflow run nf-core/chipseq -profile test, + +---------------------------------------------------------------------------------------- +*/ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 48.h + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = 6.GB + max_time = 6.h + + // Input data + // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets + // TODO nf-core: Give any required params for the test so that command line flags are not needed + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - single_end = false - input_paths = [ - ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], - ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] - ] - // Ignore `--input` as otherwise the parameter validation will throw an error - schema_ignore_params = 'genomes,input_paths,input' + // Genome references + genome = 'R64-1-1' } diff --git a/conf/test_full.config b/conf/test_full.config index 818118452..d8fe4234c 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,24 +1,24 @@ /* - * ------------------------------------------------- - * Nextflow config file for running full-size tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a full size pipeline test. Use as follows: - * nextflow run nf-core/chipseq -profile test_full, - */ +======================================================================================== + Nextflow config file for running full-size tests +======================================================================================== + Defines input files and everything required to run a full size pipeline test. + + Use as follows: + nextflow run nf-core/chipseq -profile test_full, + +---------------------------------------------------------------------------------------- +*/ params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' + + // Input data for full size test + // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) + // TODO nf-core: Give any required params for the test so that command line flags are not needed + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - single_end = false - input_paths = [ - ['Testdata', ['https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R1.tiny.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/exoseq/testdata/Testdata_R2.tiny.fastq.gz']], - ['SRR389222', ['https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub1.fastq.gz', 'https://github.com/nf-core/test-datasets/raw/methylseq/testdata/SRR389222_sub2.fastq.gz']] - ] - // Ignore `--input` as otherwise the parameter validation will throw an error - schema_ignore_params = 'genomes,input_paths,input' + // Genome references + genome = 'R64-1-1' } diff --git a/docs/README.md b/docs/README.md index 68b828949..ac8a8b69c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,8 @@ The nf-core/chipseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png new file mode 100755 index 0000000000000000000000000000000000000000..361d0e47acfb424dea1f326590d1eb2f6dfa26b5 GIT binary patch literal 23458 zcmeFZ2UJtryD!S#x<#o93es(Ww4k)maRbte0-+a?-g^xY-3myTE`8G_KvA54)F1tn})nJ5u%TA4Y;^!^{48eL_}p#q-Umo0M|F1 z74+PQh^X8N|9_jcWbq~ zzn+tZC9B75nKdz=gQ8wo9GJ$P{D~3knlI_`-PRhCw34f1oYDLr^;oEbgxa#A^J%*2 z>FfDE*(~JzKFs$t_oeLz))qDU?s}%Q?7b~3Y;lUi^Oy-2@3g?joA4Wkgb6-2=ih*jub)~7yZ`T=L=Z`B`{1jhkB-iSjea94&Eo9A zxN59pv1p_}RO1>EC^q}Z2)ZI;b7JV_x4lMr=Bker2+EK;8~!;JO7re*@ZkDmoV878S*N^yX(F@U1yqt?Is3nnV>7}#(5pk`V3C) zWhB8;CwWIwsVIjH+`<9=YA(j&3DgQdFOOGU~*`36wNC&QDv8> zr?h2PQgnHkp&t^S)q^K!68h~`$PjZW&-Wns;Zlw$M2sc z1xR!u{m|Kih*|Hht#M@eOMM#8O*={^6b9k5B5^eBsrnhVHD7XZ5BWO&F?q(>Y=QFl z`f>yQ9NCoxZCH-1F{#mz_j{QeyY~4h*VeyYZ#S@Z(Pnb7G=ud!RW)5svqM*&GI_za zzn;8LkOTT?``1Ygt6w!2;5arK*o5k15cdIJnMg)IQhF_zVK%!ma$z&jL zZt>Q{!PqKl^`Qw?nJUOEm@@qX(y(TwSJ~dqW&M@7-N4Wk_wC4izx(xJMrmNjsl$XR zCyK&INt}7@FzNAbbg-nW)sJ>3->I1+2~YdlPsaS}^X-H0GR_CEsw`PGjpq`uX}8VP zJ)HC34>D(z{KR9;E&z=@?@q_|I{NPOj~g>w!$gR?Tlu~F+L$Mk%}xQEm+{&T(5zkH zacVy0k3w!T9r*p2sgX@V;^+PfUYUrEde07XSV=KSDbkIZU!j!Rk3MQV=h-!y@kWVB zdYkmu^fiU~pp#ixe4hBEMx7^LdHa z_L*14aVIHtrsR)SO?=&kQS&JR#^AVvln=P=bUXEIy$QB&!s34znCV@y(C%j9V=}SU zoYLHn+-Lalm0$-=QQ}a(+2dR*{DPF+)J4y!ukiA_T%dF zVKEk;c?LWheG#A5{A20}CKjMw5G%2}cT5@Oce=wqdobHC70=kY7}dxt3diH9(Zcwr zCabx8yObHQ@#e_wjl%wp8s_!Wvxe5f-Duin@obgt>qOcqN$$@{X^C_rEDh3fmM;|X z$zu4;D`{YRbaJ?o!KkazII&|th9v5MG2Mao$ytOHtW+wo;XJJdtLuGjg;d020qT++ zpD}e&o?SeKSqR`}4`OdkWNC7K)Wltn zbwBrWGM;bBGm8uP_RiqfwvDD1f+uRX>b=nTH9Y%vpg{ka0e*E>%<+3!G3#s*-1D>q zHg~1@BT52a*L>mVcP>6y*0iX8@!3tDFJLE+sRlnU(cl``hF`0Q>e4i6P8|wKmqIqI zoY+a0V*Bib0`F9nG#sR(8$^!IWLR)cE8@7XZTN%L-ucJ{9yijy)w5Pom%XG7V<^PX z$Z$U82w0qgcGmld-O6*e)?pm$g@!6`Pps5SPKccjDf(|vX9zcLs7t!7cyyckZI#R* z#lj(HqfVeqyZ+Va{)>65sAb3IQ%a{9W^_F!5!;w=XD}ZUHFH$8=Xjw+VE)s$q(nt> zE2^aDYki5`e73RQ=DxaBNZ6CK?XKCv@V}=y(g?YHnFaHfXnl}Lo;36@?471W;&#Se z>pE*@M{Y?CevLG8il9#HXG#W3>;o$1``EYBY5i<;JlBqj2M8Y2!+6bPj1(S_bOksY z<34UQE;=Z>KiL``pYd}5fpOOT)GJQnXfNiAc5wgJ>F|$Eqw&D*Vmz+#mM0oFD^`-^ zB~SXe{T+5hd$gnKd7Afo9cy&Lii@syPDFDK)^V{iWEAEO@?xzx1bd`ta z;$(vG+=i3~9|D=GX%f~<>eOVjy~-yRAhLf2dR8V<@M_`C^ev(yOTg{uf=L3uyDb-w z&)l7KXS_HTo87BxI}fXF{ge&5p&IHk9M1}eNAwqw)`eZSOPFhqjS70{hyE@C{oSN$ zam*`-UH3RF-RWEP`^Su1q#n_J{AncekkV4m7YITf%QHBo60h@pk4N4O}hhf%rxuIZGiQpprVMal%h7?8+cY#L>pYnx6v!EnuIgInW` z)w!NuTp;fz9md^}*x@K9+`^2LO*bZp1^?BG#iS@(4i%AB6YP023T8Eb?M5K7ElSpe z9-wA22Mm}VwDkmECLd*}a=7bCf(}@SHs6UBe)Xvk(+hQ^^unj5JBeo$=><{4PBI%P z4_9XQ=XnE``;1Daa6f`~rGwNj9{YXY)eIw3G90Ip+QEWg0%?g=i$UHuQ?Qc0OR0!w zv?BvlQa!QMyI*IP!0>goBt$xo2^hlD&wRp?$=}}#?q~Yw z{**_|5&yL*Epz|4V#SJjg-lNaIx_{sCL3R=_VH&_;oOn5J2P=h!0enu-i%FAZ- zw`Hm*u6N*}&A7pAqr>-?%0(lveb{r8>hpDmex?Yo*8!-%1?YV0R~VEPBFp>)ba=mv+2(#>WEy0yxHZX=Cr2 zKmew%=^>HsD3BtRR*#H!@!TTGcI&fHrVh)P&|X;>)OHML+uWDn(dlsDjXa;5uBM$r zdt!r~ig?5iGbx!GpH+kdG8k0%;~)Q#0L6wFROJ}^Z%DvO3x#yNk13^&ccd&l)BP9h zD5cU-qZg-rV3Sg&?)`x}cI3`zw#zq{-eN4pNf(+?QuOG4oZ7zMGSVqOUe>`u=GfKM z{xPCciJFw9%Pk+uDSoormR&c=fS#hGOk=RGUtizBOoY^8P(>!Si|I9i=1ZCQbcc)5 zgE6UED;+b$4u&#dhZjdXwO3tpG0QaQwXrLOx5YP#TOaS@FP!h|G!z!Pbv?hTp0eQL zoUsiv4d@*Ck#ID9-ua|zPbQepcC4a>>9-bJApd()Wg%}hj#%A4pO-q{jIJ$f-SL7- zo&=keG_jhq$Ty4e|J^l6j6TQ=W)|~&Ei6gRn<{*^cFG*tS19#kHpMD7Y;wb~!3_%X zS_-3NQoGiWCX!M-Id;Nsg7oSi4VJ=Hi{bYNfjnmTq?IyK@@&_uacfb&8h@DIe70-Q zZ^KaT(4UX*vf7@A7CY;P!IVGIuXPRIe^&71Z1EyHO5&^=jUUKHF+h&m!4!dOA+!Ed zfA#uQ&p6vD7|O8(?5`bf8^gK)6p`>+$c*yG?Sw29;OD+tp}kDD9augDAEXWbSVoie zpHF1Wj8lWfIZ}mx%(2XREqF9!{fNd&iurAaoQDMCSNo!vRHE8wH%QLLZf9u;ADqnxOaAD#VE%Yg z?Gb?EmGbY}a0|vSZPlF3z6;Kf669Bf%h zlSGiY-}E4LFurm_CJN)(*l?=uX);o&R&qLuzENz?9I%S&YQ2>rVhx#c!hbvWLL!CI zA8mXM$zjnnJ#Me@-99}hjxCE!w8|9w{SBlj%Miq#dvS5GHP!DxO$sDx^4PF^#`;A! zb=bZ1pyj{R#9h$r7svB$QlJqeF1cp*ubT12UZ!deKFG%1N<@S2x&2UtqsVz zn=gF&$D4i3x7&vdoa#^cS?bQuP69OpspVPxm*%@DSWf!NG`o`y^R~o1Hvta;#!r%i zvEB~Jsi~sJ7Y35P!bf?OQin->fAk+TpU$Ow1st|l9|i2rrOneBP3&aDyoUj3K{a7! zOYpnJyYD#nr4GNJ;@$ce2dSN=eS7f-VptzM(|Ek^ze)mPVrpAEgrFs3mL>f(ZwriH zCZ65HdO0|W@2<+v9t?J=-4U9>bvM@@Ew4uVZy@c^Ovw9`k|$!+CTAn(u#4kC7TVTB zXuy#d+GC@RIMaPyp|Y2jS%RJkktCracCaLqfs^i^XFqK#3z+d}n02*VDF&My)vp)lNzWx<< zGB7hEAH?7_joYR?>+&+JIas*%Oiux%kr*X*B=8N8Ulowx0MkRK?pR)K1F_m8>dSe54 z)48k>#|F!OV#yOs7xQNQ@1iun5pl;py{tx+o044?r{W2O{f}3r{#QS#4bf(|f9R3y#6*0YY) z5Ey{M`dj)yHl)B{sdmvti^b0IE5xFx%jJM&5w69;`PGy0vGk2ztSW|5H3~zhXO?mn z+4mo>;Y7=4&gC}HifyMO`#70u3H6;0|| z!l=0lP|zVF`bfxm{%i98943^7y4Iz};Z9F$oY3iUI*FIsYa=o=nS^d`;3?*wDxi&| z=?oqs6uDcd1e_e5z7M5q(+I^PilSRE(T6%z<=U8%sq63V!wELY9Rj%#Y@2Y+TEJ8(f_Kh0ih?l6E6~wDl3~?-5%7>d{ zKs0XHUeORoi5+U#M{kE!Ae%|)^dabh1DsJI9N~LVXp*8$XlOfc6J+Cc?}SM zsc3N~L7hzcpXn2>b(_YN=J*C0N}$f_NINTiV!~L}nA{wn^XfBogd5hu!G?*THg^mF zFJm@9m{X~X3t5{7 z#lWIO++R8;BTByGl7U;fz|JBB^*4R|bLvm18x;DF*U`=kyxbH2nD*RIH5AWfJ4^5o z&Nr;*|NreNKo$fUI5}~n#Xcbjr0T-7MV;wZXA(QPt^`x;=ZK)5^`AFgQM?7ry_(Tm z0|EhWs&cYJW?|uvc3af(tfuyDf$28~R=HOa#}3Edru##Wwm0a$Vnk=_8+eQ; zfyq+GVt0Twr^QS*HtI+&&>_<%-Gq-!{iQr-3LYn-6bqW0VW)>%iat!2IP)Jd+LgnS zgI+jJ-I9HMJ8Z*$2FjwK1T0RpF%U`&x)S{3HqRJ z5^;r?VoA(k7*aP@tzB`O5Y26jv#x54xNH;E`KzzLxC)FEnQ<}IR#w*>9sq|zFzZq< zdM1%ynXvcLfZ{Xm=l(Op?=XGV8`BwRiQ%@@A-GnjD+y3K zN2Pm011b!s`3368%P&MapW-PDulXKfpeyRXNjN`lKKgC%CplwE#GrRw#0FE#Q4>R+ z23B4CmO%uy8Y@;F$hCHU6+oJ}_cKgm|4Amr{$`38ue-?+GX1T!hd$w@x=z{w30Z*W za@$MLl^=f#*oR+8(&a&`E@Bj{{1O;DPjj$g9U7~{m*?^Tj}Rrc^wc=(SycXVT?bW{ zUus*6{74fo{nOh@zQyv0g{)t}Qekl*>KXQYCI9m2jqge|&Ntj{V?gLs*_GkeODYhf zW39Q1L1~vk+#E^S!nCyO&z9Wh}2=K}`9#{=`j&)^}8=U|lz}DqgAteVsos){s zDhK`>&pK%cVuhO7tPu7@Y4|yXAdHs!(uKDuLL@i$Okc6Gs;2456Br??ZNZiONAe!~ zvY5w1(C)E9fRmpWgWU2Su0u6~9{@wIm<-lha;uuEN>&C^FJ#^|oopkg``l#i0&{OX z%rI6Q>l^9J++K19D;HrFU#V9o0M`MBTT#-(q&A{|n-`T~CgAFET=$E_&pIQTPE;J#&nrwf2N^I*d zH)ev~7d=Sy8<@syK<`PFvNtyfa#8^JceG^ua^o%!fl6R&j--jGkz8wS`EgfEZouOD zr97H059Dj(#$*$-!UQLvb92wS40!wJc!4K~lq-K2h2rXunCs?SjQERnvv9Fs?tF;y zWUTcQ&PtDMbsUY6_&np`UGMS0ZZIhnDh~p{`Bryj7XS~*R}%z6 zUO^hJn$_-CW(;$)hHu0ej1BNqv^o%*D2gR6zUvCZyw)ddNB6JE$;okhf7PEEz|dRN z$sP&o`MU(L_I8mDW33;)3!U*;HRm$zVV%%zaDn^*Qj~RdWdFNb;^fRhnF&{oeY-tv zq$p~pZw)Ls$EWKsEZubtx_9bpdCfsjdy*<8_Io8VtCIC+8kk@Qxdti>xnu}nRYJ-y zp8$3YP7u;u+YlPQ2`o_>S?mpXvd0-x!Z3=}>ceWDg*e)+#wQLE)Uwhneo z;*y`VfoY<#lwT^k4BP(ytfI;M`FoYsedi}L{1V|Ho}ciBs=`@vtgnieHdpWz%Vyy$ zlnn?k0KJWOnlJD9>6y64*X=G{lyl&%pV8Uo&>tXw%1za!6*YYVB$jR$Y0XhB#1mVx zvjd8N4X~{Dd&28RVEkCw9TLN9*Ng!?9F88l2Bl)w%7!97mtx5(Qx%1u6h+$OGa4#qGGGI{Pj4d)5yg8F4O2sfu61u0uM}?$_nH8=0St?`ogZ@1LAr@*uC4Z9(|dIQ z?OH<_%?PD56K*Kty@PQT;W#)tazY~|I7-aq)tQ($$#Q?{gEbJwJK3mnk)|l>XgmJQ z_POHzee+4NEWu0i0zUFmLTF(zvD3B%sp1_F7 z<|O7{-oZ2>t9k~zX0MDQ(4&(YZ#~baV{$ah?o_K1p$Ad`PAvgtuhW(xO{@bMjNb>Y z-k>lsDx?xX;x5*9RSpJe~BwLtb79%{p~+JTs5HZ&#({u>j3kAOLx*Y zW{7^+`OD%vhcxVW39F$jZ;I@H`3X?>Wwt@269f1o{V4-t-|dX4x7L3j zUHltoa@jqToWvn&=0CF%6%D0h50m^)qaXkRMC&Owv8iG~$}1PBgld3nBE#Rg(5)8n zga7!2@yjoBBoF_e3M$ongy7N1L_hT@!LUaCXX6QLZFKcq1r;;Z$sca}zfwaCji7PcbfW7H9p`7Eh$-j*7-=%{5f&}TidFWiMr=NYvc}Q@gh_z)<;^d&F zd@za3ugvK(BbprUX|)`Rk0&+6)#sm5S8a7;dzrqn*f)iXpvW$BVu6u)bR+ywtGne@B61Om=Q)yvb`45S}|LKt&5@)wSOfk;LhZ^UofjlQz0h zm)>a9f&40n$;-ndr=xntY3nOFGmA5POfiIsfgTzT*Cl zU{P;It;qo}n}IeEA1&?GRONCJp3=_!ce2$kKRZonNV+tS_uFPWzeS zhqSPws(Jp?TsgNT7yGtphSz=h2-}y#HTWNE#@LHFs^pseT#RfN*P8yLUm`jG1N5s* zfU25qv2akmjD=Q`s4SJxi@i`xIOCdT5B%W6wj1Fz8)Kuv*iB`}b^(em~z zz4~VcUB9M5@W}s3-SOWXu+*?)Al7p)Bw?jh8_#s)>lYp{{b%_vCY00=iC@I3$FcpY zYuOjg948l-C~}cDxL!%j&X1(H6ZC7U5?oVLQ<)zh*qg)k6HdNPB;PQcbVRXucl7>@ zE`Ga=^8RPrIRE!3E#e-v8MTy%%a1yk_k{s|V-=5ML7(Mg#S@LA3;rEyjF&X1w*^R&VJ>2%B@{=W9BD)oa@0!_Gl{G8Oe+Vki1QQWd~<<~Et zEV_YlJ=t8VXv>#L|FKXIJ)GZ1(d6xUoSPZVFOzMhM$6tgyhWq=@}=HzWm&b4o8R}L zQd7<0PV(LqaHYNNcXtTN4rc2ov$)VeRm&}XS-vamGB^G4tspa#HrPa5#22^pb?s&W zS%!p!fba6R+WLMjkeUo!qpKob}#cMpU4(`C+U6R8i>qlJ&Hbh52enW<`FmyjlhwlfIlxyu$Pg z3uS-Qau7K~%A$hBFocIe2<$LBIbEI!uddh9(JX=++R9aM|DO2#5*qKh#Zq^~O40f6 z0#s@~v{DPy=4^A}ieKe(Idu22Ex4~>p=#u?w_Lx>bHE@Z4Dh%iKrDJj2IJ+qNDIxj&WPRXRSaNz$JyFkpFK#gLAB6G;4KKql{+5w z{2yWKln-fjDCc()q_W&mmIx?JvpXPb{)hR&ok40*!M7lC!&?b|=efwVb@r0;FeD2( z*x!h~5OA8DEVr>6PS6o_oYt+7HY+d${lh@ruB?hP=`vq;@uLNGIb%@~*X54+`NY0- z35nZLFQArwtL~;t?sb(T6k;wi@v0FFLV}%b1@;p|R%u%8ROV= zRWO3*fG33>>}We#nQ5Vk3gY2ODY5fL+-E@ zvWG%=(;1n3UEEjqSDn9V_C*FMSXjR{uYKa`>$>D#@FacqRX4qmy{)y4&Gf)@V_BVr zvNEa@r<%e5HW?jhEb!SY6v|~N%22Y0992I>~ud8In`Lf`QStH3E)x@G=`2&AraN&V){PF%a=v)Pu{I zuQ7a;TZAlAgDiVUO+`B+z-8%M0kCiylcazP7I(w|^h*D4Sn6R#-jd7ZMN@iJo=6v2GyL zo;~Df{e7CCta*U4B1pD0lfi=EwI3CTf2}#(`mwSD-u-%XLU(&V?BTG?P-Fx}R5*E5 zcvSdpxqh`s3e`yRJ6%Efp|NYd2}SjJ)h@$9391YRLSU!qq4E=W9yx#}_KqRcG)(~r z!+&i&OckDJQ2El}fI8mdeCHPcJ2=byp-dT&ZFDzLuqc{lvh)^vKB2 zL}g}~j~QUN0Fo{!0BTTKwrDjx#j6KVb>MsCz=!G& z0?uz!q)+3>Q|KAM0zy>+^zjMt4}XE)t2HIfc*Tmi?$;KdI7B#Aw9_O-Zg>98L}4}% zna0Es9syWr5+f5RGVqawtNUt}*r|Zy#6ay+mEGaSGMmMOW%88u6mXzDD_wlGT6!zy zpLOrO442P{0J&IYJjqwrVrEF87ZDTT<9iz5xv)C#pUTTj+d73+z7GI`Ehx*q&zxS(F>^b?4*udLeSbU~XBKKi_PI+| z`R!s3tpv7gX^R3~Cce0vX(P9@UCS)XwG6mNX_eM`6X(`UW>OMp*nTlrcUU?`gCzDr zKR0P?yj9z#ME0=e!>GupM|%&t{Qcx)sN)wVzW*5E>yxt5g6NEc!GR+F(!Nysd6n&^ zN?K|Q@t>y$%H^ z1}}eMB%-GY`CK5%Pj}AkUNRem1zBUE6y}0KA;6;dZu&VyB`KCwPfdQ5Xri>Osl*$@qxi zNUlL!r3OOxC4C`xXPqL4Ec)b`ajpfaw12E4xMZ6=Yyb-WN0LL2RUzLj zAKS$6X%>ekm|3yQ$#-`3N8ah|B+0f4bxDc4nfJcHZ{dlBeXYRL5bY2afSAF|vcc%G!HPxGS8==1)_U|T zNvWWGt}f~OGmCtqW8>q3f@5Go0Rce)p>g@dgop$3UUF3))$Wn6gRX7M3GQ}?tC)i6 z5#2fg?U#)GsvTF-;w zY-Nw9hPGMC9F9(W5F-PUEmiuS(F06nlcE{I)}b=%A7_~A6cEH$BClS~DB|X6Z*IT2 zIpOX|#S?qiLR2Osk#^=DtNG&ym+&FR*Kv8P<@ep!ZLZtJSjcEO2t@V!3dE-*!yhNO z<`xWq;JT2z{)iLD9MQ;&^p<*B%Gv z9;zH_>TGtlGO@9MT_xDkFS4=QaZA)){{?|_B)8Hw-q)H3IPzKPiHM2|2?0GNX^+EI zRf5>q`4yE?GgaPuK8|(quyuVfv-aF(wlXs_w}4}Na=7tnIA2P*pcwxEhcBp%Q-6rI3Rc0j@jnbz>h=|(@M6C7U>fx%lJG+#q2Q4af?@H7>c`6Fw&JpwfW1WFvJ!J#H z%4DH$Nww@r6h6K-1K$M;1QOi8g)GMGRywKGssy2=E7s%k;ESt|W)#O-pRtb)vf8-D zxR2gI3De!E>)xMZTl>m(C!Tx|_c}u7mC!FmY~hT4&*t)mO76L0VQ$Zm)=+l7>+9FH zfQZjFC%h{enbPhuNz~lx(beZsjm#JG@8B$iw_cTSX-?0fRc}lkFJafCcF=wqJsUd8 zMn~$&N!wK2xp3mXuom2=TlzBdg~W^u`*x0IxUuITUpwpCCpIqO47DsRfB}i?8mn+k zO?VOK*oa)bFN6F7oN04eyGiZR6q#;01`nk`g-ro<5USFo8#dEMz{N z)FLtwpl>inBl;{0syyqD<@D`l$#Jfl)EJHXIv_2TJFdCbB1tJq2^~2}iq9XvxA^o{ zn0YLREmF;vJ(gM2^u>gGlpZOM>hd=@e@%v3L4CC$gdajz11>;t>9B37u4gN+c2EaN z7N{PzCO`Ov_B8QVS#5&Tgk_TYRF@xdXvUjab#=&lP?prpL~g4|3*W;OC@JF8+0RZoP6YS5=9t%X5j<@=9s zJZx5j1kEdx-027b#7vEm4TRT9soiaOv=y$Y#MT=^nhP%|fDdU^7Ez#Ft2I{)2fQ7` zW7SkW?%wkBWnL)w_~|{}hkUWMk@uEt@uS1%?(3-dK@CnX)?b$25^pIgnsh^HS!eiB z?gK|C)llrf;ga;b^r9EOF`p3yYRe*y*MIBz1Bd-qR8TlBdJn2ur@`?phF`DfaY8;D zCwmvCvRQoWVlI$tetKk}o?MNTX9H3!Y@C`PXWV>S%$VZ{%|p4jHr#UH_Ryyow;{{;KtygLxrG7(#ca)wTYK z-Y0sN6h;=V$f!GPone8y(zPnL+1N>PyLSs(y=`1y*FQ1lR8e`3s=cW#m$+c=3)Tb3 zN7!8_R~a%Ek8tTvTN6~|O}BoxmiKrt8Mkh0)vSD{hV=%yVvnL*%!|m2!23pSnTfsT zwQ-^GnI8{pLlWXKtGU!5h-Pk2LFIGB{oj=);~!Nlji{=PmP~Mqtb8I%bKzXfV~y`v zhZpp~H7qb%5D%?Sa5$&Vmvl)54qk6v;W{B~UlL4_ z81zf;L5bb3SJPuc^~%Ua_>tB)$VLK>FZvy&b%*eB+g)qdbU(k_R*eJS(gX< zJxL0apH$ji6sKDr)n`3{aNlN^Qwkhtd8DRdnV96&?L&8b5Co{7; zvmmb;3CdwVs8W1GMY~|zn1^&RO1t0hBt(ULtGJTf^IAMxRpD7HU;6{ij?XXdjHv`a zw9!c(a5cYpR_vk~eKYL+k6gM+5023LHvMEY_p}y=4k&Q!!C<*zC^2Ia3C3Ji zL1sbM+*p_j602gKXP|mF$s?~%_vnUv zj52~Vd_MWnLq+!(*+*-Lw~%K)_w>^_onjFhcBsl-1z4eAVzf$ZoD9yB+;Sysedi;%NXg8B1{e-#F_eG|zvUc4YC2OlIpARjmdsP@u05 zr*U3jsq00uHQh{r5KWSeeT?KjD!)FjzCJInzFM??L^jL9NcW`?Lr-^4X;Bzlu&Q?y z02M)ULBT=3$s#1Y9wAzg8-+0n||g$cI`eH$?LAzF9rpS6h3c^3UB*o~o`&^2bx~YDhrzULrno%G+^r zq3*RFmK+#R^m@8?svWLq){v0z;Az zxet5`c$dkiO>9f|6fbU>MAIx-Kjc(r4SckyK$1&9Ug3)mVCA8Y1>GV0bcjayWKU?1 z;d6`Ui1G&YLMmdtb&4SB(ffffFqD_1Okq%F3-y=7Xr$+V_G^RS{QgC zXKOBBq9L5K2Qnz3y##l~^f-q^dVo0JTO6ysmtjFF?tQ4=Mh9FhB)1vUcK2(Quo8ja4+LSJ)Y<8ba zuA}O{%Nltg%FD9=r+$Zri;I)XEgq8j;?A9Ap0;b5j5DIM+@eRt2of>UaXBan>ZY7* zVXIJgT25e+vU`n3vm9;wD-XX>S5Izts;k7?q0ifUbXFZ ztu890yFSO?daUUr!gp4FD4cm`X`a_ImZ)oY+O^`2sgS=Z-sfHvxbI807yFk_pf??D z)@elHpxFmUW>0G7ey-bx)DpdGO}*NS(z-#}PYqNxLg1@YN}fvhUtBLqKc+GUT;OW% zO_B<`R#rcqET`udx*1pLFro0I)_p#G&G^C(J)_;ph87-;WP@^*-yrWnJiD`bUJP4q znYR1%sd_A6GDQ|qpc%2A)KEGs;Y;857S{2jmRaCehP?GUgH%@%HTz-B?uYLBrVgP} zH@h;%V${F6+&AJkBG1T_xqmSr-oU0c++uF-EFD zir8XIv!Ke#t=O)W|8PyRa?ZUc=)2$4uI5;dauysN?Iuy7nk&-rwtj_ zbqWwtQli>QcMkpbLD<<#ef^2AtKAu7XV^+t%ng>C+4%Wb9$F58#E^h`#n9f!Ps zj#E`k*Ev&FK`3R|?l*-YBQmL)w`1e~thLbiWK69X#vg3g_b_#aGcF(hyvqEk72SD; zu~^e}9oE2m94b1C2NhicobMMlg}U1!FA|mJle8de9Xe&=-H(MvA(68kA0+z|@_;-# z&(b*W+h^U$FizY_L_j1L?db`Rywq|kJ8nKA;QjfTaq4P?Nw-t8PTt*s02E}f>sbOX zogFNsq@})oI`S|>iHp=g?5*Ri>{ zfB@dk5v}dqihux<=+%{)tOw&-*p;K#;k0?3?5LDv#-^~Bshk-i29xz)oSMVH0{UfE_@k=$Td6mLADmA5HCS>H;8Elg7$zuRGQ_PzI@ zO7f{m&I)ngat~(Q!A^05yQ_P6@m+rB1*YFo4Y=~o+^59v4+%;&=jKhGbUydp4sH`1 zy;I`gK$wj(W`yp3Yj2)F9^2eqVW8uZJUv^BWHR7|G0X^Vuta6p*nh6WK_UPW?g|4H zCB73}#_XrDiYLG?L;{a;A`xflU$&e61X|e>FFS;FXT~~Nej^;8D;T+(JOGZ)-YCl! zDic2c`~DhIAgQ(OXEkNRICxKJ<<&$(86$}P>l1x?yCEt=imFk`Pe$TW&4$L37fnx4(%*=smL>0uH114m_}1+sdfuU!A0Zqzr@~p)h_Rae)3fnObHlP6C?me#TrO zCzi%;E6iC);zLiV*o22GEXIF{NL2tM-wS{K&aCtKGNF+iOQ+JaXYw|H4%FRB?7R&T z1KbAY2p!11zb8icU0Q6TPkZCL#ztpG;uZYw`xg!FyJfa%ZgI;OhQyI`fsLCle_S+t z4uqjjj%#Gy0#Ipt92R{W{euP*jXIOxh~qaUFM9L1FgE=XM~3_=Bba|6C*-;_c4HdFiehcxh0 z3i5W02=DV{(OsRR{NTp{O}%1D0O?=QOrHWG;?)^(Uyagt?*2oVuw0Pnoh8{=0EzL^H|PjFP(dF&|L7WETT0GcVgY_ zx1oq}^k1#{aimB=*)HzvnsDIHm*|-4-oMfmwO_ThrZR-9o)Q(i2K8OOn)fj<5|I>i zrMN-NYx$b70)BeTtJLb1l@(5>DzdL{44E$Db`c|6v{j8rk`njaT(d`!Q+zvdV+~uc zwOi(`abOznKOr4><!y3?&Pn`#_&3l#Gef?)=p3_f^Ui;vfzaAOR#H0C- zC_m1^677NRcZrEQlhb%^AG}2eIicl$V9+BoV;Y&B{w1=n5~3`>l3tCJ_iei91O5sJ zlfRNrKdWsWxAWWhrxQmbuci*ftO7n7Oc}WO%lj>uVaUiDKPF^(#js~|dl-WEB(b%;R&%wBZo4s*Feg>11~T!zk!KqRO#H>GQupBCvQnt=r+5tC~|_jcwZextGmQ=bxnE*pJAI!;`6FR9y=}o5@Ho683hnm=2#mq1!K9 z;~t#M?%xqQa&ju$A*O`A5Y;)3bM=^-yRtSfb`+m*&?NHD1^&k_^1V`zUUp zBQjO}+aSl}wx4UqTg2FEd)wQlHv^*CRVd!3FhGRo(ku4))jpO12ugP&rZjKiwWfRW zYw>!=HK|cBWxk2w*r^o8&xo`u5~q#7C$1%JvzI7GnjkBxN}y~)MsK5FzthqT)I+i9 zLQUJe#tLyOp$}IIr$A@HkBqga9H3%Ak12)kQ{#!2%+*+9#70XhbyV%2UkvY~D0|mM zOicCza3cpNf8-DDqMQ{MkW2mhk21pBOx#yO@k>+nz1ZeIc+LzQXaBES&Mc^@EREx+ zqiBmVE)B9tyJ8C(1%!qWVxu&JY>L`J5QAF>)IcL^2uZMMRMdci4TdEsixgYJCJ-=e z(Lp2&ix5o$VGm(RSON)Tn;Yzh>4%xBd6>6bx9&ano^!tXf8ROv|DAg`e-7-iRZ8cm z=ml-2W49d)ss}v#)i{V&<{UK+J~DWlkr^ixT(|EP4_lGEv+7l6mX7 z`rnoA>yKLGlLdp#ymRS3uTeX~bc`pDe>eR8u{uRKGM^xch?2hX5Bxxz6(kXw^chB# z#7h9KbJ}H`x6PI{mOk`b>sfNpaaH^>y|DfmqK}?)K;U6OD{UDN0WtzaUnVZ#(spqZ zVUr8UHtKKJjt*vN1d8xgpq!jad2C3(uDSb@6AQqAzw;SdN2f_9m=Y%6(PT^t2e zg=!ibR|V#v11NDo)>*m?5o>hTQnM~G5obZpgu!tGj(YQzF70x0uAV}pwc8nXX9bNO zbd)kXD!8@U4%A|o<87&s*`|`dnky@hr;;ZAo2~Bu2g7qn%3zfDbCVL7wu5 zo6Tn~<`BAK((ct9AG1D;F6BcA^^r>vEU%LrOxsOA%-~5M z#X&|sFPm7+R$g01eYw6pxAtP}a&bw{TPi%16;?Qf0?g2_F$#<3}XnXEmOcm0X z!{Mfdfq*I2fU-a1TZs929@5Rg{4M{z@?9Cko|M^ReIRLnw|jnGRaL}G1ibFOa|A7s z+co|6Dsuoxs)B@lW!!Fy@jnb5RF(!^gPXPin?1IG|04fYi3yRqp(DWls)4f1ZERc>4-}4==@QsXQg#VCX`Pjnxeb({{Mj4zJ&j-1gzqTJ&ZexJiN=qXShYkaMiouM$* zihdgSA>BBh>UG8sz{fP)%#B>6)ZZ=Zve3ylD#}%J_s_FUjp|p?zS5nme$D^s9D%?1 zd2a%1f&hF>jr5)w_Qg&=>>L|+n_ZGJ{}HuB-aWy6I|{a6W`Hnb;cfm6{HJ~AA5ZV+ zO^P4X_D8eT5KMzCi0L0n3XE^`Xqp2~J~>=whP^9u!!3KaNy^5JOLz)Qwu7R8tf2ks zjisRN+T82EvVNsTX1X}xJ+r&E1Ana8Qpn2QD&fVB#c4QXwtxn8H8-fA^k_PfU1K3X z>IqazcZf<=_}R)j8P@aQ7;I*x%o;+#m133p4|1XdRsx)DWgq8qRCq~o16CxrvV~U` z$2#Ub_snsmq87&UH8fBu1S$k8W-@S#nO1mvLoQ#oa#qzo1j5WsbiT7n#x9E6xctup zJJ%*Op$=MhR$JZqbv_dwGf|=jmqw4H=Qe2mw@dI%LXLx+E_G`7=_yvYv(qNF3xrZR3f^9WzweTrZ7WqEQ>&+*-xiy?FBw3-ZWJN4Th}bQmbtp<+ZqlYjQPJ zzNJfa4MuhJC8X&CS?MdFHTA9?=isQw$nkr*(2+Po!G*E?U$K}~)F4_CUzSe8@O3kZ^Er5IyP;Rw( z35J!UL`-m9!A;qPy7nr*dZ@-uSCrN8P)B_V9{n(?zi#F`+gKxs#*j zIH*Icy{ipTSyFy2@?sB~?5qc-cE2IAHt=n!gOV&jwpC}hxH_Kx% ztE2W0xmBmGr@cJg0cyO-?r1X(kr9xzu3+5V>1YzBtuK6Ra+RToix@7>2?<#qlBORE zbPI%~d_ybB0wTJa@)1vVt^ENOxF^N8TUJ5l82Ua|j9w5GM!ns$6;8y2MsryfV`-qN zEznw|%v2>{C)I{qY-dkz`?}Fkw&fQ zBN#PretyOeaJs1{;WawCpt=$SI;XBPp7InnGa1cDG>a+B>Gj%*6DIE9rWl)H8{q`X zVd*sdD=SM1z|Vy6zDVL-OqDUa_)7$Y%8SwTNc$fK$`(EpOnd?|qD%^KF$$pzZLs>; zv5g|58uwUn(Y{xXl&jn#G4$KyOX%KD$tr1&*MWVUnx;mKg3#9O_l|8-Q|n3o{>>eu z!`5^oYumbF>)9rC1!*L0!jnc)RWy#I)ou2c_^7-jK29i+|GW6{gJ3&?o*?PGQU4@` z$7-B=gU6FGBh1l6I?5Y{G*rvYh!1zuM?w70^DH5@`^PXicUM2_WGwV*Cy$rqr&KUs z;}joZDc2XLy+|3^isfRqI4kTS5mliCSf3Z_X+6tS(ggtRztKx~?*aru3zmUEkLmby!sE-ZloZO_Y`t>6Y$Ly1P@lk?ycSK)R&6OFD*7$sq=57)m6D?#^$`jN9!w z$Ftw}yzlq@^{wmjQf8PnYd!0E?%(f@$3O)+@w>P1Z=s-|+?A9NQ9?mM?L$Gi>i)-7 z;FZH#{oBA_R~(hZpP`gM2$z8$uA4oTeTsro7IypWIV$k;%@-1yjwmP?PVhfhrcFuQ zP*C1rN{T#HanoBrM|UIK_dfItqc6S?i^K#wb=ab?`wf!gEn-xkev5WY+aryTcai40c^)|>K>E+ec<8oTH!6Jvz?Pot=)BPAz*Z5>N7QUnkVti;^*btsSu9JUB@m~FS*n@cgXc6=9G3|4JYC@2aKBbRSEYonlO za7Xp=p9IuQxwVwM&PZnCJ#%x~OjH`hZAy4prD3VfDMm6~t%mQtl1`0vY z*HSSM%jBKyrWm|{+j6?LEI}Y3GvqKEDtH)kdJrmQRpWguolR0j=(SSeI_c4Jel05F zE(*$y81yR2r!Hccg3dmurS^Q(HErm&J9Lcb19agHm=hjsYU3Xc8JP81a5~KKILPL7JFyC z^*y&LQk#x%OoY^&&%X9NV8Xxp!e{Yo1&Fv(yp%lKzl_l9%%8x6n5Y`}aGHU!@%d=C z%jwtMQ?X)wPTTQXsI6($fxrBiWKUnp@$!V6r|EpIV72dz`))g5bBFxBNjs7q0h_?| z+eB8$4^{il7xeGQr?`&Hv+-V>O$Tf^Z*KOwdfAV%mO|c1H&BWl2sj+taB>rPpM2Ks zBTjfYnw03!%t6XgR&N&9DCQ*5^#-(%(Jz$S5s>P!v_TB(teM{aHrGek#kJFI=zD-| zcF#h8!oH(eZMS`5FU^Vlw!V6P zQzEMlGS7gS9xjcGDfav+vr-4~BAJaDGUC(`T{j2v{X^#xw?pNF?_27&6{QB-d@81T z-jvQ!gz*74P}1rns(}HmjXUJydQr5B-n6IgyBo%&<#RShWtQss{dV*2*RaN!muBb} zZBwb|QQl@PVS=EU>8^+Z)QZ_ATzx_hx8TNFo3PrwHnftOgs4nG#~VdD!^6)nyJlbO z60GZ^q1Vss__}XBJROZK>0Z}AUiyRIlw@c7XzjF`2{syyG6|e@>Q88&&ncr@ zyL*nFhnc(7S6a{Y@q4H*1@~P-uU$@Y??fFAT^^bIgMnpt^lYt6P)Fa+jKb4p zZ?a(y9I-9h^0XbT>Ehd`CI8bVkHh_97f{nGrvBL(!@$zC_yMt0=!XydN3CR@_mZc# zzSR&{_SqO)=z+GUr^3#2Z|8}7`RJTNUqcfKh?g2YU$bK6U3AHNE#Iz@u-ounY9?{0 z-hv)})tBIH+I?|E1_`mA!fP^WBqy3Y4a;XR(;wR(FXiVP^nw}5Q*d-Ej6L8FeIGK` z%;B=&-IU%>;#5Q2qwWxVl-YB)%VX;np!}q(Hrr5%~#e840K*K^J zXcHTx3)+WF6rWzaCOLOne!#;jc)rSiKz3TfJ8HH{jDli7`g34i??`x8>?ZHGakeMr ztT#S{d9E&*&kEl+Jr9sDc9uJ{rKTST%iDCs3SLZK9zkHq@v^LBWkl&IM4ozkJwiOb zFJ@BFr3c!#LQ)h73OTLoo<_E(o`IQKgW`QBL8B`n1TD=mdM|4BpF!RqRe0{f z!}sj9;oIzeC<8$;nc#j@&rR`xcC?El2&4SX+3Fm*)tPOw4vf0Cqe0)YKCS5&Gt~@r zw0Ch`M8b9}Ac`y5Jh^pQ;}Om0p;gUQhyK-E=%sI<`?H{G4fJCE8Bg0~Yw`eyyzlZ$ z0{*b26E)cV%nm-^VM5cm%T8daTZY4zIv?Z-=4^S0c1e}bT|tl0Q2xF!2)*JqxoqPu zzwg1BW^PPsEACOnTf)3YM2VZz=W7+7O@!6*ZcbkFflHf{n<}Jb=R0k%wKvp8K{95! z$pt;c_|DCr`-q29D}0Jo1$0`sIRo}!YjT$oixKNbi+kz)J?`?l;~g>YNifUW=0DG- zYBrDfcnL$m0;t6Onbp&hY^G8DV;IwC;Q3l8RRB%qZ4@Cjcp0VdUOW2yl8X4`m3NTNM5AZhNpzK~ z&uW>?=+MOHR+1U}-QJq1&EjV(W>ck82ABBmrymA;NF&-Rd0H%aM(Q(##X91M6JK1h zncX~}GIHf%?%Gl(hQdac_|HqCK*lo7_1hODTyeKpJCZ``dDdph+Zf*EjY@iNgKfUEl!h{(dmX0U zNbz!;kR{sBr3x_OwFRwzHcMjq+Qd^|;_NSb_QkcJeIirtLHIsFi9?W?mw5}-ntn@w zp8ke;z?rkP`_|2xrp?dKrxG{l6MPoj=vB_NSmHOjeCA(FV=LXNeov;i7%CAVc28G9 z@mmb6hyFD8B|rL1Rd%Mk%g!+s02W^9s-9O+^623Mj%Ds*tiBicI(O9ew4&MLXpmsU z^r71~MeXK;ldWsM2Wu6V=byFJqzATP#3zt}Dvptv`red+?eANkC&_Tz^}X6lIz4QT z=4|gqkA#pk4_}<`Z8htj)rv+ko*pr928n7rCSsBi*6(HW;cM+m29P2} z!v`B^9BA)Z01N_^hi#`)S9UH|+jgs0bD&Dk5vERZb3*!ZH>T|x0ZVYP*VcijfX(_@ zUGo`;5LO${U%N>I@>!{7n%wXrt*M;e83%!iq%TYl2Q6T%O|_HmG6MnCTs1}_o}a12 zmX_+frrnPAIVWAZxGn5czTuRDpLn{lWgd>$xrCl&94NcW4WeSC4<8m=z>K0w~a56+P1wDksK7nRmdn4Ee zq=bJC5eDh$Rl;@wG!s7z9W8A>EKEHl7uX-2KHbtCX+rmz6ZCCyq+AJ}JL=rJ9XaG> zc0_4LFR^}Nqu(@GPlJ{U<%~RiBSj!!U+O(`X~9)oy?SiFzO8#ni7%Pq)>~AwwRPmE ze_7!j-)1dPzAo*;;{0NBCUkzAQ$uN$Dg)j2qs!sZXqAq8_glj4a-dQO+U3WY9(o@K zpZe4dRjqQ`o(k4zxSoPv&Q{9ykqo5Z$7Yp)1U;p{WA(VZs*`H@nl$cjcABq(>)V z4s?5N_!w`pHsiSp$B%E%>iSm8TTbt6;YQAcua^$WT|6m2^lZuSvvmlU-t|Yju5Ca5Cb>mVJixq34`PMiwUGtt}AZ4}nLGr6Kod{&6Y zL23K+JOusXTZFb&$KkZ^W+s%0(kz*mg_oJfTo7q5DSX1X@*xE5(7!Q*j*vk2PPuCYwgK zvyhqQUV+>`k?(d+J}#z)d*3Qfo3=a9DO}4r_BxH4XV_0)Gl?0IWpq%Yub)OOVcJzs z@5FQn_}c7jruw>Kr>!mumWzMqYjm9{gbh+4*yAQFA z`s72sHv3!!_uuPgnCw$EZFA~3wt-&mR~@(I9$pBYf-i)lQkcnfn=dui!fKp`f=qMf zGFt>Mv~3KG=W#P_DMC)VM_j%4>g6vMd$p@|Mu$n8G62@#JE88MO+eyvu>Dd0q4p}r z*_wDCKkHd0uK2x1i}li`xrDIGkxl>2S{v!n?{=e@WS*C+Df7D1Zgah99)mCAHRME+#PX!(3lN1tyq=wT z4A#BN&r~(!hl?8D-(8q?pbPBoHJJs7`@|k~muzS?`<%BY3SNMFYl-# zSpNE*;$dCwjgys>^i6)kf_KLvz&kOo>VZ$g4^g2h;ERF7FZdOpHo%Xx4-x>mh95zJ z|G&Qk*S3oEGcz-Fb#*srb?`S+5oBUZl{ ztFc@4{$KCIbmON+V<1@XIkP&EV_d%Z0;RhHk5Kd@szVHg4sn+t6ke?YtZ=e*eNt@7uFX{LH`VP z^yuQ?DeNfC5hYr{6eFhO_!#y4>pYskSNdV*DC%HvK6rS&(8|h66ttI=%Cy&vI|72Om90UCr7>1mT5s8(#7L*CZeotBrN>eyyZ1y+y3kbcz4m? z-vfEW9v<~|b#Ecyu9c+N*w~Yk;0f+g-I}NLF)?J~p&BI4_yh!^1j|KeVf%`?#l^Cf zv(LTd?p?oHTwI)S7k&r8o%W^hPxSYbLb=HYu?J!Y7IGNu8gRMHF{b0PPqda(o9krR zfCnMf6Qi!TJs-u~PfeG_a3P`Xb)Ooz&ok_V>L=2FGr426Yed6D4eK>rI!RThXoL4Z zf2^+%$BEOJta5P6g<@7tw5Ju^!y9>3s}{sORA`w4DiS%(2m&pAJtZrv1$}_V7~jip zOlV{Z8)9#aa}htS_B@PZG!k5PB|W?gp&jRqcTImZWJBXR1eZCp-`6w51l2PLP|JP? zM$46ErF!W+LZau+=Gv}Q_oJR`^%63KCl{3lVv+O3mipCrU+{*qhztYzH!4Ls@KlV9 zp08Tsu#;Of1_r<4-;nw|U0ANUrWLkt`PuyYD>oUUo_8iJG~f_f*>(A;6&+44G*3=T zbFcz(rmCcU8N}ho36_>(W3DtVOQVP$Bs#|Z* zzeLHps63DlHS0g@i0LH|%|vN`Za4Nohl=1@0dJZp$=57}*hGUn2NtW5n!(AZ*Vktm zgb#drNEu4r#HCy(|6t@_DQD^g*UbT-8!9iDXT%o1zFtNZxGX%fxzTzQd37vPC2Qk_ zLtZd{996+m**lZV_Ps!9M#nrmp<4kB0ZJL(mKp;pt304=i3{bIYumgICnbo}q3k%= zLnN_OI8Z6hEj$$h`9sW&(#zf|)4A$uDQX)jgtU_L@|SfKiabuqpk*}sBu(z^6IGS& zVGu<$C;=?*AyPZ`c)55`TYzyxjnXG3D*#(2~YjfQBB=%Uc-N3od4ttKbpexVfi(dnjDP% zP)qx|aoO*D;_YcU(mOdDB9Dz$&}67?NX@m<*)uSEN{rrkFB&Lw@4G-`4dPsWuNcfI zBg&^zY{;aN#>#Us4ou&w3Nr6q^XFxvA=R`H4b%#FA1tlnsitVzCpKBH6?-hTqo#US zQmfRH!n0Ebx<;b*87&`E?4wSGru(E;y7_a1h~btRvq^RYgfcZD<`*=R~q$@dq?Wh%Bt%nbs1AI*a|w7 zm4RUOm;mts1-ZOP?fOaDIt19VbY`!y%b%Z7U9MYY0PibYEos;ZqDp-qD5jY%RU%k0 zf0A~;2pBOERR`qNsA0f|6F7vJ;leEZz{33b5<`tt32|_%Q`uU$a6!E)&g$#u&Sqis zjAgY}3tMtkROU4yPgRMY6rtJ|V;SYC56ie}1|EoFyY{CaiW}OyGFQ=o36(tAJ@tw6 ztvs04Ll0~YH<)zWeFiq4Z4e~I?>kj@U+>ZbVPZ^wLel_o!6A8pQE#O`*m*xGm2yt|-dK zogz9zqRwH56>=3Xpz*o*i)8CNc^iH>-a=8&G;LookL4Cin=-g;U{(gya0yHQBN*#V z-+9Djl$3?2p?)jnMYMI&ZTFvgu1Ol6gztlRnVYgu4ydv7d6NiN4Eq)WX+7u-$D5hG zzejcxt`LNOA>B-m&f|^isE63nL>{UhSZ^hY8QNd z%9wY=@rL0}Gm4O^7DVQ;35b6}ESjs#M4n=;_g0~g;S$;%PlI=3#T5TN(1vIx?RG|& ze?9D=$d!>9Kz$#HT;vNmrq7>$K4ItKfesHZloYtZd!?*Cneqz4G95ori}yN13AMYs zw@=c+oYS`n+4=%iskM8R1uwzArwQi34YnZPTKkws->Nji~nkb z-JKxW#*N=)Wo1kCrt}!YlB73}wlQU8L+;+ai|AZCw&yw$6A}pUS40VjfesufM~jO% zJXCarj#^q;E2~VlFdf&a8)YhLd6BDOKe4HUJCHUYvD(XAw|k|Uvh3E)k+~7JUI;{P zbwQ};*;OQkIPt1B?M0N7QYl{P~Z32{(ltt)fva$`&O@I;js25et z^u|d}?fNZ&B|_gU27y1YynqVGMFqIb!0}1ymy(7o9!I`}yT|?LvRaAB@yV_=Xo%l4 zc?lGXp&^M;o&Jqo$9=ST3k1{%9j8m#E;|&?kFc>5r;=f58-FfQ9GaYLD5&n?feBtL zqZQx9J?999Xtt42MeV`4%QxS zvSxn6oF~cKdM|UzA~2LWuf6@t$S}R7#DE7TE~@8b%&SIqlZvq_;??0-{jI3mA9y}I z=r&f0BuGqvrgGJCXGuOdyt*1G`gG9nz;-B{QxrMhhcmV+MZ?;@M`Fm{VbG+f?v6~q zn|1Z3w}^WEF8(a3T?nOX;hQhz#`u9l?S!oJvOxp}ol}Vpn3zN12FD^2R@LN#~aAA#Z%DCzEEK4h?B5E47AWNEtgHd_*&qz=gnKjQADb(QFEGm z=k_MMV*S*9_G1JV*GIwaek=EA`_b5Fq8BLfUVB69jYkY&0#7~Ny2Beu93_J3W-B$N zeR`OMwW!P{pnPjYKU$V>TTNAmijMm<|E2)R3pki=YaH0gq}I-}1f1N+deP}gO##jI zr;x2Gsn8DMs(8O+7&a3z=t_b2I)M>89E!MRKTF4dtw7I%e^Y_L8MHScesK~fXOvdL z`=2Ozb0TD9L-K^B?@HSb5*`W#=Sp!`IlRVIIznnIDh(#t4B%IkuaXtBaMNNuZPnMb z>gxG@b3a8e0FAuo#Ut0rE=Zo?x_hqjEly%-I#sJMF)*P+#$m_aMjrpI_IxdZd-zaW zGc`q9xfmU*O%H4Pguzr9TjZp60LB_Y5@O>;=?#C+5|j%@{;B>rwE^`fWpT_*B#5rR za!?D|4jL=|Re#)ZjA4XA0c+?@7 zrL9%1YoxjaPml%ZLv8RuCq9{T0U2^&Cu3QoB*ty~svl6uS&zTQ^{lWSmUmzUI0I`G zH4RXH$_lev+b9b73#qHj$ZT~Py1gje3k&?oi$@zH`Hd-UTq2oFK&+{qbykpzK|3{Q zB@Ob#(f>ppxZ7+8%_td4ch)l=2>hNm9J8jV&3Mf@_XB6hV@W+xIl8U?E~wpsh}$8n zv9YnNOtCV;7EmmztE&-O1T#B3_8-@^w6zfs-W)|GpTh51otY_I=_rvyH~gVG`u0F< z5TcwEJhbSh5Q2VxE%X^!-=$wG7rrN50kSc`k*4*V2KYBG*~?`NETlx4Ygux6eYqg` zZ1q&@Lt=9A?dxj8(VB*NzL$mj&g>cX{XG!KjjJyc5`ulwSSp|J@`?jgA~CVBShvbj zwHQeqI61YowaxZJ5kEa|d_Fwf&pobc2|I(9Is;!59O8&^{H>A~UK5h8)H~E#bO(%7 z71>&06own{+sY2Et*uq+-D{;K2P(=U3|8D{W;Ie&CeR$DD&e}f)DI{*i;Jd6fydDB z%gKw8zgWun$ukL#+w$k;=Hx&pCRSJS z7UIDkZ9wVOYpidSA>oeuv^__akbqBsk1v9##B&{Cob2qJY(v2ud_Vyj931TJWdLfV z8mzLia%fcD09lwTb%t!V#iwvcqA9n5(vvA=yYON#_RlsZ534sy@DzM`j+{*Rz-0R1 zh@or!v&7~_A{)eyk$}!zc1e*j9Dh(HxYmnS2 zQ?TOqoZ+2SHlA=}foXlWR3%eEZScKDL5yHfaK5hOVmP#L{B%b`chJ+qwbBmc>buNx z5aoj#$vGD3UQxcaCugdTD8y0-6G)(9oV+V>Vq(T`rTEv1l(+=1Nbhl&{ZmF_ z%pZ4@l_tyRMfXl^JQIk1AraetCnEB?X9k#F@@By6NbZfeRO*SSr;(G6pvUn6js2L2 z^_XXkn#*wVj$e^_4L8NQJTu76fiJj8u*7?Eza&)LEAw_IN0vR2%Af*hI`-BQ|-sIu32GbNaWR!8W# z(^e18lCO$alRw7TJbpcCPsf`XR0T_xqnUK0FIFk$$ER@Y44ftz1ZBF6J;!ZUZFwp@ z(J1m+D_5$d%9X#Gt9MzRlGFW3fC!h!5R#C@(EP6}mRH|`b?R-&TlvSRtcdGQ%fJ$- z77Y{wt#4CZm_4n=d~o`o6fe-5t_%@MG$sGvHWgjoZV{Y1uvitC!9`TPX-tCpIJbYN{& zxKz6lvqs8lQ4!_EZDx-XA6ap^ml(rgL;Jc(kdfQOFf#U54)Wom=4)zbeDnzk4RvvL zt}CQXQC{QlHdUIAu^XhvpC!YsqTDz;d*x%k6LNSJt=G{In^tspzRzdJ*H;%VP!+W2 z3SeJ+!Oh4h(-99Pw6L?Yv$n>v$x2K~DJd?tv9iLnag&jiMZNlRWJC>t-JA2^D6_tl z^`)iz>x7ZZQtUYl3$H4(U%_jW---y-;b!>%f=Yd@j~%v=HN?g!>L|8INKQ_EDfE-U zTy#c|0Tm^`un@B_d}FCUlYxPux3?EboLXB&00%-D(@sMZC_hD`^MHm2@FpZ)DN>B0 zy*2O#ILvPW)}*Z`DP{MP+uZ{KUF%tE0P!Qnmil%U1D)yfryl#om;!>Ojprp}Sco^G z(E-hDa0FxNVqY$m#H3NzJGU&Q8A*;7-Z)~!Fdim}3@WwEVjj%=p?7=W%jBB1?xT+d z{%o|EfKjuaB;@TKqC%!dI<+=wU2O8B{yuk>OCIKQlH)+QFad+y&V_2*wkfE|b9Nh( zIsi!=7R}H_Z5O+^I7$Sv22GIho?vb+DH zJP6)BFnqZ)?mN;%hrh7QnpziCncZrC1I~ef=N9u9yERF!25LrxL^Gonyj(03v50h! zf6BQRZ>TD_7`|e=Dz)BfdMD`i@YBr|oxKkrXYyE=ImB6nu=Cc+7##W_O-*@^wcHgl zyh8zrqkyU-qNd>OTIX~KexxXJWvF19VwhyV5iVyloo5Y2`YfM!Xti09UN5ic1$l+Z3$%;>iTx!rb0 zULiG>g|rJ?byj@y33+{3zf&#nGG-MrT*_i!F-RHBhZoo~KrJ$1Fx)-ir~nwgo`;!Q z5#l#@-E`3!h0yS9#HP$_e=X8n7AOD zg^kMw-{3pMo77am+Wy6SH4i&4Ec+>N*E3`X)7JSQh2N(!li3Q8L7+hgnp615{MiP1 zHL#zx)Qz*UvlrqQ^*o>>=-xLOOMNQW@6ri!2U(>p{lEdJYE2fz89qVi=EyTW+zU zR>$w{Baxi7K>9eBVOu2xOPZchP5(Y%8FtSqTu}~p_zH-&_uevjA=h7;PW12BY}Z1$ z3l1wF?C*aG=tNwKU-@U53^uu#$-KwQWqZm**gXO*5mDp!s}S!hm`G^jC}${&26Y&A z_W>GtDdpRtXAuAEh<9nPTS#+Au|aKc?KJhK;k?*@>r38`E5!g7H=s_gf1!Je#&~j3 zOCF!FqT*+-^NAWr$pMFg?LXM~1wm%;ewq~j9)%^Y70p-%n;4^|>?G0#pRMzcn~ujW zgn#Z)O`Pjx?%}kjJez`mz-~P6W*y8iqwE>rd|!PjWMx%oPB!(A-t-S85)L|kufnUN zX#lTU-5mP2`&=??rI#I6tCMcAHTtXptNIP9#dBMiYR3B-s=|gJ0wLS8E^=v2O=1NP z3d3z(Y^z7g3)Cv%Yvm(PE@Xv(hl&6h7+6lKS1oko?0W^--mdWW6H)WHtH zqena(0y+4QqT_Fuhe=z5r={)Lm_;gy(N1O6c-`*q#sT~Rprp}TXfE>^1em^ z@ZuQlS6JF)dAM=;7+>@Ycc9k`C=mi=fXog2_$^WE;;~`&_aKY#(XAu|Xwm?$@w?cH zm$F1GZ3Rg^q{CAqG0?zXJQ-a)X?EYk{`1B2-dbgwZ|ro1btIzv72A5W9xd!w8ZM zfhDYjv{3U57gDQR|Ea2K<~(``s9Q9%^9nyc?F9UmQ?L?UiFu7iBVR^?jZDx%KL67) z7BHU5@JoZrG$|wlNb7nMMg2>m#c34GARf!YKrU1i{VaxHn*O}UZAR0W=nr38(wB(1 z9z1#d2jUWs$ZWu3@Fx5_!(%&UKzzGH^&0WmP&BUoS%X{e>AXL>LZ&&;mVVFSN6!+j z+xz9qt9>gcr^>>@Ze7*wB*PjD`@r&suA0Xok`clMS`CBPy?sne0hH){>kQiOs&4f*+X>FIii<^3Tg z#n#p~9Z?~(v$LC0AmEHIJh1vzj(6FQXOlz(xYptM9uhOZlAr6?`IlCEr28dcIP-LL zoSmITkcp2JX)3FC4AO#tvaFS=pO~14^dtfUZ?3jzDl13*(1|Fu_5WB-Dk_5fNgm*C z`OhSc{f(t^W=9XmC2W3~+p1!B*M$&itpNT@caWw=xSsdwo4!6PyXIAEczzW)gt$p< zG?{G}UT)}b?j0+ROprydSpH=&Pbk$-)-&W@l`SRVWl~f9h%f1Ywq1+;vUp+sl}Ug3 zer@=L6*88L-G$C)SZ5PNA?(>uDW4Sy55SRPauXINCgw z3`mG1^w{^1$_CZqYQ!y-QC!7s^u07KtHO_Ei$S)$ewJTkGKzjtNVH8{`|HW!_|kkP zGM;kBZ61iOfcYBcKOr?s1!ka+X6?9Rk(~5Sqv2M!+~4;Gu{09!42cvM_mIiWdJcom z^cPng;}I7u6i;_qnXMhIWiJY9TUmIpU}L0IDZhR*C`J-)7GBRhR(n-;yWs<=YA9eS6R?za z39lg~N7|b|+lL44!Q4Zf23!wi^!6@35dUJ5KDGfvxPvQn-9+Qa$$UOZ#5&pMy%sR@ z8vz_o@Q_MbaT~7`ag78RA%Z6-KI*9J zdk=3+U5c^=8UKe`GftW@f}3YNvZ-rD7S&s_+VIdQ{P@+*{Efr;^Q9kE($d;@CPI1F z5IYiQE$A!2z6&iS@8G68detTm4m4N}qdG%oYo_(s1s>zaEd2276sQm@1fUc3>FG@+ zp%5_8aoDd6<@@{J04O?7hxl7(h_0&*ru08l*k70f*yrzxrEusY4Frs56ICC;4QHC^LBg3uSO9cY?v)Fk{Rve4!L zIh|cfrhD932NcF)3`VmyM#wcjS$_T%A)Qm*fi4piK zNG%{dRY^vB&qq}ox7X-PXfGaT_BTq3h=O@zLPlyHW;iPKEFtw9g}ec2Z85`x%CuH% zAf+M{GB!YYy{_!t_@<6wH;-;7o`+UkeG539QTjzk_nVy*Zsbx4S8xD?=TQpfRe~PE zzzl0wx`MrYQdS(rfCk4`-^4gk1*g47muU8QIs zbl)W83cI?bw!0NMAzS5@zP71;k+-;YFc(o4^rd`yu`to0Yl%Z%892f4{75|UZgeM- z5q9d+jMxBjilqc(mGD_)mbHpQTt!vk`pVRCte>R9+7=~oH*5(x10G5-+mv-`51ZFy zbqtu@sdJKLO%89%wpLSO4I5ag0Q}R0e34y(;YhJS9&su=B#NQ}&R$!FwfZ`c7~J>+ z*C=l^KhH35S!yU{J<6cwRfbaDeegE1vQB(?TXq_e%VT&k5}EpsyeT}Odqv(#e}WNSLsXX|#4qM^5(OCX zv0;GRx4ym}5)zUT;sp3DRaI3sHZ~b|!+=b)(4((VC@maT&XW1uch<%$h=_r=(pqJ+(64TIjLi_UZ7fNiR_W; z>c*i^oPpsDQ99}sQO8zVF_p3r;=PjUJVH&c3 ztXlM}{=d>lkVy9ckz)RtX2_IcL_DD1Bsczw{lOr8pb13v^D7sEmPg8^B zu+-4tv2m-LI*y{CzP@3S%2lo5;T=xI+Dl7%fwUo){=}==4{E7Lha~3I@Lc`PV7F6lk0Dch*+& zLTjd`-XfCK71T6fA~P5v@ zwe}q)3=_{C|8D*ox=44fnHIz_`t7I(Sp-j)TCQfe%Z!yhoXf$Q%pzBcNqXOcDoVBZ zfwVX(j`Lb)cauBf8`Bb^^`I;m6}hMsrq|pbUbAeC-^kXGO!RcfD>FW6O^Vr6Pt_TL8bS*QSUbok1spKPn97(M zu`f@B3AS`5iDa>)>{qi0zbb3KCl1a-u z`W2{TSOklXmq1zlJ*FNo0<}+Bu?=G|CXauD>a#7X=oMW%Zydm|;bIMpEH~lg<}$N~ zIJ(K+@b=Y-l<94J8hRU#0@*Nj$^H`^eGf!YB@#WOiD%|*6!CvCV*YN4{NI2+9Ygpk zN;3?vR$(2$Awhbdm7+>PzrT=s?3)zTiIzJB*IeiB ze1%82N*XPlz0-g!_pAL{cG-%Gia`(VpRwo~fz)EnikyxsA zfiE#JTHH&z>;n%vj+nw=>s)sb6B8cTz^?fCsPSavW@_r_w9n}Hd*nVRKZj>XX=$o? zdU-dqs79Rn7f@8F$#$x9)|Nv}&=YjgE21}yIuB(p{Exzf_k;k z@|I*~`Sei{ovr|#!+zqSYAj%HWj*tCCQW4eSsW5ep2sepN89 zc8}AB`%lfQ>t%j^X0sQ<67;*}&_UEJ4pquW@K$8wp&|Jbn*XwjvQ=u@fIxMX0T3=Q zwgAG>8k3rv$Y^%RdudRn_r#PgB7eXW92q%j?*f^<(;uE?pfNQb#plPIS8(n7muwf~ zendM75555+qcUQ{i%>S8aiV5Ao~g=A;qWiY>Jd6ftV?&k*J}Tg-z_rq7?7zdg^Pk+ zs4(vfN~u_vXv};##Y{{TPQbEf`p5`25(ffo3M)7n1#I31$r=c3RmmQZ(SDyk{o$d~ zE zP~2h+p&5sT(E2>ry&!a>$>>*!(IN$rQTDZIeyxP8SZysRVW(Iab} zWu98km0)kVV2Txmyb1|rpl!vdTJ6TaW?3RtxicccWo~{gB^Z<$cqWVpfnW2W4emEW z(B;&;w(r1>5|^BgND2qcJs(%`AK?5+{+~Nfr3Gu&@nM(!4KL|W@AScWH;PI)@5WK1#JpZVwXm|XGO!w}s#Fnb+wUDa8fC;f$y3QckY`UL7=2`i?%yvE*DGCSWCqz=|Hr_5R5yxxG)E9x0Ig zF$Bn#KVz|_g@8-;r+=3Y_;*1F--_39QAW0x7J&!rC7|lSY!(qx4WyW@^3$aId#e3^ z&!qdEevXj!H->BEj?Nkm4nP0|LzI8P*~sZpjIC3PoD$^vSO}o4%kD0Y1i9Eu#5=MZ zV)IevQmWUK0=Wh3^;4=N?9$uGQ8B~ZK-ge^-$@SGRnr_FA5~RV$f&1zxLPvtD7Nc9 zGF!k!r3epuwK(2oYGkETOXtzS;mY>re+*v>Lg3oD(3xN)1S9AOkl99p%J25PDANqv zF#oTZdhLsRBF$gh-vS)?|A2*}kdQZ_^cg^QY-L~zqk9xC5FtCoV9AUvd$GdupbAjr zDA(_=W=sLQ>Nx)->DIRQER58zWRQLa2o(rW9rPj>`f%3& z3~7zmB?z9(D{!SU^B^8Z8cVbeG^4{AJalq{RXl@w0yA6T83JsCqqnmQBdBeUAaoCUQCy4(yz%qwVj~CIj|`+;wBz z2&LRXuaWDz!XMKH>_r6j3MR-88QK@jYw->mfidcCdNhMF&oXcvC7f9aGJcqrGXH%5 z?mg6j9Ndh_;wwBu5{oV+fLMr57l?r<_+tf(I>rt0i2KQtV!wU+_DE@ee}72{qw8=Ge2VrekHh((m8dC;yac0QM;ZTR;%GrGWi}$&nE;n6Zho9I#i~$S4!x zsvvi=Sn<~Z0>Xd2Veda>?q*see=&DJx`Wr9pB@=X?VIVdRi=k?Mu;tYlmaLHVSEQ; zHKJs8$XykPsqkCU{!3@5NTCkjDuIOvrj~VmFNta49ZpFDwd1X*vJdLUDorE`Tb7#E z(h)gGsMd7BMSVAQ?Pzm-l?UC+EH05gMv)+g!?lv0-o}O4$$;)_zz#tJ6NJneO;#|k zcV|I|Vw5k9DheyOY33$9Mh_`_20)v=C3&+19$1cH^-^67btEHpCk9sJ-lXw_$W%O3XhRC$M_ZTzqZTW1rMQrh;#tCrYJsL`$&n$ zV4xJnZ7Q*9ES8HLx@R$8Wikv7DY?15J5Q3iSH+tqInTZtJxF(@Hj)Vf_SH$wzPQkY zM_dg*Fh*Yy2&9J(r@+O%%eHY z{fdsKWLh=Vfau|*|J=&_@HZh0A!rggMZJi1)D#fHxR<{&l99~e@sAxG$|s7wMSWi| z9tkE~EN9v75A&HX>u6%YcL(y_KQ@JhI03PIKF~5#=u9;Mdjb&2 zi+Mx%rZ4$^ZUMO@uKuwxgo8W0o;-TlSj@aXgMlE)8II+=K4)&q%8tUqjR+KA=I5W9 zoP34=2Vjq{H-B;zJPl~NXbfnLh%9|aPtW^(?vMCCT;2vigC~KJ7yJ+G-D9s~ zHhJvs>WP?|3OInj0&IYB>cw6c5LEa5nqr}8Wb>!asOlgcr%h2)cJ3`M$J}5NfeJ!4 z!v7|;#uMad=D5uRtAbso<_Ni)t^R&<7%=$2rJF&L^7A#@#+%ALHXB)iF0SDJly{zC zO{H7kcg9g%ac%cTYalgN&8m;+>7;sRAQzKcsL! z9pdSp-)^vD46y^}ZSo8jw7~|G+H&sxaLztL2KDbbZ0?mi)ClgWC9UwIH- z17CgkS`JW8#g)EVwxU^5+l4f*{DI-wYZ4s7KrOL2cH>;^Xnc(=#Kr}~2eBT{{rL|d z+T{I0lC7_u7L1*@nrq^;#*J{QMywSe;GdeohQ!z2&9Usb4zV2je%+=8FuN-Wo4osyaw zOG%I|3KuP~O(nBoAZKvJ6A99jOgB+t0cj4+Lo|*^>p>a>K0)hdeQ;2Wa;}St#?YC# zjqH^IvcbLR39D`;M=8&11eM|>vtMMy>F8U)yuzWf&YxuZ`#?v2-hm>X!;}?Q@tB8` z!fOmsT#}Re+TGXCMhEnH$C*(=;_j?TzK#I@Ha!F&iI-)cfvO?E8!?-H!PX~Qs5H>v`6bfxFdo14N~kp_>vNA47z9PSn7%X5y^mcq};(@5$Yu`t-EWoV}Nke?`&98vC<*d=66R>Ot`8# z&|CP-8zazRrzcgs{y+q9pK1zgX=wp%_ij|<3-f&wm;7*oWDp6(W09gQ^?%W3)zQ`@ zzb#zM(6}c2hLvGwM~6Y$Vc`5p7&xHw=!*Y~s(2_abuNrPxCD|&3ZLl?0n1h_W93W6 zFEtnb*4Fnm5r3wf;R3RsCNFa5`GaNrx3MNj=_*sq%2s7biEbNm29*0`N+J z?>wQ`W|IhmA&~T7V>k%FP@5# zIm6X<<~=8J)gLm7G<$|s_klLm>pVM&mt!%X>V{ z8OkVf2)fqC1ux?`7>>0(P8yDl9eONSW-J802x>U_D7SKUVN8OdWk4J=8-pFp!QLzd zQ%7n6R@!8d(e^m}AW)q8#|XNO65@Hx-2Y3)5!FR3g(cfI~Sf_55# z2s+Q)#^7fO;5k~N$-(_(>659=$+0#FiLsZUhdqwx`I<~ zHJ^Q!4_~#&g-4JXVg8$PBEVpu$lIAT^{I`@OmXtS5TUWE%kBwo!4fhe^S4{{(awhkNpg=`Jfxt7In5W3@)d7Pu!C9DL?p53ulWm`KA<$hwy zq|f8_?1?44Zy54Vm(HE2uSTB_I+peknNFArf~kp+JZ9*00w|{PTT3>oo<;tUdKP;E zy3bp;%Lhlg%MoWZ%*s8ohb!q*bw_O%fZ<+mo_x_QS2Ig97-(r{b~x1dX;w(Ahb3P@ zhB;Alm@+MXF1aLp@Qm?jd?)fPdg$v)W)C_WnY`pBO^y}|gCZsZQvLGB&i0}7jVtQ4 zJF#^&B;?E?-DxY9y?KP`1a+kHKbQ(h?p5%cI-ETT&0w^qwUaaj4qjZ2f1|$t&3}D0 z=~Qp!^=;k*bN=5r0H|vh{?%{)sc*Hc?H`6{zFYe$%gej})i-mCY?U-p=O-g_;x;c1 z`5Tfk0{;XE5c;eAZ%apj{E;*OJV&qN{r!zUqns`1R*`?yMtRU__9FUccfm@=5%t>o z?GxnE^u3F+rkLTd{Cg(8CbL<;l{g`}i)|vBn-57K zgG0xIe}6tAb`OVR+#5H$A-{lbmRKc1&N^fc4GkH!=M5*buiqLGE^I;Tj{?kcbTdyxjot~Y4)i{T@hjy<+1ZtZ6PrYMk#S__K>z!*sk7$GKuvkx z?Djz=T;wW-XPZA})EM)jR{O|pP}9628^AQ~KT|3*P(rZ--w8P$(%*a3&ZNbbSHVA= zSSGuu62hoS|SV#5o~d8Ie%3Kn`pAEv$wGmycK$6 ze2tBqH2Gep-~V1)3x<$uYp13^YwHA1TXQJD*?-6^4+O%+rmG?xOed7*-k1l0A%y=; zo+&mm`J)$+vXlK+AJ>@J-q3;xcxli~dtfOboSmlY92GpecZHh?CF9sl(lAfhRNWWM zS%{$~_s|hk3?4am*~o(9T@QU=P`KarDm_!i*_LDL%FD<{HfKPzgzMUSJ74=1`@zxV z$zvx=tug__=U0JRc+R9+5pkQ|S1`rD&hp@UF6ZZePd%IOY?4w>Go}>l*@NnwtOf?l zNfmKVC=2@BGUqJ4=s;c|>1}a3!>md^EtYnIogbdvoH@It#ZV)P(E0qw*=GJP)G$AF zNo#UDhNK1p>`?3tho8JH$#>;i7FThZyp{;Wn8=TSgW-^4?RQ#+;u0n4ORbwuGN?V& zW*`w|wo(VHzF8mtAtkMN&W-w^n(tU5k-g#!ov#Xj2@Cn>({ds{Y)Z@PWUO1W*0RWrMHS< znBh&n?wo%r=RcECC0y5m1D&HcJ|^j#>#_g;G++H4`2p&|1&=PJPlJSdw(L1z3E~^1 zeF2=%`h77B`~ZyTCXt=x*T*ByS<{=XHUM5n7UgQL)Z)5`>Yjm-b_L13+3FNOZ{DL` zN~Q*m$Ayp(+}AlOWUh8LBO~K{aslYufSv+iH+}-SC^;|1)(1xG0n+WW|Ji(Gz9$%e zKS#nT0^CdknSN%p)XG8T=afjZ8w<3PWlG=~KQOWyC_OpwKK>PIY5DNrYbq-WF88}D z=%5>{>1wlm&Gt2LAjGU0B^}<~|2DW|_Mct+|NU>}{s0=fkxOzeVt898QykPk8WzyC zN)(a`?^2$3WL45|84$tLP3Fx&)eG4o=bgqD%<~KP!{u4iFP#)~J`LgE7=y)&f*=9#d);a7Q8)-D$BoJ^VS zw)A8ajO299nwOo#LNTv>@nxfy+|-&&Y|Juq+c=H=RaWNdxL^ExT-==3J-$u%NR<0|q1J2|-=;+~ zZvV89e1rUh!wxsG3>03jkj!n}M;a9p+h!V#*OkUI-{2e1C3qKF))`H`pwXSmRZI8m zN!63M$~>)KK?NJ27VWY*W zQ)DezvXGXox+lf_XG3Y=;j-Q;AX9Fpc3lBjt^GyOe9CK!=1*F6+I%S)mnNLzBgdiW z5wRFv3J(0jCurDdnG4<#Se5veK#DPYDG#lEbGMmv-sbX81BaIQ6tv<-UF~T@P{n4x zdqIkQA zOodNJUK(13$SPhA9L3h7bd3rL{ z1}>QfUr6?f$HV>3vIIu>u_zfUYk3sixQ{=dyjyP)*-<>Rl-WpN;Dk@-#=pbd%1u;3 zI}77;buE^c4VC9g#%G%EG`Ky6xkT|SFxAOSJyz1}vVNK+j@;#k@1UGcsw;Np7(&b#e*M}=eAT-#<-voHLR(k94qFB!M`88NHLy&+9NzwOjvB}Dc^j3w*(SZ! z$>r%KIZ-I3PZ}Bm!Q#}d$##p4_|J~8xGT$(l(aiTeGJQ`=l@vfn_jb#F&cHx#281d zTV%aw&vzZvj?=#Pz9;X6=dy%dptg@S3bVx_!D5ioU43vZt5prXDPW-JTi^nY1 zduhn)cB})E7hrmc9eMY`%JodPjoov$CC*+P+7*}y&>@`DE7s{&`FQyYe25|qj*sh9 z`FJE?gKs#H-I-fS?fs&SLeXwLh5ls;$cD%L*3U**Whf>~YD1+`W=9V*;xM(IzwO*e z5MUNS69f8NQ{#1e#Q3Xh6%5qWu9#MPj#Ad)f=maFvUlyYhEMJz?Iq`e5U>r05PT={ zY;$ziZ&6YieT26!PTJ8DTg}E9DJf`ZDi)aZ|ImzJ-&8H8OCe&{N{F(&_|`l68AV9K z`~xF-A~F}$=&>=4Ma;DphRLhaC{9z&_a8s{jIhivFePR;dFWJ_8IM9Zz|%DwRQ82> zCe+sOMnYGIms+(lz9Zl|Sa;r}br;K=ZJ0JD-|iR3+2yX$xlGI`GTSN8mrKM~RL|3X zG_wFXTFzjlE>t6VXMfQK`6U;3x__y~qE~{gTXQ!hR#rM?njmwN_Z2jIP4C2BjheDf zalH&D&klP1KAXgJF~~+CJg&m&o}=_;*qPijdrEQ7hcGCywgBAV$TK6Sw>h7P=gNk% z#D$2sT8pYK`jcq*lw`tuvb?1HFJMKX*X<@bK2UUBR@ee3AC=bTM_FA2tCz0^D~h8n zsy7B*rI`Q5Y|MjxWxFU%rvEqlmp#5&#T3nOLuCGlU_i;MYLE!O`|@%;cLx>55t=*F z+@g(5+4YKAzx8%8V?-)@s_?{a?dL(3TLtE+C1+^cG50=E0P$`2?F%HXIh1-29v^_q zj9;xJ(r~x;A_M8}__gSs*rOSlQn#wL2)l6EuZJJqaCQs}m^$LnQyPn6@6YLprz!j< za9!FrVMslV2|VmfHJ*7mA}bAvQj!Ffw$~> z+aXTVb@q9_-aO<6ux|$DeWb~l;!U;xqWp%Qmg{M48sE^Bb!>@J1j0( znVzA#l=qu0x16mf!IOJL2%$BYL0u9h^BQ-RcTXNbY{Pokw}^jmrd{%i+D;ioXf6as zeF*`8h>S;x7i0qNZ0&Y*sA!Z2-$70HnrdRKelU?9)CqTQaP-o)kaPj?`n$1??|{_* zOkn+g^jmK&{duW1DX6-u<$$m5@lp(vzdVKw=p6S*o}D;aAgjr-;;Zedm*W?oavRyS zkxd4}w%V0#mO$C&k|hZk>BpO`iZ^Preg+8VGqsXjpc#<!dv!hWLF=PxZdsvP zxxdjp(oJ3Btv>~>HJNW8_X1;AW_8enh_2;GL)Qg_}dl$aoik?y6oCZzkgwBS*tGN zWq+e*&En@~`5T(W>VhE4hw~R=61r!`UueU#prxGCMG;es6dM89yOkjb&yJZH7VozX zVLHwAe~4XeGZPTi^}Wh17IOhOGCjMjKw)u&4C%B{QR?7qyNcjq6a!|;a;*%xrrnoE z1R+Y;N?E#XR^d2E!kOh_OiW#%WJ2jY=zV-3Pk?Y)SxRfFw#Qd8OgD#7X&simU$O}k ztavikwkFOkJb}D(UL+LR{l9Tfa<9Xskn%CEpK<|yb z%cMqs@~)iOIKvItCbOF!ze=7RLYtlAbcCqF6C_>QTRWvKC+4o)xaId{{bn_ZG!=^P zQXiZ4>vslir3*HSg}h)<98;`<#-iudnoVrEV}&l}KBd$H)By4W%;gCtY2xILTO{(G z9V!@4%}`SUgPL-~&e%&+$%f&=yG0(qIrl{3NbXKur)g?Kp-3=zf>Z9a=H_d(DS zW{09il11yfqvVbxD5jM)p55zRGO=cs@-E$WRZAkyq?Qj)jt)IJ23P}UGJhzH4yw0n zFTkb~RtJjie>}l_V9)#iXa|Ts%no$j^;Rcysx-s_n7VHaF)|0PPY_l2Cx4I&vp#G{p!F-iaeM|p}i^0f+VJ;eAR^MA{7~hUf+n)w> zh%sR>=|pTNdh`MV6sAw#d=>!&pErXCTY{uBricm=D+SU5939lkdQBS;liLVrnqB$~ zzKbZf-|0#iTIkJ|ml#9Ku;9lgs3Jh!{H34?MzMCMmKb@AaslO7un~1lx=N72_QfSF-e(t>6VS4+W?n1q(M(FE1yW)@S&9g@Z(#V-pv60ZT`MAxOH1}X9w(ma~ltK zkz#Rj)1Mh_edt51gJ#ui4Qe}LO7xfO^nbb8e|5bktt7}8veHbS7PmFrPDwMYzg#oD z{Lwx7k}B9bM2~mY!bil`bjC!SAJR1_Dk+ZHH)|V*jx}sXbcqXgjzbeuA6Y9<>z#z+ z7MqccdbWm3uQA?w{w!jxr?2)TC@k+@Q$y0t3O?O=FdV#OyJ8_AAnBj9XV8gf_yQd@ z%R_=3DvPA=X_y+F`_&ig=$vy}g}w=g!@oUhZ<;9NF6$rY)g8RbvX5A=)2Uuc{bJ)| z3R4)pNbC2EX-CC2v$4V$QHj`DHBOdY4wP0&XB&K^m@Lrevl@k5ZUhYnzRMnI_(uU_ z@tD_)%qc|;D#R?BLMOi&*m64}_$~f?P?)!mPk2_=r-6aW%F3{tgnpmdy~IoCj9N^lB3VLA*FFw0(l*lnVV+3&PuyJ2b3Y6J5D3U-^fXYjp#seSEaJ3C4sJw-vVrNw4Te&sQ3yZO^Uu;)9 zAkoki_0WebPq)Mm zw+dv!g$ix$!6Ns)bY*BcT7ZM_{lF+b{i`78Eb8@*2I$7x&9J_L``(FQCsZ~pt=&-8 zG3lSxqc|&->?wL5IhbRcDU0iflJtJaQj!lH%($2=@U{waSqxXb4(*mqoC)0Kv$IT_ zH42b{pfk^m2oIPrpCCrr%~aU;QZ;NEUyZo=Q;d*}OY7w|xnBguX2i_6SF^j4cVcUC zv0Jt5!Qceh(W-p@r{;o=&uqS_n}>nW4lJtR_ALgm8xVgJ41(Ks+NeR zFZ%UML6MR>1F+!~eh~zeOWoDxRGOcFEhzbap?;!mA_I)N(-f*5Wa#spDGU z3Fh>CdOyuNEHay*mGr@ibE_<_HH|RnnIE%xeQVGbp`_E%d85PA&_le>1J6Q4qFrlO z!Jy`liFaRU{Z2CxW_RXVTxvObOq4^VXYFw!B#RgsBjQ~TIFn&jR?QX;zqz@Wl1F1YlWBeEWsWBJj=nNkCOvK(k4cYPWYD_ot+aYV;7X+7 zI7P6x_gGy+_g3`nI=j7Lw=`%1U8VKSmuoph_9!QjQ8bFKc-wOX<~lSTM5Q+9W4wZ7mwpdC{~$5n#h%3)AK*U6)o} zdv&9DlP<~!DQE7Cq`u!{4>sRzV+;O50eO70dc@yf?>A4@&M&v|J)0Wz{s=8dMZ5Sli6wZCTqbg1 z?BgTW7>b_5IMlM(w#gCOTmjKko*bhE9Ko4htrr(dK@$AH!&{6=he+0th5;bg-KOZ98*t1i7d(5%nP=ag3FOAMZl+T8U$4nc->{a?L;C>flNRi zplitg`cJtJq_-!%{+56LU%uB5P9$3L+j40a9^aH9M%4`By43^kv@=3>r~GEIdz;(n zz;r8t0AeUIenpCf&ek_ zno^0AIi3)fg&{*e~y@EJqFwi!ipU__DEJ#qQ-16{S z|DA|a*G?q5O0iV7i(~(D6kl4E{cEYy_BBE@==cV8lj#gjFUXbf@>n=b zEJMbnZqy}v!6f+6%(8<2Y$UwDAFi~=Q&>wt8FfXri$1iOoABPdws zqp4Fuq@c@$;J8b5){re~y#^Ji-qxefjCD`a#-j2dMgkCus)7Z(^5Cq6TAati zYguGLr0DXY_ihR{LPF?m(?y&>3v5>+k&z4QeFnt0fC_ghUBafT%Md?QuNKo zai}G~GY-WHamRcpCBiEB4Trm4q!Nr~*^ zn{_>80{RM3`+JWeo5c%fb2krHP5;I@y)#h8>^)rSvV5H%^C7XhAmhoBj5M!dO?hl$ zBhL6Wfz5breR5*QV5vhDWmnw!$bGnYcIl3ZV_e{T-vLP3{=%$yj=& z!hNZ)8~fzwbtamRjIC`6b?s-EeiS)RguQhYmDf~jz_070-W;*v0~f)4uGx0kp^UC( zaV1p7ZL9Avn-3J>yfU*yk<412vaUdwZ9eQmInrKOwXeEw=uU<1nQMO#CX6;7sFxUt z)8iQE_Z#0y9AJzaDR?kku5*h$-zv*Ogs2TwOZ{9C6Ukjz7SmxEw^}zuoBQPlZl9PuT?ut@#>I4jtKjOCkMqHdziOPd>sSE(3jidh}P9 z&>ODr9aGYG!0lOlqs;yTgX-HLYii(20Dr>&;*%fYezh literal 0 HcmV?d00001 diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png new file mode 100755 index 0000000000000000000000000000000000000000..a4b89bf56ab2ba88cab87841916eb680a816deae GIT binary patch literal 55769 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�)v~C(0C)c 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 M)78&qol`;+0Fu7JivR!s literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md index f440c20af..27ece4791 100644 --- a/docs/output.md +++ b/docs/output.md @@ -10,50 +10,59 @@ The directories listed below will be created in the results directory after the ## Pipeline overview -The pipeline is built using [Nextflow](https://www.nextflow.io/) -and processes data using the following steps: +The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - Read quality control -* [MultiQC](#multiqc) - Aggregate report describing results from the whole pipeline +* [FastQC](#fastqc) - Raw read QC +* [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -## FastQC +### FastQC -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. +
+Output files -For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). +* `fastqc/` + * `*_fastqc.html`: FastQC report containing quality metrics. + * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. -**Output files:** +
-* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics for your untrimmed raw fastq files. -* `fastqc/zips/` - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. +![MultiQC - FastQC sequence counts plot](images/mqc_fastqc_counts.png) -## MultiQC +![MultiQC - FastQC mean quality scores plot](images/mqc_fastqc_quality.png) -[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarizing all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. +![MultiQC - FastQC adapter content plot](images/mqc_fastqc_adapter.png) -The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. +> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. -For more information about how to use MultiQC reports, see [https://multiqc.info](https://multiqc.info). +### MultiQC -**Output files:** +
+Output files * `multiqc/` - * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: directory containing static images from the report in various formats. + * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + * `multiqc_plots/`: directory containing static images from the report in various formats. -## Pipeline information +
-[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. -**Output files:** +Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . + +### Pipeline information + +
+Output files * `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. - * Documentation for interpretation of results in HTML format: `results_description.html`. + * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. + * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. + +
+ +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/usage.md b/docs/usage.md index 1040afb1f..49bda59c7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,19 +8,63 @@ +## Samplesheet input + +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. + +```console +--input '[path to samplesheet file]' +``` + +### Multiple runs of the same sample + +The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: + +```console +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +``` + +### Full samplesheet + +The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. + +A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. + +```console +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz +CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz +TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, +TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +``` + +| Column | Description | +|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | + +An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. + ## Running the pipeline The typical command for running the pipeline is as follows: -```bash -nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker +```console +nextflow run nf-core/chipseq --input samplesheet.csv --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. Note that the pipeline will create the following files in your working directory: -```bash +```console work # Directory containing the nextflow working files results # Finished results (configurable, see below) .nextflow_log # Log file from Nextflow @@ -31,13 +75,13 @@ results # Finished results (configurable, see below) When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```bash +```console nextflow pull nf-core/chipseq ``` ### Reproducibility -It's a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. +It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/chipseq releases page](https://github.com/nf-core/chipseq/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. @@ -51,7 +95,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. When using Biocontainers, most of these software packaging methods pull Docker containers from quay.io e.g [FastQC](https://quay.io/repository/biocontainers/fastqc) except for Singularity which directly downloads Singularity images via https hosted by the [Galaxy project](https://depot.galaxyproject.org/singularity/) and Conda which downloads and installs software locally from [Bioconda](https://bioconda.github.io/). > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -63,27 +107,20 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Docker](https://docker.com/) * `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) * `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Podman](https://podman.io/) * `shifter` - * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) * `charliecloud` - * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) * `conda` - * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. - * A generic configuration profile to be used with [Conda](https://conda.io/docs/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) + * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. * `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters + * A profile with a complete configuration for automated testing + * Includes links to test data so needs no other parameters ### `-resume` @@ -95,29 +132,140 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. -#### Custom resource requests +## Custom configuration + +### Resource requests + +Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. + +For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: + +```console +[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' + +Caused by: + Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. +Command executed: + STAR \ + --genomeDir star \ + --readFilesIn WT_REP1_trimmed.fq.gz \ + --runThreadN 2 \ + --outFileNamePrefix WT_REP1. \ + -Whilst these default requirements will hopefully work for most people with most data, you may find that you want to customise the compute resources that the pipeline requests. You can do this by creating a custom config file. For example, to give the workflow process `star` 32GB of memory, you could use the following config: +Command exit status: + 137 + +Command output: + (empty) + +Command error: + .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. +Work dir: + /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb + +Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` +``` + +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: star { - memory = 32.GB - } + withName: STAR_ALIGN { + memory = 100.GB + } } ``` -To find the exact name of a process you wish to modify the compute resources, check the live-status of a nextflow run displayed on your terminal or check the nextflow error for a line like so: `Error executing process > 'bwa'`. In this case the name to specify in the custom config file is `bwa`. +> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. + +### Tool-specific options + +For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. + +The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: + +* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. + +* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. + +The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. + +When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. + +As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. + +Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. + +As you will see in the example below, we have: + +* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. +* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. +* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. + +```nextflow +params { + modules { + 'star_align' { + args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" + publish_dir = "my_star_directory" + publish_files = ['out':'log', 'tab':'log', 'bam':''] + } + } +} +``` + +### Updating containers + +The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. + +1. Check the default version used by the pipeline in the module file for [Pangolin](https://github.com/nf-core/viralrecon/blob/a85d5969f9025409e3618d6c280ef15ce417df65/modules/nf-core/software/pangolin/main.nf#L14-L19) +2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) +3. Create the custom config accordingly: + + * For Docker: + + ```nextflow + process { + withName: PANGOLIN { + container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + * For Singularity: + + ```nextflow + process { + withName: PANGOLIN { + container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + * For Conda: + + ```nextflow + process { + withName: PANGOLIN { + conda = 'bioconda::pangolin=3.0.5' + } + } + ``` + +> **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. + +### nf-core/configs -See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. +In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. -If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition above). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -### Running in the background +## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -126,11 +274,11 @@ The Nextflow `-bg` flag launches Nextflow in the background, detached from your Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -#### Nextflow memory requirements +## Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```bash +```console NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 88677053e..000000000 --- a/environment.yml +++ /dev/null @@ -1,15 +0,0 @@ -# You can use this file to create a conda environment for this pipeline: -# conda env create -f environment.yml -name: nf-core-chipseq-1.3.0dev -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - conda-forge::python=3.7.3 - - conda-forge::markdown=3.1.1 - - conda-forge::pymdown-extensions=6.0 - - conda-forge::pygments=2.5.2 - # TODO nf-core: Add required software dependencies here - - bioconda::fastqc=0.11.8 - - bioconda::multiqc=1.7 diff --git a/lib/Headers.groovy b/lib/Headers.groovy deleted file mode 100644 index 15d1d3880..000000000 --- a/lib/Headers.groovy +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file holds several functions used to render the nf-core ANSI header. - */ - -class Headers { - - private static Map log_colours(Boolean monochrome_logs) { - Map colorcodes = [:] - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['yellow_bold'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - colorcodes['red'] = monochrome_logs ? '' : "\033[1;91m" - return colorcodes - } - - static String dashed_line(monochrome_logs) { - Map colors = log_colours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - static String nf_core(workflow, monochrome_logs) { - Map colors = log_colours(monochrome_logs) - String.format( - """\n - ${dashed_line(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} - ${dashed_line(monochrome_logs)} - """.stripIndent() - ) - } -} diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy old mode 100644 new mode 100755 index 52ee73043..8d6920dd6 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -1,6 +1,6 @@ -/* - * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. - */ +// +// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. +// import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader @@ -13,16 +13,23 @@ import groovy.json.JsonBuilder class NfcoreSchema { - /* - * Function to loop over all parameters defined in schema and check - * whether the given paremeters adhere to the specificiations - */ + // + // Resolve Schema path relative to main workflow directory + // + public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { + return "${workflow.projectDir}/${schema_filename}" + } + + // + // Function to loop over all parameters defined in schema and check + // whether the given parameters adhere to the specifications + // /* groovylint-disable-next-line UnusedPrivateMethodParameter */ - private static void validateParameters(params, jsonSchema, log) { + public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false //=====================================================================// // Check for nextflow core params and unexpected params - def json = new File(jsonSchema).text + def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') def nf_params = [ // Options for base `nextflow` command @@ -114,7 +121,8 @@ class NfcoreSchema { def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !expectedParamsLowerCase.contains(specifiedParamLowerCase)) { + def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { // Temporarily remove camelCase/camel-case params #1035 def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ @@ -125,36 +133,36 @@ class NfcoreSchema { //=====================================================================// // Validate parameters against the schema - InputStream inputStream = new File(jsonSchema).newInputStream() - JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)) + InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() + JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) // Remove anything that's in params.schema_ignore_params - rawSchema = removeIgnoredParams(rawSchema, params) + raw_schema = removeIgnoredParams(raw_schema, params) - Schema schema = SchemaLoader.load(rawSchema) + Schema schema = SchemaLoader.load(raw_schema) // Clean the parameters def cleanedParams = cleanParameters(params) // Convert to JSONObject def jsonParams = new JsonBuilder(cleanedParams) - JSONObject paramsJSON = new JSONObject(jsonParams.toString()) + JSONObject params_json = new JSONObject(jsonParams.toString()) // Validate try { - schema.validate(paramsJSON) + schema.validate(params_json) } catch (ValidationException e) { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, paramsJSON, log) + printExceptions(exceptionJSON, params_json, log) println '' has_error = true } // Check for unexpected parameters if (unexpectedParams.size() > 0) { - Map colors = log_colours(params.monochrome_logs) + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) println '' def warn_msg = 'Found unexpected parameters:' for (unexpectedParam in unexpectedParams) { @@ -170,266 +178,17 @@ class NfcoreSchema { } } - // Loop over nested exceptions and print the causingException - private static void printExceptions(exJSON, paramsJSON, log) { - def causingExceptions = exJSON['causingExceptions'] - if (causingExceptions.length() == 0) { - def m = exJSON['message'] =~ /required key \[([^\]]+)\] not found/ - // Missing required param - if (m.matches()) { - log.error "* Missing required parameter: --${m[0][1]}" - } - // Other base-level error - else if (exJSON['pointerToViolation'] == '#') { - log.error "* ${exJSON['message']}" - } - // Error with specific param - else { - def param = exJSON['pointerToViolation'] - ~/^#\// - def param_val = paramsJSON[param].toString() - log.error "* --${param}: ${exJSON['message']} (${param_val})" - } - } - for (ex in causingExceptions) { - printExceptions(ex, paramsJSON, log) - } - } - - // Remove an element from a JSONArray - private static JSONArray removeElement(jsonArray, element){ - def list = [] - int len = jsonArray.length() - for (int i=0;i - if(rawSchema.keySet().contains('definitions')){ - rawSchema.definitions.each { definition -> - for (key in definition.keySet()){ - if (definition[key].get("properties").keySet().contains(ignore_param)){ - // Remove the param to ignore - definition[key].get("properties").remove(ignore_param) - // If the param was required, change this - if (definition[key].has("required")) { - def cleaned_required = removeElement(definition[key].required, ignore_param) - definition[key].put("required", cleaned_required) - } - } - } - } - } - if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').keySet().contains(ignore_param)) { - rawSchema.get("properties").remove(ignore_param) - } - if(rawSchema.keySet().contains('required') && rawSchema.required.contains(ignore_param)) { - def cleaned_required = removeElement(rawSchema.required, ignore_param) - rawSchema.put("required", cleaned_required) - } - } - return rawSchema - } - - private static Map cleanParameters(params) { - def new_params = params.getClass().newInstance(params) - for (p in params) { - // remove anything evaluating to false - if (!p['value']) { - new_params.remove(p.key) - } - // Cast MemoryUnit to String - if (p['value'].getClass() == nextflow.util.MemoryUnit) { - new_params.replace(p.key, p['value'].toString()) - } - // Cast Duration to String - if (p['value'].getClass() == nextflow.util.Duration) { - new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) - } - // Cast LinkedHashMap to String - if (p['value'].getClass() == LinkedHashMap) { - new_params.replace(p.key, p['value'].toString()) - } - } - return new_params - } - - /* - * This method tries to read a JSON params file - */ - private static LinkedHashMap params_load(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = params_read(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - private static Map log_colours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes - } - - static String dashed_line(monochrome_logs) { - Map colors = log_colours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - /* - Method to actually read in JSON file using Groovy. - Group (as Key), values are all parameters - - Parameter1 as Key, Description as Value - - Parameter2 as Key, Description as Value - .... - Group - - - */ - private static LinkedHashMap params_read(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') - def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - * properties <- parameters can also be ungrouped, outside of definitions - parameter 1 - type - description - */ - - // Grouped params - def params_map = new LinkedHashMap() - schema_definitions.each { key, val -> - def Map group = schema_definitions."$key".properties // Gets the property object of the group - def title = schema_definitions."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - - // Ungrouped params - def ungrouped_params = new LinkedHashMap() - schema_properties.each { innerkey, value -> - ungrouped_params.put(innerkey, value) - } - params_map.put("Other parameters", ungrouped_params) - - return params_map - } - - /* - * Get maximum number of characters across all parameter names - */ - private static Integer params_max_chars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } - - /* - * Beautify parameters for --help - */ - private static String params_help(workflow, params, json_schema, command) { - Map colors = log_colours(params.monochrome_logs) + // + // Beautify parameters for --help + // + public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) Integer num_hidden = 0 String output = '' output += 'Typical pipeline command:\n\n' output += " ${colors.cyan}${command}${colors.reset}\n\n" - Map params_map = params_load(json_schema) - Integer max_chars = params_max_chars(params_map) + 1 + Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) + Integer max_chars = paramsMaxChars(params_map) + 1 Integer desc_indent = max_chars + 14 Integer dec_linewidth = 160 - desc_indent for (group in params_map.keySet()) { @@ -469,18 +228,17 @@ class NfcoreSchema { output += group_output } } - output += dashed_line(params.monochrome_logs) if (num_hidden > 0){ - output += colors.dim + "\n Hiding $num_hidden params, use --show_hidden_params to show.\n" + colors.reset - output += dashed_line(params.monochrome_logs) + output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset } + output += NfcoreTemplate.dashedLine(params.monochrome_logs) return output } - /* - * Groovy Map summarising parameters/workflow options used by the pipeline - */ - private static LinkedHashMap params_summary_map(workflow, params, json_schema) { + // + // Groovy Map summarising parameters/workflow options used by the pipeline + // + public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { // Get a selection of core Nextflow workflow options def Map workflow_summary = [:] if (workflow.revision) { @@ -503,7 +261,7 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] def blacklist = ['hostnames'] - def params_map = params_load(json_schema) + def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group @@ -546,14 +304,14 @@ class NfcoreSchema { return [ 'Core Nextflow options' : workflow_summary ] << params_summary } - /* - * Beautify parameters for summary and return as string - */ - private static String params_summary_log(workflow, params, json_schema) { - Map colors = log_colours(params.monochrome_logs) + // + // Beautify parameters for summary and return as string + // + public static String paramsSummaryLog(workflow, params) { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) String output = '' - def params_map = params_summary_map(workflow, params, json_schema) - def max_chars = params_max_chars(params_map) + def params_map = paramsSummaryMap(workflow, params) + def max_chars = paramsMaxChars(params_map) for (group in params_map.keySet()) { def group_params = params_map.get(group) // This gets the parameters of that particular group if (group_params) { @@ -564,10 +322,196 @@ class NfcoreSchema { output += '\n' } } - output += dashed_line(params.monochrome_logs) - output += colors.dim + "\n Only displaying parameters that differ from defaults.\n" + colors.reset - output += dashed_line(params.monochrome_logs) + output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" + output += NfcoreTemplate.dashedLine(params.monochrome_logs) return output } + // + // Loop over nested exceptions and print the causingException + // + private static void printExceptions(ex_json, params_json, log) { + def causingExceptions = ex_json['causingExceptions'] + if (causingExceptions.length() == 0) { + def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ + // Missing required param + if (m.matches()) { + log.error "* Missing required parameter: --${m[0][1]}" + } + // Other base-level error + else if (ex_json['pointerToViolation'] == '#') { + log.error "* ${ex_json['message']}" + } + // Error with specific param + else { + def param = ex_json['pointerToViolation'] - ~/^#\// + def param_val = params_json[param].toString() + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } + } + for (ex in causingExceptions) { + printExceptions(ex, params_json, log) + } + } + + // + // Remove an element from a JSONArray + // + private static JSONArray removeElement(json_array, element) { + def list = [] + int len = json_array.length() + for (int i=0;i + if(raw_schema.keySet().contains('definitions')){ + raw_schema.definitions.each { definition -> + for (key in definition.keySet()){ + if (definition[key].get("properties").keySet().contains(ignore_param)){ + // Remove the param to ignore + definition[key].get("properties").remove(ignore_param) + // If the param was required, change this + if (definition[key].has("required")) { + def cleaned_required = removeElement(definition[key].required, ignore_param) + definition[key].put("required", cleaned_required) + } + } + } + } + } + if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { + raw_schema.get("properties").remove(ignore_param) + } + if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { + def cleaned_required = removeElement(raw_schema.required, ignore_param) + raw_schema.put("required", cleaned_required) + } + } + return raw_schema + } + + // + // Clean and check parameters relative to Nextflow native classes + // + private static Map cleanParameters(params) { + def new_params = params.getClass().newInstance(params) + for (p in params) { + // remove anything evaluating to false + if (!p['value']) { + new_params.remove(p.key) + } + // Cast MemoryUnit to String + if (p['value'].getClass() == nextflow.util.MemoryUnit) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast Duration to String + if (p['value'].getClass() == nextflow.util.Duration) { + new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) + } + // Cast LinkedHashMap to String + if (p['value'].getClass() == LinkedHashMap) { + new_params.replace(p.key, p['value'].toString()) + } + } + return new_params + } + + // + // This function tries to read a JSON params file + // + private static LinkedHashMap paramsLoad(String json_schema) { + def params_map = new LinkedHashMap() + try { + params_map = paramsRead(json_schema) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + // + // Method to actually read in JSON file using Groovy. + // Group (as Key), values are all parameters + // - Parameter1 as Key, Description as Value + // - Parameter2 as Key, Description as Value + // .... + // Group + // - + private static LinkedHashMap paramsRead(String json_schema) throws Exception { + def json = new File(json_schema).text + def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') + def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') + /* Tree looks like this in nf-core schema + * definitions <- this is what the first get('definitions') gets us + group 1 + title + description + properties + parameter 1 + type + description + parameter 2 + type + description + group 2 + title + description + properties + parameter 1 + type + description + * properties <- parameters can also be ungrouped, outside of definitions + parameter 1 + type + description + */ + + // Grouped params + def params_map = new LinkedHashMap() + schema_definitions.each { key, val -> + def Map group = schema_definitions."$key".properties // Gets the property object of the group + def title = schema_definitions."$key".title + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put(innerkey, value) + } + params_map.put(title, sub_params) + } + + // Ungrouped params + def ungrouped_params = new LinkedHashMap() + schema_properties.each { innerkey, value -> + ungrouped_params.put(innerkey, value) + } + params_map.put("Other parameters", ungrouped_params) + + return params_map + } + + // + // Get maximum number of characters across all parameter names + // + private static Integer paramsMaxChars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (param.size() > max_chars) { + max_chars = param.size() + } + } + } + return max_chars + } } diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy new file mode 100755 index 000000000..b6e689ec8 --- /dev/null +++ b/lib/NfcoreTemplate.groovy @@ -0,0 +1,266 @@ +// +// This file holds several functions used within the nf-core pipeline template. +// + +import org.yaml.snakeyaml.Yaml + +class NfcoreTemplate { + + // + // Check AWS Batch related parameters have been specified correctly + // + public static void awsBatch(workflow, params) { + if (workflow.profile.contains('awsbatch')) { + // Check params.awsqueue and params.awsregion have been set if running on AWSBatch + assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + } + } + + // + // Check params.hostnames + // + public static void hostName(workflow, params, log) { + Map colors = logColours(params.monochrome_logs) + if (params.hostnames) { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } + } + } + } + } + + // + // Construct and send completion email + // + public static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[]) { + + // Set up the e-mail variables + def subject = "[$workflow.manifest.name] Successful: $workflow.runName" + if (!workflow.success) { + subject = "[$workflow.manifest.name] FAILED: $workflow.runName" + } + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['Date Started'] = workflow.start + misc_fields['Date Completed'] = workflow.complete + misc_fields['Pipeline script file path'] = workflow.scriptFile + misc_fields['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision + misc_fields['Nextflow Version'] = workflow.nextflow.version + misc_fields['Nextflow Build'] = workflow.nextflow.build + misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + def email_fields = [:] + email_fields['version'] = workflow.manifest.version + email_fields['runName'] = workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary << misc_fields + + // On success try attach the multiqc report + def mqc_report = null + try { + if (workflow.success) { + mqc_report = multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { + if (mqc_report.size() > 1) { + log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" + } + mqc_report = mqc_report[0] + } + } + } catch (all) { + if (multiqc_report) { + log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" + } + } + + // Check if we are only sending emails on failure + def email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("$projectDir/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("$projectDir/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] + def sf = new File("$projectDir/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + Map colors = logColours(params.monochrome_logs) + if (email_address) { + try { + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" + } catch (all) { + // Catch failures and try with plaintext + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { + mail_cmd += [ '-A', mqc_report ] + } + mail_cmd.execute() << email_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" + } + } + + // Write summary e-mail HTML to a file + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + def output_hf = new File(output_d, "pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + def output_tf = new File(output_d, "pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } + } + + // + // Print pipeline summary on completion + // + public static void summary(workflow, params, log) { + Map colors = logColours(params.monochrome_logs) + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + } + } else { + hostName(workflow, params, log) + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } + } + + // + // ANSII Colours used for terminal logging + // + public static Map logColours(Boolean monochrome_logs) { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes + } + + // + // Does what is says on the tin + // + public static String dashedLine(monochrome_logs) { + Map colors = logColours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" + } + + // + // nf-core logo + // + public static String logo(workflow, monochrome_logs) { + Map colors = logColours(monochrome_logs) + String.format( + """\n + ${dashedLine(monochrome_logs)} + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${dashedLine(monochrome_logs)} + """.stripIndent() + ) + } +} diff --git a/lib/Utils.groovy b/lib/Utils.groovy new file mode 100755 index 000000000..18173e985 --- /dev/null +++ b/lib/Utils.groovy @@ -0,0 +1,47 @@ +// +// This file holds several Groovy functions that could be useful for any Nextflow pipeline +// + +import org.yaml.snakeyaml.Yaml + +class Utils { + + // + // When running with -profile conda, warn if channels have not been set-up appropriately + // + public static void checkCondaChannels(log) { + Yaml parser = new Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } catch(NullPointerException | IOException e) { + log.warn "Could not verify conda channel configuration." + return + } + + // Check that all channels are present + def required_channels = ['conda-forge', 'bioconda', 'defaults'] + def conda_check_failed = !required_channels.every { ch -> ch in channels } + + // Check that they are in the right order + conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda')) + conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) + + if (conda_check_failed) { + log.warn "=============================================================================\n" + + " There is a problem with your Conda configuration!\n\n" + + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + + " NB: The order of the channels matters!\n" + + "===================================================================================" + } + } + + // + // Join module args with appropriate spacing + // + public static String joinModuleArgs(args_list) { + return ' ' + args_list.join(' ') + } +} diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy new file mode 100755 index 000000000..4ca6323ae --- /dev/null +++ b/lib/WorkflowChipseq.groovy @@ -0,0 +1,59 @@ +// +// This file holds several functions specific to the workflow/chipseq.nf in the nf-core/chipseq pipeline +// + +class WorkflowChipseq { + + // + // Check and validate parameters + // + public static void initialise(params, log) { + genomeExistsError(params, log) + + if (!params.fasta) { + log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." + System.exit(1) + } + } + + // + // Get workflow summary for MultiQC + // + public static String paramsSummaryMultiqc(workflow, summary) { + String summary_section = '' + for (group in summary.keySet()) { + def group_params = summary.get(group) // This gets the parameters of that particular group + if (group_params) { + summary_section += "

$group

\n" + summary_section += "
\n" + } + } + + String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" + yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" + yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" + yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" + yaml_file_text += "plot_type: 'html'\n" + yaml_file_text += "data: |\n" + yaml_file_text += "${summary_section}" + return yaml_file_text + } + + // + // Exit pipeline if incorrect --genome key provided + // + private static void genomeExistsError(params, log) { + if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { + log.error "=============================================================================\n" + + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + + " Currently, the available genome keys are:\n" + + " ${params.genomes.keySet().join(", ")}\n" + + "===================================================================================" + System.exit(1) + } + } +} diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy new file mode 100755 index 000000000..bc960fcc8 --- /dev/null +++ b/lib/WorkflowMain.groovy @@ -0,0 +1,94 @@ +// +// This file holds several functions specific to the main.nf workflow in the nf-core/chipseq pipeline +// + +class WorkflowMain { + + // + // Citation string for pipeline + // + public static String citation(workflow) { + return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + // TODO nf-core: Add Zenodo DOI for pipeline after first release + //"* The pipeline\n" + + //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + + "* The nf-core framework\n" + + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + + "* Software dependencies\n" + + " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" + } + + // + // Print help to screen if required + // + public static String help(workflow, params, log) { + def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + def help_string = '' + help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) + help_string += NfcoreSchema.paramsHelp(workflow, params, command) + help_string += '\n' + citation(workflow) + '\n' + help_string += NfcoreTemplate.dashedLine(params.monochrome_logs) + return help_string + } + + // + // Print parameter summary log to screen + // + public static String paramsSummaryLog(workflow, params, log) { + def summary_log = '' + summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) + summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) + summary_log += '\n' + citation(workflow) + '\n' + summary_log += NfcoreTemplate.dashedLine(params.monochrome_logs) + return summary_log + } + + // + // Validate parameters and print summary to screen + // + public static void initialise(workflow, params, log) { + // Print help to screen if required + if (params.help) { + log.info help(workflow, params, log) + System.exit(0) + } + + // Validate workflow parameters via the JSON schema + if (params.validate_params) { + NfcoreSchema.validateParameters(workflow, params, log) + } + + // Print parameter summary log to screen + log.info paramsSummaryLog(workflow, params, log) + + // Check that conda channels are set-up correctly + if (params.enable_conda) { + Utils.checkCondaChannels(log) + } + + // Check AWS batch settings + NfcoreTemplate.awsBatch(workflow, params) + + // Check the hostnames against configured profiles + NfcoreTemplate.hostName(workflow, params, log) + + // Check input has been provided + if (!params.input) { + log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" + System.exit(1) + } + } + + // + // Get attribute from genome config file e.g. fasta + // + public static String getGenomeAttribute(params, attribute) { + def val = '' + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey(attribute)) { + val = params.genomes[ params.genome ][ attribute ] + } + } + return val + } +} diff --git a/main.nf b/main.nf index a7f4ec153..7a90164a5 100644 --- a/main.nf +++ b/main.nf @@ -1,390 +1,63 @@ #!/usr/bin/env nextflow /* ======================================================================================== - nf-core/chipseq + nf-core/chipseq ======================================================================================== - nf-core/chipseq Analysis Pipeline. - #### Homepage / Documentation - https://github.com/nf-core/chipseq + Github : https://github.com/nf-core/chipseq + Website: https://nf-co.re/chipseq + Slack : https://nfcore.slack.com/channels/chipseq ---------------------------------------------------------------------------------------- */ -log.info Headers.nf_core(workflow, params.monochrome_logs) - -//////////////////////////////////////////////////// -/* -- PRINT HELP -- */ -////////////////////////////////////////////////////+ -def json_schema = "$projectDir/nextflow_schema.json" -if (params.help) { - def command = "nextflow run nf-core/chipseq --input '*_R{1,2}.fastq.gz' -profile docker" - log.info NfcoreSchema.params_help(workflow, params, json_schema, command) - exit 0 -} - -//////////////////////////////////////////////////// -/* -- VALIDATE PARAMETERS -- */ -////////////////////////////////////////////////////+ -if (params.validate_params) { - NfcoreSchema.validateParameters(params, json_schema, log) -} - -//////////////////////////////////////////////////// -/* -- Collect configuration parameters -- */ -//////////////////////////////////////////////////// - -// Check if genome exists in the config file -if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(', ')}" -} - -// TODO nf-core: Add any reference files that are needed -// Configurable reference genomes -// -// NOTE - THIS IS NOT USED IN THIS PIPELINE, EXAMPLE ONLY -// If you want to use the channel below in a process, define the following: -// input: -// file fasta from ch_fasta -// -params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } - -// Check AWS batch settings -if (workflow.profile.contains('awsbatch')) { - // AWSBatch sanity checking - if (!params.awsqueue || !params.awsregion) exit 1, 'Specify correct --awsqueue and --awsregion parameters on AWSBatch!' - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - if (!params.outdir.startsWith('s3:')) exit 1, 'Outdir not on S3 - specify S3 Bucket to run on AWSBatch!' - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - if (params.tracedir.startsWith('s3:')) exit 1, 'Specify a local tracedir or run without trace! S3 cannot be used for tracefiles.' -} - -// Stage config files -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() -ch_output_docs = file("$projectDir/docs/output.md", checkIfExists: true) -ch_output_docs_images = file("$projectDir/docs/images/", checkIfExists: true) +nextflow.enable.dsl = 2 /* - * Create a channel for input read files - */ -if (params.input_paths) { - if (params.single_end) { - Channel - .from(params.input_paths) - .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true) ] ] } - .ifEmpty { exit 1, 'params.input_paths was empty - no input files supplied' } - .into { ch_read_files_fastqc; ch_read_files_trimming } - } else { - Channel - .from(params.input_paths) - .map { row -> [ row[0], [ file(row[1][0], checkIfExists: true), file(row[1][1], checkIfExists: true) ] ] } - .ifEmpty { exit 1, 'params.input_paths was empty - no input files supplied' } - .into { ch_read_files_fastqc; ch_read_files_trimming } - } -} else { - Channel - .fromFilePairs(params.input, size: params.single_end ? 1 : 2) - .ifEmpty { exit 1, "Cannot find any reads matching: ${params.input}\nNB: Path needs to be enclosed in quotes!\nIf this is single-end data, please specify --single_end on the command line." } - .into { ch_read_files_fastqc; ch_read_files_trimming } -} - -//////////////////////////////////////////////////// -/* -- PRINT PARAMETER SUMMARY -- */ -//////////////////////////////////////////////////// -log.info NfcoreSchema.params_summary_log(workflow, params, json_schema) - -// Header log info -def summary = [:] -if (workflow.revision) summary['Pipeline Release'] = workflow.revision -summary['Run Name'] = workflow.runName -// TODO nf-core: Report custom parameters here -summary['Input'] = params.input -summary['Fasta Ref'] = params.fasta -summary['Data Type'] = params.single_end ? 'Single-End' : 'Paired-End' -summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" -if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" -summary['Output dir'] = params.outdir -summary['Launch dir'] = workflow.launchDir -summary['Working dir'] = workflow.workDir -summary['Script dir'] = workflow.projectDir -summary['User'] = workflow.userName -if (workflow.profile.contains('awsbatch')) { - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue - summary['AWS CLI'] = params.awscli -} -summary['Config Profile'] = workflow.profile -if (params.config_profile_description) summary['Config Profile Description'] = params.config_profile_description -if (params.config_profile_contact) summary['Config Profile Contact'] = params.config_profile_contact -if (params.config_profile_url) summary['Config Profile URL'] = params.config_profile_url -summary['Config Files'] = workflow.configFiles.join(', ') -if (params.email || params.email_on_fail) { - summary['E-mail Address'] = params.email - summary['E-mail on failure'] = params.email_on_fail - summary['MultiQC maxsize'] = params.max_multiqc_email_size -} - -// Check the hostnames against configured profiles -checkHostname() - -Channel.from(summary.collect{ [it.key, it.value] }) - .map { k,v -> "
$k
${v ?: 'N/A'}
" } - .reduce { a, b -> return [a, b].join("\n ") } - .map { x -> """ - id: 'nf-core-chipseq-summary' - description: " - this information is collected when the pipeline is started." - section_name: 'nf-core/chipseq Workflow Summary' - section_href: 'https://github.com/nf-core/chipseq' - plot_type: 'html' - data: | -
- $x -
- """.stripIndent() } - .set { ch_workflow_summary } - -/* - * Parse software version numbers - */ -process get_software_versions { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode, - saveAs: { filename -> - if (filename.indexOf('.csv') > 0) filename - else null - } - - output: - file 'software_versions_mqc.yaml' into ch_software_versions_yaml - file 'software_versions.csv' +======================================================================================== + GENOME PARAMETER VALUES +======================================================================================== +*/ - script: - // TODO nf-core: Get all tools to print their version number here - """ - echo $workflow.manifest.version > v_pipeline.txt - echo $workflow.nextflow.version > v_nextflow.txt - fastqc --version > v_fastqc.txt - multiqc --version > v_multiqc.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* - * STEP 1 - FastQC - */ -process fastqc { - tag "$name" - label 'process_medium' - publishDir "${params.outdir}/fastqc", mode: params.publish_dir_mode, - saveAs: { filename -> - filename.indexOf('.zip') > 0 ? "zips/$filename" : "$filename" - } - - input: - set val(name), file(reads) from ch_read_files_fastqc - - output: - file '*_fastqc.{zip,html}' into ch_fastqc_results +======================================================================================== + VALIDATE & PRINT PARAMETER SUMMARY +======================================================================================== +*/ - script: - """ - fastqc --quiet --threads $task.cpus $reads - """ -} +WorkflowMain.initialise(workflow, params, log) /* - * STEP 2 - MultiQC - */ -process multiqc { - publishDir "${params.outdir}/MultiQC", mode: params.publish_dir_mode - - input: - file (multiqc_config) from ch_multiqc_config - file (mqc_custom_config) from ch_multiqc_custom_config.collect().ifEmpty([]) - // TODO nf-core: Add in log files from your new processes for MultiQC to find! - file ('fastqc/*') from ch_fastqc_results.collect().ifEmpty([]) - file ('software_versions/*') from ch_software_versions_yaml.collect() - file workflow_summary from ch_workflow_summary.collectFile(name: "workflow_summary_mqc.yaml") +======================================================================================== + NAMED WORKFLOW FOR PIPELINE +======================================================================================== +*/ - output: - file "*multiqc_report.html" into ch_multiqc_report - file "*_data" - file "multiqc_plots" +include { CHIPSEQ } from './workflows/chipseq' - script: - rtitle = '' - rfilename = '' - if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - rtitle = "--title \"${workflow.runName}\"" - rfilename = "--filename " + workflow.runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" - } - custom_config_file = params.multiqc_config ? "--config $mqc_custom_config" : '' - // TODO nf-core: Specify which MultiQC modules to use with -m for a faster run time - """ - multiqc -f $rtitle $rfilename $custom_config_file . - """ +// +// WORKFLOW: Run main nf-core/chipseq analysis pipeline +// +workflow NFCORE_CHIPSEQ { + CHIPSEQ () } /* - * STEP 3 - Output Description HTML - */ -process output_documentation { - publishDir "${params.outdir}/pipeline_info", mode: params.publish_dir_mode - - input: - file output_docs from ch_output_docs - file images from ch_output_docs_images - - output: - file 'results_description.html' +======================================================================================== + RUN ALL WORKFLOWS +======================================================================================== +*/ - script: - """ - markdown_to_html.py $output_docs -o results_description.html - """ +// +// WORKFLOW: Execute a single named workflow for the pipeline +// See: https://github.com/nf-core/rnaseq/issues/619 +// +workflow { + NFCORE_CHIPSEQ () } /* - * Completion e-mail notification - */ -workflow.onComplete { - - // Set up the e-mail variables - def subject = "[nf-core/chipseq] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[nf-core/chipseq] FAILED: $workflow.runName" - } - def email_fields = [:] - email_fields['version'] = workflow.manifest.version - email_fields['runName'] = workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary - email_fields['summary']['Date Started'] = workflow.start - email_fields['summary']['Date Completed'] = workflow.complete - email_fields['summary']['Pipeline script file path'] = workflow.scriptFile - email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision - email_fields['summary']['Nextflow Version'] = workflow.nextflow.version - email_fields['summary']['Nextflow Build'] = workflow.nextflow.build - email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - // TODO nf-core: If not using MultiQC, strip out this code (including params.max_multiqc_email_size) - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = ch_multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList) { - log.warn "[nf-core/chipseq] Found multiple reports from process 'multiqc', will use only one" - mqc_report = mqc_report[0] - } - } - } catch (all) { - log.warn "[nf-core/chipseq] Could not attach MultiQC report to summary email" - } - - // Check if we are only sending emails on failure - email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (sendmail)" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= params.max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } - mail_cmd.execute() << email_html - log.info "[nf-core/chipseq] Sent summary e-mail to $email_address (mail)" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - - c_green = params.monochrome_logs ? '' : "\033[0;32m"; - c_purple = params.monochrome_logs ? '' : "\033[0;35m"; - c_red = params.monochrome_logs ? '' : "\033[0;31m"; - c_reset = params.monochrome_logs ? '' : "\033[0m"; - - if (workflow.stats.ignoredCount > 0 && workflow.success) { - log.info "-${c_purple}Warning, pipeline completed, but with errored process(es) ${c_reset}-" - log.info "-${c_red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${c_reset}-" - log.info "-${c_green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${c_reset}-" - } - - if (workflow.success) { - log.info "-${c_purple}[nf-core/chipseq]${c_green} Pipeline completed successfully${c_reset}-" - } else { - checkHostname() - log.info "-${c_purple}[nf-core/chipseq]${c_red} Pipeline completed with errors${c_reset}-" - } - -} - -workflow.onError { - // Print unexpected parameters - easiest is to just rerun validation - NfcoreSchema.validateParameters(params, json_schema, log) -} - -def checkHostname() { - def c_reset = params.monochrome_logs ? '' : "\033[0m" - def c_white = params.monochrome_logs ? '' : "\033[0;37m" - def c_red = params.monochrome_logs ? '' : "\033[1;91m" - def c_yellow_bold = params.monochrome_logs ? '' : "\033[1;93m" - if (params.hostnames) { - def hostname = 'hostname'.execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.error "${c_red}====================================================${c_reset}\n" + - " ${c_red}WARNING!${c_reset} You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${c_white}'$hostname'${c_reset}\n" + - " ${c_yellow_bold}It's highly recommended that you use `-profile $prof${c_reset}`\n" + - "${c_red}====================================================${c_reset}\n" - } - } - } - } -} +======================================================================================== + THE END +======================================================================================== +*/ diff --git a/modules.json b/modules.json new file mode 100644 index 000000000..a11f8855c --- /dev/null +++ b/modules.json @@ -0,0 +1,14 @@ +{ + "name": "nf-core/chipseq", + "homePage": "https://github.com/nf-core/chipseq", + "repos": { + "nf-core/modules": { + "fastqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "multiqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + } + } + } +} diff --git a/modules/local/functions.nf b/modules/local/functions.nf new file mode 100644 index 000000000..da9da093d --- /dev/null +++ b/modules/local/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf new file mode 100644 index 000000000..3e9926b85 --- /dev/null +++ b/modules/local/get_software_versions.nf @@ -0,0 +1,33 @@ +// Import generic module functions +include { saveFiles } from './functions' + +params.options = [:] + +process GET_SOFTWARE_VERSIONS { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + cache false + + input: + path versions + + output: + path "software_versions.tsv" , emit: tsv + path 'software_versions_mqc.yaml', emit: yaml + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + echo $workflow.manifest.version > pipeline.version.txt + echo $workflow.nextflow.version > nextflow.version.txt + scrape_software_versions.py &> software_versions_mqc.yaml + """ +} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf new file mode 100644 index 000000000..b200e6ffb --- /dev/null +++ b/modules/local/samplesheet_check.nf @@ -0,0 +1,31 @@ +// Import generic module functions +include { saveFiles } from './functions' + +params.options = [:] + +process SAMPLESHEET_CHECK { + tag "$samplesheet" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + input: + path samplesheet + + output: + path '*.csv' + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + check_samplesheet.py \\ + $samplesheet \\ + samplesheet.valid.csv + """ +} diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf new file mode 100644 index 000000000..da9da093d --- /dev/null +++ b/modules/nf-core/modules/fastqc/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf new file mode 100644 index 000000000..39c327b26 --- /dev/null +++ b/modules/nf-core/modules/fastqc/main.nf @@ -0,0 +1,47 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process FASTQC { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" + } else { + container "quay.io/biocontainers/fastqc:0.11.9--0" + } + + input: + tuple val(meta), path(reads) + + output: + tuple val(meta), path("*.html"), emit: html + tuple val(meta), path("*.zip") , emit: zip + path "*.version.txt" , emit: version + + script: + // Add soft-links to original FastQs for consistent naming in pipeline + def software = getSoftwareName(task.process) + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + if (meta.single_end) { + """ + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + """ + } else { + """ + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml new file mode 100644 index 000000000..8eb9953dc --- /dev/null +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -0,0 +1,51 @@ +name: fastqc +description: Run FastQC on sequenced reads +keywords: + - quality control + - qc + - adapters + - fastq +tools: + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf new file mode 100644 index 000000000..da9da093d --- /dev/null +++ b/modules/nf-core/modules/multiqc/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf new file mode 100644 index 000000000..da7808002 --- /dev/null +++ b/modules/nf-core/modules/multiqc/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process MULTIQC { + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" + } else { + container "quay.io/biocontainers/multiqc:1.10.1--py_0" + } + + input: + path multiqc_files + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + """ + multiqc -f $options.args . + multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml new file mode 100644 index 000000000..532a8bb1e --- /dev/null +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -0,0 +1,39 @@ +name: MultiQC +description: Aggregate results from bioinformatics analyses across many samples into a single report +keywords: + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report +tools: + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ +input: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC +output: + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/nextflow.config b/nextflow.config index 1dd986558..4f7ea7561 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,130 +1,136 @@ /* - * ------------------------------------------------- - * nf-core/chipseq Nextflow config file - * ------------------------------------------------- - * Default config options for all environments. - */ +======================================================================================== + nf-core/chipseq Nextflow config file +======================================================================================== + Default config options for all compute environments +---------------------------------------------------------------------------------------- +*/ // Global default params, used in configs params { - // Workflow flags - // TODO nf-core: Specify your pipeline's command line flags - genome = false - input = null - input_paths = null - single_end = false - outdir = './results' - publish_dir_mode = 'copy' - - // Boilerplate options - multiqc_config = false - email = false - email_on_fail = false - max_multiqc_email_size = 25.MB - plaintext_email = false - monochrome_logs = false - help = false - igenomes_base = 's3://ngi-igenomes/igenomes' - tracedir = "${params.outdir}/pipeline_info" - igenomes_ignore = false - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - 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' - - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h + // TODO nf-core: Specify your pipeline's command line flags + // Input options + input = null -} + // References + genome = null + igenomes_base = 's3://ngi-igenomes/igenomes' + igenomes_ignore = false + + // MultiQC options + multiqc_config = null + multiqc_title = null + max_multiqc_email_size = '25.MB' + + // Boilerplate options + outdir = './results' + tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + help = false + validate_params = true + show_hidden_params = false + schema_ignore_params = 'genomes,modules' + enable_conda = false + singularity_pull_docker_container = false -// Container slug. Stable releases should specify release tag! -// Developmental code should specify :dev -process.container = 'nfcore/chipseq:dev' + // Config options + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + hostnames = [:] + config_profile_description = null + config_profile_contact = null + config_profile_url = null + config_profile_name = null + + // Max resource options + // Defaults only, expecting to be overwritten + max_memory = '128.GB' + max_cpus = 16 + max_time = '240.h' + +} // Load base.config by default for all pipelines includeConfig 'conf/base.config' +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Load nf-core custom profiles from different Institutions try { - includeConfig "${params.custom_config_base}/nfcore_custom.config" + 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") -} - -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 - // 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 { - docker.enabled = false - singularity.enabled = true - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - singularity.autoMounts = 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_full { includeConfig 'conf/test_full.config' } + System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } // Load igenomes.config if required if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + +profiles { + debug { process.beforeScript = 'echo $HOSTNAME' } + conda { + params.enable_conda = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + docker { + docker.enabled = true + docker.userEmulation = true + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + podman { + podman.enabled = true + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + shifter { + shifter.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + } + charliecloud { + charliecloud.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + } + 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" + PYTHONNOUSERSITE = 1 + R_PROFILE_USER = "/.Rprofile" + R_ENVIRON_USER = "/.Renviron" } // Capture exit codes from upstream processes when piping @@ -132,61 +138,61 @@ 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" + enabled = true + file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" } report { - enabled = true - file = "${params.tracedir}/execution_report_${trace_timestamp}.html" + enabled = true + file = "${params.tracedir}/execution_report_${trace_timestamp}.html" } trace { - enabled = true - file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" + enabled = true + file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" } dag { - enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" + enabled = true + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" } manifest { - name = 'nf-core/chipseq' - author = 'Philip Ewels' - homePage = 'https://github.com/nf-core/chipseq' - description = 'ChIP-seq peak-calling and differential analysis pipeline.' - mainScript = 'main.nf' - nextflowVersion = '>=20.04.0' - version = '1.3.0dev' + name = 'nf-core/chipseq' + author = 'Philip Ewels' + homePage = 'https://github.com/nf-core/chipseq' + description = 'ChIP-seq peak-calling and differential analysis pipeline.' + mainScript = 'main.nf' + nextflowVersion = '!>=21.04.0' + version = '1.3.0dev' } // 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 + 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 + } } - } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 278dfb9eb..b5a0526f6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -16,19 +16,17 @@ "properties": { "input": { "type": "string", - "fa_icon": "fas fa-dna", - "description": "Input FastQ files.", - "help_text": "Use this to specify the location of your input FastQ files. For example:\n\n```bash\n--input 'path/to/data/sample_*_{1,2}.fastq'\n```\n\nPlease note the following requirements:\n\n1. The path must be enclosed in quotes\n2. The path must have at least one `*` wildcard character\n3. When using the pipeline with paired end data, the path must use `{1,2}` notation to specify read pairs.\n\nIf left unspecified, a default pattern is used: `data/*{1,2}.fastq.gz`" - }, - "single_end": { - "type": "boolean", - "description": "Specifies that the input is single-end reads.", - "fa_icon": "fas fa-align-center", - "help_text": "By default, the pipeline expects paired-end data. If you have single-end data, you need to specify `--single_end` on the command line when you launch the pipeline. A normal glob pattern, enclosed in quotation marks, can then be used for `--input`. For example:\n\n```bash\n--single_end --input '*.fastq'\n```\n\nIt is not possible to run a mixture of single-end and paired-end files in one run." + "format": "file-path", + "mimetype": "text/csv", + "pattern": "\\.csv$", + "schema": "assets/schema_input.json", + "description": "Path to comma-separated file containing information about the samples in the experiment.", + "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/usage#samplesheet-input).", + "fa_icon": "fas fa-file-csv" }, "outdir": { "type": "string", - "description": "The output directory where the results will be saved.", + "description": "Path to the output directory where the results will be saved.", "default": "./results", "fa_icon": "fas fa-folder-open" }, @@ -38,6 +36,11 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + }, + "multiqc_title": { + "type": "string", + "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", + "fa_icon": "fas fa-file-signature" } } }, @@ -45,22 +48,26 @@ "title": "Reference genome options", "type": "object", "fa_icon": "fas fa-dna", - "description": "Options for the reference genome indices used to align reads.", + "description": "Reference genome related files and options required for the workflow.", "properties": { "genome": { "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`.\n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." }, "fasta": { "type": "string", - "fa_icon": "fas fa-font", + "format": "file-path", + "mimetype": "text/plain", + "pattern": "\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", - "help_text": "If you have no genome reference available, the pipeline can build one using a FASTA file. This requires additional time and resources, so it's better to use a pre-build index if possible." + "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", + "fa_icon": "far fa-file-code" }, "igenomes_base": { "type": "string", + "format": "directory-path", "description": "Directory / URL base for iGenomes references.", "default": "s3://ngi-igenomes/igenomes", "fa_icon": "fas fa-cloud-download-alt", @@ -75,91 +82,57 @@ } } }, - "generic_options": { - "title": "Generic options", + "institutional_config_options": { + "title": "Institutional config options", "type": "object", - "fa_icon": "fas fa-file-import", - "description": "Less common options for the pipeline, typically set in a config file.", - "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "fa_icon": "fas fa-university", + "description": "Parameters used to describe centralised config profiles. These should not be edited.", + "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", "properties": { - "help": { - "type": "boolean", - "description": "Display help text.", - "hidden": true, - "fa_icon": "fas fa-question-circle" - }, - "publish_dir_mode": { + "custom_config_version": { "type": "string", - "default": "copy", + "description": "Git commit id for Institutional configs.", + "default": "master", "hidden": true, - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ] - }, - "validate_params": { - "type": "boolean", - "description": "Boolean whether to validate parameters against the schema at runtime", - "default": true, - "fa_icon": "fas fa-check-square", - "hidden": true + "fa_icon": "fas fa-users-cog" }, - "email_on_fail": { + "custom_config_base": { "type": "string", - "description": "Email address for completion summary, only when pipeline fails.", - "fa_icon": "fas fa-exclamation-triangle", - "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", + "description": "Base directory for Institutional configs.", + "default": "https://raw.githubusercontent.com/nf-core/configs/master", "hidden": true, - "help_text": "This works exactly as with `--email`, except emails are only sent if the workflow is not successful." + "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", + "fa_icon": "fas fa-users-cog" }, - "plaintext_email": { - "type": "boolean", - "description": "Send plain-text email instead of HTML.", - "fa_icon": "fas fa-remove-format", + "hostnames": { + "type": "string", + "description": "Institutional configs hostname.", "hidden": true, - "help_text": "Set to receive plain-text e-mails instead of HTML formatted." + "fa_icon": "fas fa-users-cog" }, - "max_multiqc_email_size": { + "config_profile_name": { "type": "string", - "description": "File size limit when attaching MultiQC reports to summary emails.", - "default": "25.MB", - "fa_icon": "fas fa-file-upload", + "description": "Institutional config name.", "hidden": true, - "help_text": "If file generated by pipeline exceeds the threshold, it will not be attached." + "fa_icon": "fas fa-users-cog" }, - "monochrome_logs": { - "type": "boolean", - "description": "Do not use coloured log outputs.", - "fa_icon": "fas fa-palette", + "config_profile_description": { + "type": "string", + "description": "Institutional config description.", "hidden": true, - "help_text": "Set to disable colourful command line output and live life in monochrome." + "fa_icon": "fas fa-users-cog" }, - "multiqc_config": { + "config_profile_contact": { "type": "string", - "description": "Custom config file to supply to MultiQC.", - "fa_icon": "fas fa-cog", - "hidden": true + "description": "Institutional config contact information.", + "hidden": true, + "fa_icon": "fas fa-users-cog" }, - "tracedir": { + "config_profile_url": { "type": "string", - "description": "Directory to keep pipeline Nextflow logs and reports.", - "default": "${params.outdir}/pipeline_info", - "fa_icon": "fas fa-cogs", - "hidden": true - }, - "show_hidden_params": { - "type": "boolean", - "fa_icon": "far fa-eye-slash", - "description": "Show all params when using `--help`", + "description": "Institutional config URL link.", "hidden": true, - "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." + "fa_icon": "fas fa-users-cog" } } }, @@ -172,7 +145,7 @@ "properties": { "max_cpus": { "type": "integer", - "description": "Maximum number of CPUs that can be requested for any single job.", + "description": "Maximum number of CPUs that can be requested for any single job.", "default": 16, "fa_icon": "fas fa-microchip", "hidden": true, @@ -198,58 +171,102 @@ } } }, - "institutional_config_options": { - "title": "Institutional config options", + "generic_options": { + "title": "Generic options", "type": "object", - "fa_icon": "fas fa-university", - "description": "Parameters used to describe centralised config profiles. These should not be edited.", - "help_text": "The centralised nf-core configuration profiles use a handful of pipeline parameters to describe themselves. This information is then printed to the Nextflow log when you run a pipeline. You should not need to change these values when you run a pipeline.", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", "properties": { - "custom_config_version": { + "help": { + "type": "boolean", + "description": "Display help text.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "publish_dir_mode": { "type": "string", - "description": "Git commit id for Institutional configs.", - "default": "master", - "hidden": true, - "fa_icon": "fas fa-users-cog", - "help_text": "Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. Default: `master`.\n\n```bash\n## Download and use config file with following git commit id\n--custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96\n```" + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], + "hidden": true }, - "custom_config_base": { + "email_on_fail": { "type": "string", - "description": "Base directory for Institutional configs.", - "default": "https://raw.githubusercontent.com/nf-core/configs/master", - "hidden": true, - "help_text": "If you're running offline, nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell nextflow where to find them with the `custom_config_base` option. For example:\n\n```bash\n## Download and unzip the config files\ncd /path/to/my/configs\nwget https://github.com/nf-core/configs/archive/master.zip\nunzip master.zip\n\n## Run the pipeline\ncd /path/to/my/data\nnextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs-master/\n```\n\n> Note that the nf-core/tools helper package has a `download` command to download all required pipeline files + singularity containers + institutional configs in one go for you, to make this process easier.", - "fa_icon": "fas fa-users-cog" + "description": "Email address for completion summary, only when pipeline fails.", + "fa_icon": "fas fa-exclamation-triangle", + "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", + "help_text": "An email address to send a summary email to when the pipeline is completed - ONLY sent if the pipeline does not exit successfully.", + "hidden": true }, - "hostnames": { + "plaintext_email": { + "type": "boolean", + "description": "Send plain-text email instead of HTML.", + "fa_icon": "fas fa-remove-format", + "hidden": true + }, + "max_multiqc_email_size": { "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" + "description": "File size limit when attaching MultiQC reports to summary emails.", + "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", + "default": "25.MB", + "fa_icon": "fas fa-file-upload", + "hidden": true }, - "config_profile_name": { + "monochrome_logs": { + "type": "boolean", + "description": "Do not use coloured log outputs.", + "fa_icon": "fas fa-palette", + "hidden": true + }, + "multiqc_config": { "type": "string", - "description": "Institutional config name.", - "hidden": true, - "fa_icon": "fas fa-users-cog" + "description": "Custom config file to supply to MultiQC.", + "fa_icon": "fas fa-cog", + "hidden": true }, - "config_profile_description": { + "tracedir": { "type": "string", - "description": "Institutional config description.", + "description": "Directory to keep pipeline Nextflow logs and reports.", + "default": "${params.outdir}/pipeline_info", + "fa_icon": "fas fa-cogs", + "hidden": true + }, + "validate_params": { + "type": "boolean", + "description": "Boolean whether to validate parameters against the schema at runtime", + "default": true, + "fa_icon": "fas fa-check-square", + "hidden": true + }, + "show_hidden_params": { + "type": "boolean", + "fa_icon": "far fa-eye-slash", + "description": "Show all params when using `--help`", "hidden": true, - "fa_icon": "fas fa-users-cog" + "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." }, - "config_profile_contact": { - "type": "string", - "description": "Institutional config contact information.", + "enable_conda": { + "type": "boolean", + "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, - "fa_icon": "fas fa-users-cog" + "fa_icon": "fas fa-bacon" }, - "config_profile_url": { - "type": "string", - "description": "Institutional config URL link.", + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", "hidden": true, - "fa_icon": "fas fa-users-cog" + "fa_icon": "fas fa-toolbox", + "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } @@ -262,13 +279,13 @@ "$ref": "#/definitions/reference_genome_options" }, { - "$ref": "#/definitions/generic_options" + "$ref": "#/definitions/institutional_config_options" }, { "$ref": "#/definitions/max_job_request_options" }, { - "$ref": "#/definitions/institutional_config_options" + "$ref": "#/definitions/generic_options" } ] } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf new file mode 100644 index 000000000..b664bc8ca --- /dev/null +++ b/subworkflows/local/input_check.nf @@ -0,0 +1,42 @@ +// +// Check input samplesheet and get read channels +// + +params.options = [:] + +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) + +workflow INPUT_CHECK { + take: + samplesheet // file: /path/to/samplesheet.csv + + main: + SAMPLESHEET_CHECK ( samplesheet ) + .splitCsv ( header:true, sep:',' ) + .map { create_fastq_channels(it) } + .set { reads } + + emit: + reads // channel: [ val(meta), [ reads ] ] +} + +// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] +def create_fastq_channels(LinkedHashMap row) { + def meta = [:] + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() + + def array = [] + if (!file(row.fastq_1).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" + } + if (meta.single_end) { + array = [ meta, [ file(row.fastq_1) ] ] + } else { + if (!file(row.fastq_2).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" + } + array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + } + return array +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf new file mode 100644 index 000000000..ea34de8bd --- /dev/null +++ b/workflows/chipseq.nf @@ -0,0 +1,141 @@ +/* +======================================================================================== + VALIDATE INPUTS +======================================================================================== +*/ + +def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) + +// Validate input parameters +WorkflowChipseq.initialise(params, log) + +// TODO nf-core: Add all file path parameters for the pipeline to the list below +// Check input path parameters to see if they exist +def checkPathParamList = [ params.input, params.multiqc_config, params.fasta ] +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!' } + +/* +======================================================================================== + CONFIG FILES +======================================================================================== +*/ + +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() + +/* +======================================================================================== + IMPORT LOCAL MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +// Don't overwrite global params.modules, create a copy instead and use that within the main script. +def modules = params.modules.clone() + +// +// MODULE: Local to the pipeline +// +include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) + +// +// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules +// +include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +def multiqc_options = modules['multiqc'] +multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' + +// +// MODULE: Installed directly from nf-core/modules +// +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) + +/* +======================================================================================== + RUN MAIN WORKFLOW +======================================================================================== +*/ + +// Info required for completion email and summary +def multiqc_report = [] + +workflow CHIPSEQ { + + ch_software_versions = Channel.empty() + + // + // SUBWORKFLOW: Read in samplesheet, validate and stage input files + // + INPUT_CHECK ( + ch_input + ) + + // + // MODULE: Run FastQC + // + FASTQC ( + INPUT_CHECK.out.reads + ) + ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + + // + // MODULE: Pipeline reporting + // + ch_software_versions + .map { it -> if (it) [ it.baseName, it ] } + .groupTuple() + .map { it[1][0] } + .flatten() + .collect() + .set { ch_software_versions } + + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect() + ) + + // + // MODULE: MultiQC + // + workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) + ch_workflow_summary = Channel.value(workflow_summary) + + ch_multiqc_files = Channel.empty() + ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + + MULTIQC ( + ch_multiqc_files.collect() + ) + multiqc_report = MULTIQC.out.report.toList() + ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) +} + +/* +======================================================================================== + COMPLETION EMAIL AND SUMMARY +======================================================================================== +*/ + +workflow.onComplete { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + NfcoreTemplate.summary(workflow, params, log) +} + +/* +======================================================================================== + THE END +======================================================================================== +*/ From ba3e7cbae3a05431b1e63078d3aea2ede2420c64 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 13 Jul 2021 15:24:56 +0000 Subject: [PATCH 172/538] Template update for nf-core/tools version 2.0.1 --- .github/workflows/linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 13b4fc818..fbde5cf8b 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -127,7 +127,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} From 176f9fbfecd2e11dc373dd947abb0be4448674f3 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 27 Jul 2021 15:15:45 +0000 Subject: [PATCH 173/538] Template update for nf-core/tools version 2.1 --- .editorconfig | 3 +++ .github/CONTRIBUTING.md | 6 +++--- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/linting.yml | 2 +- README.md | 2 +- bin/scrape_software_versions.py | 2 +- lib/NfcoreTemplate.groovy | 22 +++++++++++++--------- nextflow_schema.json | 4 ++-- workflows/chipseq.nf | 4 +++- 9 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.editorconfig b/.editorconfig index afb20bb1e..95549501a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,9 @@ indent_style = space [*.{yml,yaml}] indent_size = 2 +[*.json] +insert_final_newline = unset + # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index af4dba190..87854ad80 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/chipseq, the standard workflow is a * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/chipseq repository](https://github.com/nf-core/chipseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -69,7 +69,7 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). 6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. @@ -83,7 +83,7 @@ If you wish to contribute a new step, please use the following coding standards: Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a29e2412..2f5f69256 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fbde5cf8b..3b448773c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@v1 with: - node-version: "10" + node-version: '10' - name: Install editorconfig-checker run: npm install -g editorconfig-checker diff --git a/README.md b/README.md index 21f112264..72f3bfd11 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://nf-co.re/usage/installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 884897195..c060d8d5d 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -30,7 +30,7 @@ print("
{}
{}
".format(k, v)) print(" ") -# Write out regexes as csv file: +# Write out as tsv file: with open("software_versions.tsv", "w") as f: for k, v in sorted(results.items()): f.write("{}\t{}\n".format(k, v)) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index b6e689ec8..44551e0a3 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -24,17 +24,21 @@ class NfcoreTemplate { public static void hostName(workflow, params, log) { Map colors = logColours(params.monochrome_logs) if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } } } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index b5a0526f6..2c3b9f6e3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -18,7 +18,7 @@ "type": "string", "format": "file-path", "mimetype": "text/csv", - "pattern": "\\.csv$", + "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/usage#samplesheet-input).", @@ -60,7 +60,7 @@ "type": "string", "format": "file-path", "mimetype": "text/plain", - "pattern": "\\.fn?a(sta)?(\\.gz)?$", + "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index ea34de8bd..46b8fb78f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -130,7 +130,9 @@ workflow CHIPSEQ { */ workflow.onComplete { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + if (params.email || params.email_on_fail) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + } NfcoreTemplate.summary(workflow, params, log) } From aa7e3c4c6679088e08934c9d70b28040037c12f4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 9 Sep 2021 16:09:36 +0200 Subject: [PATCH 174/538] Merge remote-tracking branch 'upstream/nf-core-template-merge-2.1' into dev_merge_template_2.1 --- .editorconfig | 27 + .github/.dockstore.yml | 1 + .github/CONTRIBUTING.md | 10 +- .github/ISSUE_TEMPLATE/bug_report.md | 7 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 8 +- .github/workflows/awsfulltest.yml | 45 +- .github/workflows/awstest.yml | 44 +- .github/workflows/branch.yml | 15 +- .github/workflows/ci.yml | 22 +- .github/workflows/linting.yml | 76 +- .github/workflows/push_dockerhub_dev.yml | 28 - .github/workflows/push_dockerhub_release.yml | 29 - .gitignore | 1 - .github/markdownlint.yml => .markdownlint.yml | 2 + CITATIONS.md | 213 ++--- CODE_OF_CONDUCT.md | 117 ++- Dockerfile | 17 - README.md | 46 +- assets/email_template.html | 1 - assets/samplesheet.csv | 3 + assets/schema_input.json | 39 + assets/sendmail_template.txt | 36 +- bin/scrape_software_versions.py | 32 +- conf/base.config | 84 +- conf/igenomes.config | 843 +++++++++--------- conf/modules.config | 38 +- conf/test.config | 21 +- conf/test_full.config | 29 +- docs/README.md | 4 +- docs/images/mqc_fastqc_adapter.png | Bin 0 -> 23458 bytes docs/images/mqc_fastqc_counts.png | Bin 0 -> 33918 bytes docs/images/mqc_fastqc_quality.png | Bin 0 -> 55769 bytes docs/output.md | 6 +- docs/usage.md | 208 ++++- environment.yml | 33 - lib/Checks.groovy | 47 - lib/NfcoreSchema.groovy | 517 +++++++++++ lib/NfcoreTemplate.groovy | 270 ++++++ lib/Utils.groovy | 47 + lib/WorkflowChipseq.groovy | 74 ++ lib/WorkflowMain.groovy | 94 ++ lib/nfcore_external_java_deps.jar | Bin 0 -> 2291171 bytes main.nf | 617 +------------ modules.json | 14 + modules/local/{process => }/bam_filter.nf | 94 +- .../local/{process => }/bam_remove_orphans.nf | 72 +- .../local/{process => }/bedtools_genomecov.nf | 92 +- .../{process => }/deseq2_featurecounts.nf | 110 +-- modules/local/{process => }/frip_score.nf | 56 +- modules/local/functions.nf | 68 ++ .../local/{process => }/get_chrom_sizes.nf | 68 +- modules/local/get_software_versions.nf | 33 + modules/local/{process => }/gtf2bed.nf | 60 +- modules/local/{process => }/igv.nf | 78 +- .../local/{process => }/macs2_consensus.nf | 110 +-- .../local/{process => }/make_genome_filter.nf | 82 +- modules/local/{process => }/multiqc.nf | 14 +- .../{process => }/multiqc_custom_peaks.nf | 60 +- .../multiqc_custom_phantompeakqualtools.nf | 70 +- .../{process => }/output_documentation.nf | 0 .../{process => }/plot_homer_annotatepeaks.nf | 72 +- modules/local/{process => }/plot_macs2_qc.nf | 64 +- modules/local/process/functions.nf | 59 -- .../local/process/get_software_versions.nf | 26 - modules/local/samplesheet_check.nf | 26 + modules/local/subworkflow/input_check.nf | 22 - .../mem => modules/bwa/index}/functions.nf | 118 +-- .../{software => modules}/bwa/index/main.nf | 0 .../{software => modules}/bwa/index/meta.yml | 0 .../fastqc => modules/bwa/mem}/functions.nf | 118 +-- .../{software => modules}/bwa/mem/main.nf | 84 +- .../{software => modules}/bwa/mem/meta.yml | 0 .../bwa/index => modules/fastqc}/functions.nf | 118 +-- .../{software => modules}/fastqc/main.nf | 0 .../{software => modules}/fastqc/meta.yml | 0 modules/nf-core/modules/multiqc/functions.nf | 68 ++ modules/nf-core/modules/multiqc/main.nf | 35 + modules/nf-core/modules/multiqc/meta.yml | 39 + .../collectmultiplemetrics/functions.nf | 118 +-- .../picard/collectmultiplemetrics/main.nf | 94 +- .../picard/markduplicates/functions.nf | 59 ++ .../picard/markduplicates/main.nf | 92 +- .../modules/picard/mergesamfiles/functions.nf | 59 ++ .../picard/mergesamfiles/main.nf | 102 +-- .../modules/samtools/flagstat/functions.nf | 59 ++ .../samtools/flagstat/main.nf | 58 +- .../modules/samtools/idxstats/functions.nf | 59 ++ .../samtools/idxstats/main.nf | 58 +- .../modules/samtools/index/functions.nf | 59 ++ .../samtools/index/main.nf | 58 +- .../samtools/index/meta.yml | 0 .../modules/samtools/sort/functions.nf | 59 ++ .../samtools/sort/main.nf | 64 +- .../samtools/sort/meta.yml | 0 .../modules/samtools/stats/functions.nf | 59 ++ .../samtools/stats/main.nf | 58 +- .../nf-core/modules/trimgalore/functions.nf | 59 ++ .../{software => modules}/trimgalore/main.nf | 158 ++-- .../{software => modules}/trimgalore/meta.yml | 0 .../picard/markduplicates/functions.nf | 59 -- .../picard/mergesamfiles/functions.nf | 59 -- .../software/samtools/flagstat/functions.nf | 59 -- .../software/samtools/idxstats/functions.nf | 59 -- .../software/samtools/index/functions.nf | 59 -- .../software/samtools/sort/functions.nf | 59 -- .../software/samtools/stats/functions.nf | 59 -- .../nf-core/software/trimgalore/functions.nf | 59 -- nextflow.config | 373 ++++---- nextflow_schema.json | 66 +- .../local}/bam_clean.nf | 66 +- .../local/input_check.nf | 44 +- .../nf-core}/bam_sort_samtools.nf | 53 +- .../nf-core}/bam_stats_samtools.nf | 48 +- .../nf-core}/fastqc_trimgalore.nf | 98 +- .../nf-core}/map_bwa_mem.nf | 56 +- .../nf-core}/mark_duplicates_picard.nf | 58 +- workflows/chipseq.nf | 628 +++++++++++++ 118 files changed, 5283 insertions(+), 3694 deletions(-) create mode 100644 .editorconfig delete mode 100644 .github/workflows/push_dockerhub_dev.yml delete mode 100644 .github/workflows/push_dockerhub_release.yml rename .github/markdownlint.yml => .markdownlint.yml (90%) delete mode 100644 Dockerfile create mode 100644 assets/samplesheet.csv create mode 100644 assets/schema_input.json create mode 100755 docs/images/mqc_fastqc_adapter.png create mode 100755 docs/images/mqc_fastqc_counts.png create mode 100755 docs/images/mqc_fastqc_quality.png delete mode 100644 environment.yml delete mode 100755 lib/Checks.groovy create mode 100755 lib/NfcoreSchema.groovy create mode 100755 lib/NfcoreTemplate.groovy create mode 100755 lib/Utils.groovy create mode 100755 lib/WorkflowChipseq.groovy create mode 100755 lib/WorkflowMain.groovy create mode 100644 lib/nfcore_external_java_deps.jar create mode 100644 modules.json rename modules/local/{process => }/bam_filter.nf (97%) rename modules/local/{process => }/bam_remove_orphans.nf (96%) rename modules/local/{process => }/bedtools_genomecov.nf (97%) rename modules/local/{process => }/deseq2_featurecounts.nf (97%) rename modules/local/{process => }/frip_score.nf (97%) create mode 100644 modules/local/functions.nf rename modules/local/{process => }/get_chrom_sizes.nf (96%) create mode 100644 modules/local/get_software_versions.nf rename modules/local/{process => }/gtf2bed.nf (96%) rename modules/local/{process => }/igv.nf (97%) rename modules/local/{process => }/macs2_consensus.nf (97%) rename modules/local/{process => }/make_genome_filter.nf (96%) rename modules/local/{process => }/multiqc.nf (83%) rename modules/local/{process => }/multiqc_custom_peaks.nf (97%) rename modules/local/{process => }/multiqc_custom_phantompeakqualtools.nf (97%) rename modules/local/{process => }/output_documentation.nf (100%) rename modules/local/{process => }/plot_homer_annotatepeaks.nf (96%) rename modules/local/{process => }/plot_macs2_qc.nf (96%) delete mode 100644 modules/local/process/functions.nf delete mode 100644 modules/local/process/get_software_versions.nf create mode 100644 modules/local/samplesheet_check.nf delete mode 100644 modules/local/subworkflow/input_check.nf rename modules/nf-core/{software/bwa/mem => modules/bwa/index}/functions.nf (97%) rename modules/nf-core/{software => modules}/bwa/index/main.nf (100%) rename modules/nf-core/{software => modules}/bwa/index/meta.yml (100%) rename modules/nf-core/{software/fastqc => modules/bwa/mem}/functions.nf (97%) rename modules/nf-core/{software => modules}/bwa/mem/main.nf (97%) rename modules/nf-core/{software => modules}/bwa/mem/meta.yml (100%) rename modules/nf-core/{software/bwa/index => modules/fastqc}/functions.nf (97%) rename modules/nf-core/{software => modules}/fastqc/main.nf (100%) rename modules/nf-core/{software => modules}/fastqc/meta.yml (100%) create mode 100644 modules/nf-core/modules/multiqc/functions.nf create mode 100644 modules/nf-core/modules/multiqc/main.nf create mode 100644 modules/nf-core/modules/multiqc/meta.yml rename modules/nf-core/{software => modules}/picard/collectmultiplemetrics/functions.nf (97%) rename modules/nf-core/{software => modules}/picard/collectmultiplemetrics/main.nf (97%) create mode 100644 modules/nf-core/modules/picard/markduplicates/functions.nf rename modules/nf-core/{software => modules}/picard/markduplicates/main.nf (97%) create mode 100644 modules/nf-core/modules/picard/mergesamfiles/functions.nf rename modules/nf-core/{software => modules}/picard/mergesamfiles/main.nf (97%) create mode 100644 modules/nf-core/modules/samtools/flagstat/functions.nf rename modules/nf-core/{software => modules}/samtools/flagstat/main.nf (97%) create mode 100644 modules/nf-core/modules/samtools/idxstats/functions.nf rename modules/nf-core/{software => modules}/samtools/idxstats/main.nf (97%) create mode 100644 modules/nf-core/modules/samtools/index/functions.nf rename modules/nf-core/{software => modules}/samtools/index/main.nf (97%) rename modules/nf-core/{software => modules}/samtools/index/meta.yml (100%) create mode 100644 modules/nf-core/modules/samtools/sort/functions.nf rename modules/nf-core/{software => modules}/samtools/sort/main.nf (97%) rename modules/nf-core/{software => modules}/samtools/sort/meta.yml (100%) create mode 100644 modules/nf-core/modules/samtools/stats/functions.nf rename modules/nf-core/{software => modules}/samtools/stats/main.nf (97%) create mode 100644 modules/nf-core/modules/trimgalore/functions.nf rename modules/nf-core/{software => modules}/trimgalore/main.nf (97%) rename modules/nf-core/{software => modules}/trimgalore/meta.yml (100%) delete mode 100644 modules/nf-core/software/picard/markduplicates/functions.nf delete mode 100644 modules/nf-core/software/picard/mergesamfiles/functions.nf delete mode 100644 modules/nf-core/software/samtools/flagstat/functions.nf delete mode 100644 modules/nf-core/software/samtools/idxstats/functions.nf delete mode 100644 modules/nf-core/software/samtools/index/functions.nf delete mode 100644 modules/nf-core/software/samtools/sort/functions.nf delete mode 100644 modules/nf-core/software/samtools/stats/functions.nf delete mode 100644 modules/nf-core/software/trimgalore/functions.nf rename {modules/local/subworkflow => subworkflows/local}/bam_clean.nf (80%) rename modules/local/process/samplesheet_check.nf => subworkflows/local/input_check.nf (53%) rename {modules/nf-core/subworkflow => subworkflows/nf-core}/bam_sort_samtools.nf (83%) rename {modules/nf-core/subworkflow => subworkflows/nf-core}/bam_stats_samtools.nf (73%) rename {modules/nf-core/subworkflow => subworkflows/nf-core}/fastqc_trimgalore.nf (90%) rename {modules/nf-core/subworkflow => subworkflows/nf-core}/map_bwa_mem.nf (93%) rename {modules/nf-core/subworkflow => subworkflows/nf-core}/mark_duplicates_picard.nf (88%) create mode 100644 workflows/chipseq.nf diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..95549501a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_size = 4 +indent_style = space + +[*.{yml,yaml}] +indent_size = 2 + +[*.json] +insert_final_newline = unset + +# These files are edited and tested upstream in nf-core/modules +[/modules/nf-core/**] +charset = unset +end_of_line = unset +insert_final_newline = unset +trim_trailing_whitespace = unset +indent_style = unset +indent_size = unset + +[/assets/email*] +indent_size = unset diff --git a/.github/.dockstore.yml b/.github/.dockstore.yml index 030138a0c..191fabd22 100644 --- a/.github/.dockstore.yml +++ b/.github/.dockstore.yml @@ -3,3 +3,4 @@ version: 1.2 workflows: - subclass: nfl primaryDescriptorPath: /nextflow.config + publish: True diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 32de1a44b..87854ad80 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/chipseq, the standard workflow is a * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/chipseq repository](https://github.com/nf-core/chipseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -69,12 +69,12 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`) +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). 6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). 7. Add sanity checks for all relevant parameters. 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. 9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yaml`. +10. Add a new test command in `.github/workflow/ci.yml`. 11. If applicable add a [MultiQC](https://https://multiqc.info/) module. 12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. 13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. @@ -83,11 +83,11 @@ If you wish to contribute a new step, please use the following coding standards: Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements -Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/%7B%7Bcookiecutter.name_noslash%7D%7D/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. +Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7edcb791e..dbc527cc8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -18,7 +18,7 @@ Please delete this text and anything that's not relevant from the template below I have checked the following places for your error: - [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/nf-core/chipseq/usage) +- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/chipseq/usage) ## Description of the bug @@ -51,13 +51,12 @@ Have you provided the following extra information/files: ## Nextflow Installation -- Version: +- Version: ## Container engine -- Engine: +- Engine: - version: -- Image tag: ## Additional context diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 4a1e82612..15aceab96 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for the nf-core website +about: Suggest an idea for the nf-core/chipseq pipeline labels: enhancement --- diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f5062d15c..2f5f69256 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,15 +10,15 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) --> + ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint .`). + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index f7f79d355..3ce8292e1 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,39 +1,30 @@ name: nf-core AWS full size tests # This workflow is triggered on published releases. -# It can be additionally triggered manually with GitHub actions workflow dispatch. +# It can be additionally triggered manually with GitHub actions workflow dispatch button. # It runs the -profile 'test_full' on AWS batch on: - workflow_run: - workflows: ["nf-core Docker push (release)"] - types: [completed] + release: + types: [published] workflow_dispatch: - jobs: - run-awstest: + run-tower: name: Run AWS full tests if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + - name: Launch workflow via tower + uses: nf-core/tower-action@master with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-chipseq \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test_full --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + } + profiles: '[ "test_full", "aws_tower" ]' + diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 6fabf94aa..35a73e974 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -1,36 +1,28 @@ name: nf-core AWS test -# This workflow is triggered on push to the master branch. -# It can be additionally triggered manually with GitHub actions workflow dispatch. -# It runs the -profile 'test' on AWS batch. +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch on: workflow_dispatch: - jobs: - run-awstest: + run-tower: name: Run AWS tests if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest steps: - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + - name: Launch workflow via tower + uses: nf-core/tower-action@master + with: - auto-update-conda: true - python-version: 3.7 - - name: Install awscli - run: conda install -c conda-forge awscli - - name: Start AWS batch job - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - TOWER_ACCESS_TOKEN: ${{ secrets.AWS_TOWER_TOKEN }} - AWS_JOB_DEFINITION: ${{ secrets.AWS_JOB_DEFINITION }} - AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - run: | - aws batch submit-job \ - --region eu-west-1 \ - --job-name nf-core-chipseq \ - --job-queue $AWS_JOB_QUEUE \ - --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/chipseq", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/chipseq/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/chipseq/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + } + profiles: '[ "test", "aws_tower" ]' + diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 17179b678..0615f2af9 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/chipseq' run: | - { [[ ${{github.event.pull_request.head.repo.full_name}} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure @@ -23,13 +23,22 @@ jobs: uses: mshick/add-pr-comment@v1 with: message: | + ## This PR is against the `master` branch :x: + + * Do not close this PR + * Click _Edit_ and change the `base` to `dev` + * This CI test will remain failed until you push a new commit + + --- + Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the ${{github.event.pull_request.head.repo.full_name}} `master` branch. + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `master` branch. The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the ${{github.event.pull_request.head.repo.full_name}} `dev` branch. + Because of this, PRs to `master` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. + Note that even after this, the test will continue to show as failing until you push a new commit. Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef018c0d4..f674c065d 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,9 @@ on: release: types: [published] +# Uncomment if we need an edge release of Nextflow again +# env: NXF_EDGE: 1 + jobs: test: name: Run workflow tests @@ -20,28 +23,11 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['20.07.1', ''] + nxf_ver: ['21.04.0', ''] steps: - name: Check out pipeline code uses: actions/checkout@v2 - - name: Check if Dockerfile or Conda environment changed - uses: technote-space/get-diff-action@v4 - with: - FILES: | - Dockerfile - environment.yml - - - name: Build new docker image - if: env.MATCHED_FILES - run: docker build --no-cache . -t nfcore/chipseq:dev - - - name: Pull docker image - if: ${{ !env.MATCHED_FILES }} - run: | - docker pull nfcore/chipseq:dev - docker tag nfcore/chipseq:dev nfcore/chipseq:dev - - name: Install Nextflow env: CAPSULE_LOG: none diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index bef81e619..3b448773c 100755 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,49 @@ jobs: - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint - run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + run: markdownlint . + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## Markdown linting is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install `markdownlint-cli` + * On Mac: `brew install markdownlint-cli` + * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) + * Fix the markdown errors + * Automatically: `markdownlint . --fix` + * Manually resolve anything left from `markdownlint .` + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + + EditorConfig: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v1 + with: + node-version: '10' + + - name: Install editorconfig-checker + run: npm install -g editorconfig-checker + + - name: Run ECLint check + run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) + YAML: runs-on: ubuntu-latest steps: @@ -29,7 +71,33 @@ jobs: - name: Install yaml-lint run: npm install -g yaml-lint - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml") + run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## YAML linting is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install `yaml-lint` + * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Fix the markdown errors + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Fix any reported errors in your YAML files + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + nf-core: runs-on: ubuntu-latest steps: @@ -59,7 +127,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} @@ -69,7 +137,7 @@ jobs: if: ${{ always() }} uses: actions/upload-artifact@v2 with: - name: linting-log-file + name: linting-logs path: | lint_log.txt lint_results.md diff --git a/.github/workflows/push_dockerhub_dev.yml b/.github/workflows/push_dockerhub_dev.yml deleted file mode 100644 index 828dc0fa8..000000000 --- a/.github/workflows/push_dockerhub_dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: nf-core Docker push (dev) -# This builds the docker image and pushes it to DockerHub -# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) -on: - push: - branches: - - dev - -jobs: - push_dockerhub: - name: Push new Docker image to Docker Hub (dev) - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/chipseq' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Build new docker image - run: docker build --no-cache . -t nfcore/chipseq:dev - - - name: Push Docker image to DockerHub (dev) - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/chipseq:dev diff --git a/.github/workflows/push_dockerhub_release.yml b/.github/workflows/push_dockerhub_release.yml deleted file mode 100644 index 69cfe042a..000000000 --- a/.github/workflows/push_dockerhub_release.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: nf-core Docker push (release) -# This builds the docker image and pushes it to DockerHub -# Runs on nf-core repo releases and push event to 'dev' branch (PR merges) -on: - release: - types: [published] - -jobs: - push_dockerhub: - name: Push new Docker image to Docker Hub (release) - runs-on: ubuntu-latest - # Only run for the nf-core repo, for releases and merged PRs - if: ${{ github.repository == 'nf-core/chipseq' }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_PASS }} - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Build new docker image - run: docker build --no-cache . -t nfcore/chipseq:latest - - - name: Push Docker image to DockerHub (release) - run: | - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/chipseq:latest - docker tag nfcore/chipseq:latest nfcore/chipseq:${{ github.event.release.tag_name }} - docker push nfcore/chipseq:${{ github.event.release.tag_name }} diff --git a/.gitignore b/.gitignore index aa4bb5b37..5124c9ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ work/ data/ results/ .DS_Store -tests/ testing/ testing* *.pyc diff --git a/.github/markdownlint.yml b/.markdownlint.yml similarity index 90% rename from .github/markdownlint.yml rename to .markdownlint.yml index 8d7eb53b0..9e605fcfa 100644 --- a/.github/markdownlint.yml +++ b/.markdownlint.yml @@ -1,6 +1,8 @@ # Markdownlint configuration file default: true line-length: false +ul-indent: + indent: 4 no-duplicate-header: siblings_only: true no-inline-html: diff --git a/CITATIONS.md b/CITATIONS.md index eb5a5405e..bae3ea84f 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,106 +1,107 @@ -# nf-core/chipseq: Citations - -## [nf-core](https://www.ncbi.nlm.nih.gov/pubmed/32055031/) - -> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. - -## [Nextflow](https://www.ncbi.nlm.nih.gov/pubmed/28398311/) - -> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. - -## Pipeline tools - -* [BWA](https://www.ncbi.nlm.nih.gov/pubmed/19451168/) - > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. - -* [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) - > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. - -* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) - > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. - -* [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) - > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. - -* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) - > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. - -* [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) - > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. - -* [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) - > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. - -* [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) - > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. - -* [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) - > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. - -* [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) - > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. - -* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) - > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. - -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. - -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - -* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) - -* [picard-tools](http://broadinstitute.github.io/picard) - -* [pysam](https://github.com/pysam-developers/pysam) - -## R packages - -* [R](https://www.R-project.org/) - > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. - -* [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) - > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. - -* [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) - > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). - -* [UpSetR](https://CRAN.R-project.org/package=UpSetR) - > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. - -* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) - > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. - -* [reshape2](http://www.jstatsoft.org/v21/i12/) - > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. - -* [scales](https://CRAN.R-project.org/package=scales) - > Hadley Wickham (2018). scales: Scale Functions for Visualization. - -* [pheatmap](https://CRAN.R-project.org/package=pheatmap) - > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. - -* [lattice](https://cran.r-project.org/web/packages/lattice/index.html) - > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. - -* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) - > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. - -* [optparse](https://CRAN.R-project.org/package=optparse) - > Trevor L Davis (2018). optparse: Command Line Option Parser. - -* [xfun](https://CRAN.R-project.org/package=xfun) - > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. - -## Software packaging/containerisation tools - -* [Bioconda](https://www.ncbi.nlm.nih.gov/pubmed/29967506/) - > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. - -* [Anaconda](https://anaconda.com) - > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. - -* [Singularity](https://www.ncbi.nlm.nih.gov/pubmed/28494014/) - > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. - -* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) +# nf-core/chipseq: Citations +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) + +> Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. + +## [Nextflow](https://pubmed.ncbi.nlm.nih.gov/28398311/) + +> Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. +## Pipeline tools + +* [BWA](https://www.ncbi.nlm.nih.gov/pubmed/19451168/) + > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. + +* [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) + > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. + +* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +* [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) + > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. + +* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. + +* [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) + > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. + +* [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) + > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. + +* [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) + > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. + +* [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) + > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. + +* [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) + > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. + +* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) + > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. + +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) + +* [picard-tools](http://broadinstitute.github.io/picard) + +* [pysam](https://github.com/pysam-developers/pysam) + +## R packages + +* [R](https://www.R-project.org/) + > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. + +* [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) + > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. + +* [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) + > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). + +* [UpSetR](https://CRAN.R-project.org/package=UpSetR) + > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. + +* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) + > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. + +* [reshape2](http://www.jstatsoft.org/v21/i12/) + > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. + +* [scales](https://CRAN.R-project.org/package=scales) + > Hadley Wickham (2018). scales: Scale Functions for Visualization. + +* [pheatmap](https://CRAN.R-project.org/package=pheatmap) + > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. + +* [lattice](https://cran.r-project.org/web/packages/lattice/index.html) + > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. + +* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) + > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. + +* [optparse](https://CRAN.R-project.org/package=optparse) + > Trevor L Davis (2018). optparse: Command Line Option Parser. + +* [xfun](https://CRAN.R-project.org/package=xfun) + > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. + +## Software packaging/containerisation tools + +* [Anaconda](https://anaconda.com) + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. + +* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + +* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 405fb1bfd..f4fd052f1 100755 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,46 +1,111 @@ -# Contributor Covenant Code of Conduct +# Code of Conduct at nf-core (v1.0) ## Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +In the interest of fostering an open, collaborative, and welcoming environment, we as contributors and maintainers of nf-core, pledge to making participation in our projects and community a harassment-free experience for everyone, regardless of: -## Our Standards +- Age +- Body size +- Familial status +- Gender identity and expression +- Geographical location +- Level of experience +- Nationality and national origins +- Native language +- Physical and neurological ability +- Race or ethnicity +- Religion +- Sexual identity and orientation +- Socioeconomic status -Examples of behavior that contributes to creating a positive environment include: +Please note that the list above is alphabetised and is therefore not ranked in any order of preference or importance. -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +## Preamble -Examples of unacceptable behavior by participants include: +> Note: This Code of Conduct (CoC) has been drafted by the nf-core Safety Officer and been edited after input from members of the nf-core team and others. "We", in this document, refers to the Safety Officer and members of the nf-core core team, both of whom are deemed to be members of the nf-core community and are therefore required to abide by this Code of Conduct. This document will amended periodically to keep it up-to-date, and in case of any dispute, the most current version will apply. -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +An up-to-date list of members of the nf-core core team can be found [here](https://nf-co.re/about). Our current safety officer is Renuka Kudva. + +nf-core is a young and growing community that welcomes contributions from anyone with a shared vision for [Open Science Policies](https://www.fosteropenscience.eu/taxonomy/term/8). Open science policies encompass inclusive behaviours and we strive to build and maintain a safe and inclusive environment for all individuals. + +We have therefore adopted this code of conduct (CoC), which we require all members of our community and attendees in nf-core events to adhere to in all our workspaces at all times. Workspaces include but are not limited to Slack, meetings on Zoom, Jitsi, YouTube live etc. + +Our CoC will be strictly enforced and the nf-core team reserve the right to exclude participants who do not comply with our guidelines from our workspaces and future nf-core activities. + +We ask all members of our community to help maintain a supportive and productive workspace and to avoid behaviours that can make individuals feel unsafe or unwelcome. Please help us maintain and uphold this CoC. + +Questions, concerns or ideas on what we can include? Contact safety [at] nf-co [dot] re ## Our Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. +The safety officer is responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. + +The safety officer in consultation with the nf-core core team have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +Members of the core team or the safety officer who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and be subject to the same actions as others in violation of the CoC. + +## When are where does this Code of Conduct apply? + +Participation in the nf-core community is contingent on following these guidelines in all our workspaces and events. This includes but is not limited to the following listed alphabetically and therefore in no order of preference: + +- Communicating with an official project email address. +- Communicating with community members within the nf-core Slack channel. +- Participating in hackathons organised by nf-core (both online and in-person events). +- Participating in collaborative work on GitHub, Google Suite, community calls, mentorship meetings, email correspondence. +- Participating in workshops, training, and seminar series organised by nf-core (both online and in-person events). This applies to events hosted on web-based platforms such as Zoom, Jitsi, YouTube live etc. +- Representing nf-core on social media. This includes both official and personal accounts. + +## nf-core cares 😊 + +nf-core's CoC and expectations of respectful behaviours for all participants (including organisers and the nf-core team) include but are not limited to the following (listed in alphabetical order): + +- Ask for consent before sharing another community member’s personal information (including photographs) on social media. +- Be respectful of differing viewpoints and experiences. We are all here to learn from one another and a difference in opinion can present a good learning opportunity. +- Celebrate your accomplishments at events! (Get creative with your use of emojis 🎉 🥳 💯 🙌 !) +- Demonstrate empathy towards other community members. (We don’t all have the same amount of time to dedicate to nf-core. If tasks are pending, don’t hesitate to gently remind members of your team. If you are leading a task, ask for help if you feel overwhelmed.) +- Engage with and enquire after others. (This is especially important given the geographically remote nature of the nf-core community, so let’s do this the best we can) +- Focus on what is best for the team and the community. (When in doubt, ask) +- Graciously accept constructive criticism, yet be unafraid to question, deliberate, and learn. +- Introduce yourself to members of the community. (We’ve all been outsiders and we know that talking to strangers can be hard for some, but remember we’re interested in getting to know you and your visions for open science!) +- Show appreciation and **provide clear feedback**. (This is especially important because we don’t see each other in person and it can be harder to interpret subtleties. Also remember that not everyone understands a certain language to the same extent as you do, so **be clear in your communications to be kind.**) +- Take breaks when you feel like you need them. +- Using welcoming and inclusive language. (Participants are encouraged to display their chosen pronouns on Zoom or in communication on Slack.) + +## nf-core frowns on 😕 + +The following behaviours from any participants within the nf-core community (including the organisers) will be considered unacceptable under this code of conduct. Engaging or advocating for any of the following could result in expulsion from nf-core workspaces. + +- Deliberate intimidation, stalking or following and sustained disruption of communication among participants of the community. This includes hijacking shared screens through actions such as using the annotate tool in conferencing software such as Zoom. +- “Doxing” i.e. posting (or threatening to post) another person’s personal identifying information online. +- Spamming or trolling of individuals on social media. +- Use of sexual or discriminatory imagery, comments, or jokes and unwelcome sexual attention. +- Verbal and text comments that reinforce social structures of domination related to gender, gender identity and expression, sexual orientation, ability, physical appearance, body size, race, age, religion or work experience. + +### Online Trolling + +The majority of nf-core interactions and events are held online. Unfortunately, holding events online comes with the added issue of online trolling. This is unacceptable, reports of such behaviour will be taken very seriously, and perpetrators will be excluded from activities immediately. + +All community members are required to ask members of the group they are working within for explicit consent prior to taking screenshots of individuals during video calls. + +## Procedures for Reporting CoC violations -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +If someone makes you feel uncomfortable through their behaviours or actions, report it as soon as possible. -## Scope +You can reach out to members of the [nf-core core team](https://nf-co.re/about) and they will forward your concerns to the safety officer(s). -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. +Issues directly concerning members of the core team will be dealt with by other members of the core team and the safety manager, and possible conflicts of interest will be taken into account. nf-core is also in discussions about having an ombudsperson, and details will be shared in due course. -## Enforcement +All reports will be handled with utmost discretion and confidentially. -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team on [Slack](https://nf-co.re/join/slack). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +## Attribution and Acknowledgements -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. +- The [Contributor Covenant, version 1.4](http://contributor-covenant.org/version/1/4) +- The [OpenCon 2017 Code of Conduct](http://www.opencon2017.org/code_of_conduct) (CC BY 4.0 OpenCon organisers, SPARC and Right to Research Coalition) +- The [eLife innovation sprint 2020 Code of Conduct](https://sprint.elifesciences.org/code-of-conduct/) +- The [Mozilla Community Participation Guidelines v3.1](https://www.mozilla.org/en-US/about/governance/policies/participation/) (version 3.1, CC BY-SA 3.0 Mozilla) -## Attribution +## Changelog -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct/][version] +### v1.0 - March 12th, 2021 -[homepage]: https://contributor-covenant.org -[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 0c5ae5e88..000000000 --- a/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM nfcore/base:1.12.1 -LABEL authors="Philip Ewels" \ - description="Docker image containing all software requirements for the nf-core/chipseq pipeline" - -# Install the conda environment -COPY environment.yml / -RUN conda env create --quiet -f /environment.yml && conda clean -a - -# Add conda installation dir to PATH (instead of doing 'conda activate') -ENV PATH /opt/conda/envs/nf-core-chipseq-1.3.0dev/bin:$PATH - -# Dump the details of the installed packages to a file for posterity -RUN conda env export --name nf-core-chipseq-1.3.0dev > nf-core-chipseq-1.3.0dev.yml - -# Instruct R processes to use these empty files instead of clashing with a local version -RUN touch .Rprofile -RUN touch .Renviron diff --git a/README.md b/README.md index b8c3918c1..61512b138 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,34 @@ # ![nf-core/chipseq](docs/images/nf-core-chipseq_logo.png) -[![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A520.07.1-brightgreen.svg)](https://www.nextflow.io/) -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3240506.svg)](https://doi.org/10.5281/zenodo.3240506) +[![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) +[![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](https://bioconda.github.io/) -[![Docker](https://img.shields.io/docker/automated/nfcore/chipseq.svg)](https://hub.docker.com/r/nfcore/chipseq) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/chipseq) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) + +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/chipseq) +[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) +[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction **nfcore/chipseq** is a bioinformatics analysis pipeline used for Chromatin ImmunopreciPitation sequencing (ChIP-seq) data. -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible. +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + + +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). + +## Pipeline summary + + + +1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) +2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Pipeline summary @@ -49,17 +64,19 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ## Quick Start -1. Install [`nextflow`](https://nf-co.re/usage/installation) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) -2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) or [`Podman`](https://podman.io/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: - ```bash - nextflow run nf-core/chipseq -profile test, + ```console + nextflow run nf-core/chipseq -profile test, ``` - > Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! @@ -89,6 +106,9 @@ For further information or help, don't hesitate to get in touch on the [Slack `# If you use nf-core/chipseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3240506](https://doi.org/10.5281/zenodo.3240506) + +An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. + You can cite the `nf-core` publication as follows: An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/email_template.html b/assets/email_template.html index a3f19225f..5a4548bb0 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,6 +1,5 @@ - diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv new file mode 100644 index 000000000..5f653ab7b --- /dev/null +++ b/assets/samplesheet.csv @@ -0,0 +1,3 @@ +sample,fastq_1,fastq_2 +SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz +SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, diff --git a/assets/schema_input.json b/assets/schema_input.json new file mode 100644 index 000000000..a024fd708 --- /dev/null +++ b/assets/schema_input.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/chipseq/master/assets/schema_input.json", + "title": "nf-core/chipseq pipeline - params.input schema", + "description": "Schema for the file provided with params.input", + "type": "array", + "items": { + "type": "object", + "properties": { + "sample": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Sample name must be provided and cannot contain spaces" + }, + "fastq_1": { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + }, + "fastq_2": { + "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", + "anyOf": [ + { + "type": "string", + "pattern": "^\\S+\\.f(ast)?q\\.gz$" + }, + { + "type": "string", + "maxLength": 0 + } + ] + } + }, + "required": [ + "sample", + "fastq_1" + ] + } +} diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index f46cdb701..1da35e63f 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -15,15 +15,15 @@ Content-ID: Content-Disposition: inline; filename="nf-core-chipseq_logo.png" <% out << new File("$projectDir/assets/nf-core-chipseq_logo.png"). - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' ) %> + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> <% if (mqcFile){ @@ -37,15 +37,15 @@ Content-ID: Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" ${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} """ }} %> diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index e2b87c787..e1519ee13 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -3,32 +3,34 @@ import os results = {} -version_files = [x for x in os.listdir('.') if x.endswith('.version.txt')] +version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] for version_file in version_files: - software = version_file.replace('.version.txt','') - if software == 'pipeline': - software = 'nf-core/chipseq' + software = version_file.replace(".version.txt", "") + if software == "pipeline": + software = "nf-core/rnaseq" with open(version_file) as fin: version = fin.read().strip() results[software] = version # Dump to YAML -print (''' +print( + """ id: 'software_versions' -section_name: 'nf-core/chipseq Software Versions' -section_href: 'https://github.com/nf-core/chipseq' +section_name: 'nf-core/rnaseq Software Versions' +section_href: 'https://github.com/nf-core/rnaseq' plot_type: 'html' description: 'are collected at run time from the software output.' data: |
-''') -for k,v in sorted(results.items()): - print("
{}
{}
".format(k,v)) -print ("
") +""" +) +for k, v in sorted(results.items()): + print("
{}
{}
".format(k, v)) +print(" ") -# Write out regexes as csv file: -with open('software_versions.csv', 'w') as f: - for k,v in sorted(results.items()): - f.write("{}\t{}\n".format(k,v)) +# Write out as tsv file: +with open("software_versions.tsv", "w") as f: + for k, v in sorted(results.items()): + f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index ea4261cd6..8d45c71a9 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,48 +1,50 @@ /* - * ------------------------------------------------- - * nf-core/chipseq Nextflow base config file - * ------------------------------------------------- - * A 'blank slate' config file, appropriate for general - * use on most high performace compute environments. - * Assumes that all software is installed and available - * on the PATH. Runs in `local` mode - all jobs will be - * run on the logged in environment. - */ +======================================================================================== + nf-core/chipseq Nextflow base config file +======================================================================================== + A 'blank slate' config file, appropriate for general use on most high performance + compute environments. Assumes that all software is installed and available on + the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. +---------------------------------------------------------------------------------------- +*/ process { - cpus = { check_max( 1 * task.attempt, 'cpus' ) } - memory = { check_max( 6.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + cpus = { check_max( 1 * task.attempt, 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } - errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } - maxRetries = 1 - maxErrors = '-1' - - // Process-specific resource requirements - withLabel:process_low { - cpus = { check_max( 2 * task.attempt, 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 6.h * task.attempt, 'time' ) } - } - withLabel:process_medium { - cpus = { check_max( 6 * task.attempt, 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } - } - withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } - memory = { check_max( 72.GB * task.attempt, 'memory' ) } - time = { check_max( 16.h * task.attempt, 'time' ) } - } - withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } - } - withLabel:error_ignore { - errorStrategy = 'ignore' - } - //withName:GET_SOFTWARE_VERSIONS { - // cache = false - //} + errorStrategy = { task.exitStatus in [143,137,104,134,139] ? 'retry' : 'finish' } + maxRetries = 1 + maxErrors = '-1' + // Process-specific resource requirements + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 12.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } + withLabel:process_medium { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 36.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + cpus = { check_max( 12 * task.attempt, 'cpus' ) } + memory = { check_max( 72.GB * task.attempt, 'memory' ) } + time = { check_max( 16.h * task.attempt, 'time' ) } + } + withLabel:process_long { + time = { check_max( 20.h * task.attempt, 'time' ) } + } + withLabel:process_high_memory { + memory = { check_max( 200.GB * task.attempt, 'memory' ) } + } + withLabel:error_ignore { + errorStrategy = 'ignore' + } + withLabel:error_retry { + errorStrategy = 'retry' + maxRetries = 2 + } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 166b64c6d..855948def 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,421 +1,432 @@ /* - * ------------------------------------------------- - * Nextflow config file for iGenomes paths - * ------------------------------------------------- - * Defines reference genomes, using iGenome paths - * Can be used by any config that customises the base - * path using $params.igenomes_base / --igenomes_base - */ +======================================================================================== + Nextflow config file for iGenomes paths +======================================================================================== + Defines reference genomes using iGenome paths. + Can be used by any config that customises the base path using: + $params.igenomes_base / --igenomes_base +---------------------------------------------------------------------------------------- +*/ params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + // illumina iGenomes reference file paths + genomes { + 'GRCh37' { + fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + } + 'GRCh38' { + fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'GRCm38' { + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" + } + 'TAIR10' { + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" + mito_name = "Mt" + } + 'EB2' { + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + } + 'UMD3.1' { + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" + mito_name = "MT" + } + 'WBcel235' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" + mito_name = "MtDNA" + macs_gsize = "9e7" + } + 'CanFam3.1' { + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" + mito_name = "MT" + } + 'GRCz10' { + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'BDGP6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" + mito_name = "M" + macs_gsize = "1.2e8" + } + 'EquCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" + mito_name = "MT" + } + 'EB1' { + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + } + 'Galgal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Gm01' { + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + } + 'Mmul_1' { + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" + mito_name = "MT" + } + 'IRGSP-1.0' { + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'CHIMP2.1.4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" + mito_name = "MT" + } + 'Rnor_5.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'Rnor_6.0' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" + mito_name = "MT" + } + 'R64-1-1' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" + mito_name = "MT" + macs_gsize = "1.2e7" + } + 'EF2' { + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" + mito_name = "MT" + macs_gsize = "1.21e7" + } + 'Sbi1' { + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + } + 'Sscrofa10.2' { + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" + mito_name = "MT" + } + 'AGPv3' { + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" + mito_name = "Mt" + } + 'hg38' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + } + 'hg19' { + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "2.7e9" + blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" + } + 'mm10' { + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.87e9" + blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" + } + 'bosTau8' { + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'ce10' { + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "9e7" + } + 'canFam3' { + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" + mito_name = "chrM" + } + 'danRer10' { + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.37e9" + } + 'dm6' { + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" + mito_name = "chrM" + macs_gsize = "1.2e8" + } + 'equCab2' { + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" + mito_name = "chrM" + } + 'galGal4' { + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" + mito_name = "chrM" + } + 'panTro4' { + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" + mito_name = "chrM" + } + 'rn6' { + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" + mito_name = "chrM" + } + 'sacCer3' { + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" + readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" + mito_name = "chrM" + macs_gsize = "1.2e7" + } + 'susScr3' { + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" + star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" + bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" + gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" + bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" + readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" + mito_name = "chrM" + } } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/genome.{1.bt2,2.bt2,3.bt2,4.bt2,rev.1.bt2,rev.2.bt2}" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } } diff --git a/conf/modules.config b/conf/modules.config index f7bb77dd5..6eec7e272 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,21 +1,24 @@ /* - * -------------------------------------------------- - * Config file for defining DSL2 per module options - * -------------------------------------------------- - * - * Available keys to override module options: - * args = Additional arguments appended to command in module. - * args2 = Second set of arguments appended to command in module (multi-tool modules). - * publish_by_id = Publish results in separate folders by meta.id value. - * publish_dir = Directory to publish results. - * publish_files = Groovy map where key = "file_ext" and value = "directory" to only publish results - * for a particular file extension. The value of "directory" is appended to the standard - * "publish_dir" path as defined above. - * If publish_files == null (unspecified) - All files are published. - * If publish_files == Map [:] (empty map) - No files are published. - * suffix = File name suffix for output files - * - */ +======================================================================================== + Config file for defining DSL2 per module options +======================================================================================== + Available keys to override module options: + args = Additional arguments appended to command in module. + args2 = Second set of arguments appended to command in module (multi-tool modules). + args3 = Third set of arguments appended to command in module (multi-tool modules). + publish_dir = Directory to publish results. + publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path + If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path + If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" + is appended as a directory to "publish_dir" path + If publish_by_meta = false / null - No directories are appended to "publish_dir" path + publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension + The value of "directory" is appended to the standard "publish_dir" path as defined above. + If publish_files = null (unspecified) - All files are published. + If publish_files = false - No files are published. + suffix = File name suffix for output files. +---------------------------------------------------------------------------------------- +*/ params { modules { @@ -158,6 +161,7 @@ params { publish_files = ['csv':''] } 'multiqc' { + args = '' publish_dir = "multiqc" } } diff --git a/conf/test.config b/conf/test.config index e3b4016c2..948346acc 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,11 +1,14 @@ /* - * ------------------------------------------------- - * Nextflow config file for running tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a fast and simple test. Use as follows: - * nextflow run nf-core/chipseq -profile test, - */ +======================================================================================== + Nextflow config file for running minimal tests +======================================================================================== + Defines input files and everything required to run a fast and simple pipeline test. + + Use as follows: + nextflow run nf-core/chipseq -profile test, + +---------------------------------------------------------------------------------------- +*/ params { config_profile_name = 'Test profile' @@ -14,14 +17,14 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 max_memory = 6.GB - max_time = 12.h + max_time = 6.h // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design.csv' // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' - gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' + gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' // Not mandatory but permits the pipeline to run through peak-calling steps macs_gsize = 1.2e7 diff --git a/conf/test_full.config b/conf/test_full.config index 5f7262382..ae90a3c6a 100755 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,19 +1,22 @@ /* - * ------------------------------------------------- - * Nextflow config file for running full-size tests - * ------------------------------------------------- - * Defines bundled input files and everything required - * to run a full size pipeline test. Use as follows: - * nextflow run nf-core/chipseq -profile test_full, - */ +======================================================================================== + Nextflow config file for running full-size tests +======================================================================================== + Defines input files and everything required to run a full size pipeline test. + + Use as follows: + nextflow run nf-core/chipseq -profile test_full, + +---------------------------------------------------------------------------------------- +*/ params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' - // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design_full.csv' + // Input data for full size test + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design_full.csv' - // Genome references - genome = 'hg19' + // Genome references + genome = 'hg19' } diff --git a/docs/README.md b/docs/README.md index 68b828949..ac8a8b69c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,8 @@ The nf-core/chipseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png new file mode 100755 index 0000000000000000000000000000000000000000..361d0e47acfb424dea1f326590d1eb2f6dfa26b5 GIT binary patch literal 23458 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 literal 0 HcmV?d00001 diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png new file mode 100755 index 0000000000000000000000000000000000000000..a4b89bf56ab2ba88cab87841916eb680a816deae GIT binary patch literal 55769 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�)v~C(0C)c zgd3@mu<_@wnt>uVJydQ~oz|jKOy0;^`Z?+o2D0^+hp!@j_=nH5zG^AYBuV|wimv<8 zJ-BGiO^XI}T+0%OK+mPa+&L+!)PYa5H}wL${$XzJBCc;XV=Co{g^!)F^tz?jpNo4b zH_VuCMYaCaZVyd48bC?#x#Q0K4CK%<=X&Zv)V@IQ!g5ZVK?zTp+C(vj*rq zre0*ZTR%sn9`4BUqa`iQwuwP$!iTu9y z*^Aa8nvPt{NV`}cy5l$vTGknczicBgdPa#+$B~_lxB0^l39bW-wL`u?WXo>LbCrxs zHO}TPn@o1wSYvVPGZi62B3}9ADk9<9rEQFD-?ViCJHyk~ulRlQ*z07+ zmqT0+dAd*&o$#ah@3U!@BqPvJ}Ns=MjBuIqf9PCEedGznEA@4tG^@#xdHP z5}hhW*p9vTm8p^F2zoA2iJy%YoUT99TiNM^!6xPDkXY%@^R6F7n4GGx+4V!RemOu` z=Bso5M|O}5LA6BSOdLB#UmR7s1}UL!yoSsl_4aP{66T2X(LM*|9)bk2fjUQG@;XV5 za7g2iD)Klhxr?NUp}g%l7S(du@pSRzjsod24a*3J?<_x#8}8QdV|kf7grum zMHRS^M;MRa{Q64RKHpz0W`#~YUyQ#oG(l?D10Z|E)=~C)c9e1bRQzl_KE8L*d#S4H zGq*7)2eRPeh6YhjH3bvBj1tQl|SyY`C6lvas01T(9PNZJK6 zP3wxPDqmT-KbA4>ntJkBD=r{uh>P2dKe_5iem*i@&Qi7(JIJESfjBKGU&VlMgWXOZ z+grrgAg-ko&vt-qp3qk_{Jyj{S5C8tp_aWI-lcFeqdCorB>t+{;r}X*a{YZ_D7jsx@3ZLF5~Y0 zEmA^FHl-=O@oYTk=b{3)f#6wrVMR^aAFkWt`K!X;*hkOEJ}h?qih1@jUzl5Auc6L~ zxmKdYX`}A(wIiw@Nvhre3EN-J<9T?KI85Pa#lXhN0pxf~!g)YyRJC$%aOPVO z1|N}Vm(EBijEx+5zwlamO7S~iGl_`D(3_AYNv=Tp-B zLfLb!LWW&-P|dCrm$Sp?uU4-Z9Z(L)Y`Z^8vKv;BwSQutkP{9P7Ks==4@J%CYWj*9 zM}5&B_xX$_jmo8fH#TZaygRjP#vD;JIFLu_3CL=zp!gk|koyVmeEXBMat*taN>zb& zg&Kq-YKy~J*#7QCz^h^O!Y`}mn!;bvx)sw2>M`%V$C^-PmWPOs%LdR>R9a zjk<;fPnjUHaeQF}hq2MN56#UAxS3c@3Q9#gOvfR69IJ)f)#IIsnP!H1MzFJ+M~v3H zm2atRwZuz(u=p#QW$W$iOXDKnfSyYt`5~>Wm|Mz|({I|E$#NdL=fer>#3u1y5dSj4 zhbTlcNm<$ZXDm5+&{w;^Vnmq)aShdk!HJ)q1*3!J?c7eue z4Ayl-cd=DH3Kr87G6hlUw+4yt%YStriba0x#%6h8yWB{-wpg`bEXk>vAuT`8CMCZ= z-ET)=GS~U_weHAuj!N8$QxriRCC_$2*OZ)z1s7+y0Y=tKL9QtIwdQO;E))*V`;X)q z!yVh(pIlUb7qE?K#Tiudee6%#>#9!n7viM7$pyuCMEsl%le^k_Q@40@a~s%d)S`(E zEoa4Rt!`>1A*l{oFdqaZ%8$Gp!HH!0fyIoqj-0fBJZJCd=cuTUbI%~>YWI-?Xf_iU z;p(r4yd|!ntJP(HtQYRCvJmF3CM-fcN?4UOu~xNlO#K4l9UutOL;i*TcD40HZNfNZ z48=KpV`9#O&p~l1lqXnxeu_{R(_Fy18x?Do2vyIpfsMNi==h3*DeaW9KFeGKVIEUk zFA=1Sbsa>aOw&?cN(-LAsQGLQI*QKv_J(QxZW9@`w79A$t3iTm_8RU}= zPk1~jn1_ubHVP*Y=ty%DSKZCk_LL+S4BZt3ps?hcWV7U@v&+g|tce!uuT zoaf$auXWTi2^OKA6T^5VDK+&=LRZ zh}nwN4f|Wi2H;M29qxDsS1;ds?$L2%vs&=*`}(}x?fu@t5*h?7mkz7o7{o ziz|$({9mgQP|Q^QNr%LsNmqXDY%h(Z4D5=5G#s8mXc;bGXjqNhviHGjue>Uo%4SRF z*bqwj7Nod}m)P&L4UmIEG5T06`^F6ydHyGsz7w|bSdf}FmmV{OAIoAn zvSLZ+%SiQOM*3+%Bp+W1Lg$l}=r{Uk#**4isDECH=%jX5K&c!$Byp5BG?w8J;=YkIeXoqkj znKUFjOl-m^nECRn!;La!Lg$gJIgh_m;Fm}zxFr*;hzA!C9k~v(P>w8rpF(hXh1ovr zzA%Rm`6u4?vDUSNLT~;c9KJVF;WP;$)M+Y!vNGWDe8gda@!UuX;bF}B<-Nf*2T4sj z3>#r!`)cWpK08bL@-hHE@LQROyQGIdK{mv!k;3mAV~Y*& zSx9%5c6=H`R2c<5TZom~S)T3I8*R!KE9Z zGy!Hum?_Ifj#-ah^FhR$lt)QpLd z4Z=r(dZzP@l^;2su|VZMmnmOEH~2N&6&pO_5y1FY{2%~AEy}vnB0qX?;I+BeKcB&f z|5-n=5l=bT!BIq+;RyxX6beD)7x>UAtobc61SA?P_ozwGiB-Aj_c@!Lx0)r0&$Q*; z7-Q3p>Q8fJ@t8ETi=ab%YjAt}qA~>G@Vs;N-`I%rADs}msjm0>eWY*01Gn@It7Gr) zvfk|JHY~V9eI(H5^?}anqY4?%?)Xku8F<& z>_)a|3WD-J7>6{IyHJ7Ny`sr%kPEeFA5=8sz8I;*LW|uf$ijVCB$3K8y`x{FJORg-`CT zC}*oRScJZ^5!az4e_~k*L8Kie5o|%0U=n+}6MSoXJV^q{avZhx_N7Rh6~0qzf$Y&r zdu6)*)REIY#^T(0%7wuvlqQEMvE;#rG+58^o-`ukh`jLP##HQy1~6-E4c@rB3Pqh8 zDUnBX7mjDFaBO-{#bn&eWY$}&K#}-hW>rwhHS7<%)64c=7yoZj1-pKq1+iGlPBJuV zKWWI?fcdcbKl5WJrm2fffh~(~uvkVjp*vVr(~|$L=|8=URvWRpUf6Lsh5vzbQvm?> zx`zl(i*xr!4lxhdG3~Y`Q1gGiOqdro9<4s_DQ8>s)cb318F(RE9jSx=U_oa)!&<@6 zW>xI-V$Y4~$-l&cpIC)?eD<+JdcA$LeW$*9XCE(FnjzJSg_7=*jN^W1@WeUBcjDH4 zDPL7o!srDPfz9aXRG;qPXHjo@CM^=WfXt`E4qzoma*pJ40+uSL4biBj23qPqe)@#A-O+O882J9sS zx^ICqC-ENXg873a)hiL?Yz@}dc-2eO3P(wUqi2Mlig-`}Xn^2<>c-!c)nYA2ANpSM zuX$`hTok?gLtX^Ds38~f)saMV)hGjY49J#-6JXcd)fmPuT>MU&!;gXb^H(>&Zpei{ zD6$?;nhRf>Cl)J|l?%H+@7`H_THjT#q2NZFv}4$jI?{y^AFw)t(<3NOQOC{@uK$`a zoPZm>!1K=HBz(h-CC8)qCeFF)q=Y?4W0+Y>aYM_;Ck3GXj6bx#QiT@aGiN1BTVkl{ z$_soMv^o*z|IS*ibD=5ke1x4mH+90p^=6jL+vCqdmy>bpw>AThce8)=@3y`C^n)S` z2As*5mQq-ZofZMgl3aFv4EY~!kc=DVgPk4%_|XB9(t z&pkSvEgC-Fd2cJ<#I~D^+)wy<2|Dc}KteTsyumg~<4T`RTwO73uT1x6b7?Nz2m-zv zqyOe#?uynui^nat&s)saS#K051fD3HM8_dfRsv_4@!qD$rGwLBE5@Z2j9$ta(Iy%Q zyI?(ek&`*!o}zI)2_mMe+s^6{Ncvh8eAY-1@6{vYFcn>k8*Sfm zy$cr$g*55TbyE3$Y-}MsJmS0A>(>=$`3LA|Pq1!y36T*z%Y;3sBPxQ9<3LzLbMRC2 z^lI6cc)`I^f-xhbbhyc!6GZwVIRv`9)wSdf+(mLG-yGJyMG40l%UHu-3#%X;qlpQ4 zI#_zNF=lp0{;4(>6BbnpqPK82Py0fT!H1JSM(`6+d>88_BgyPd;`e|gGv!)&v8f|h zKFe}=GlJEsk%FxPR7!jXRBNR>!wcL`rav1Gca&M6@ZFqE% z`4Mh^%VfTB>88(OnS}XjA%!~1TgzdO3p7|7|926;mpc4??7wq26+B<|^nJ2fDzywu zFo?l1EdtXHOpk5ff@z1DS-<$rG(ZFiXuFs|}Y34Kpxiz9w9v)SYh`Qlsa!LK_OFPk$W_-wQcU; zqnMAG5Q$Prs$WQkS8`znPLX==kuQ7CiAW{Rl1k9zUL&)gL2Ky%RI6%ljx`3Lym78HOG_r#NWZ`h;UmT; z8Q;NB(OjT-ypxw`C{7rz=Ah6?Ilf*d)0!r@p+-^-rj8xi z_6SQ&${Rp@207;QK;#<376gviKcGm_O;|y6$pBqF&Tj(sX+L)PBhju%zN5&)Py{q84S1 z!u8GCK6^gp(|xu;h?PPKnUh7Lmhp+RzfjWm!UtOhw9(KveIW^uIn_ z_4XfElclN`*ZUd3r=6|g_*_mCYn{^noi)emliSaY^fz<49-|%;zdlvkVbJWlK+ewK zY*{HA(P$@!lXVkSTpg#-w&~WQVm=nA@QV~tjbwOd-7zb2C?(IOw{6?D(sBB$ncUFf zOE(5xIKJ9Pt&il#NG9BsH`1^QjnQt{9LJsje&!xuc&TL(@ zAuXdsJ#S?ulhXa4ohB~W21ju2HEmn9;Ale><}Dj~ZAt1pw2jd+HpPP}W)J-w1RDseHl7A;l`H-f zBR?QsBau>#e*U!E>9Dp@ArRa{F&#eiGa?C9X0D*u+HD^SnppyBly#h5H*jF%%7=!sw59c9vD zehhfcSO<-^K!2XtS}}-6ld)lbeq<@ttMA$#^BVn6O>T$3LxpcObE-NtEn)SH3DAgsjf%Hy@L@o z>)9|}Njhf6u=~m;LtCH0meC4`1j`X@*Usz5Oj(WAi)jVKP9?vMg6!#`W_aJeyzA9E z8Et=&jhAK;rplBlx~kENNni)V)@4o#6iK~r3DI>TTeDky--t|0k4HK@%pgO9xQ%UD zyh!gX7B7xtM3{)5K!6}U%CGpooZ#bwfJBA8TNJ|w2h=#+HMy)2qAkKu)x~cv^MTR5 zgRFZprT~ARVEa$0VJl_teYh6S_m})2e(B2S7D%gA2}!UY_BEL%&Tpl&tiC2nrB;xd z>BKo49MIQG#xbHH@XVM6HDxXHxI_x8HLWh^aO2<0Q|I4KOH9SCksvdzy{{R;Q_qkt zt6QqxbuiwIc%>4LsbH_z77CuZ(N3Eh{Hjl*tq**sjUxsbL00hB%O`K$_t@x|s{n4T zNd=a$$ae5z7;Rcbu!eQO`0qOBG$j8>tyuBKRunfzdwqI*M)DkXw4BTY9#k;h5lpSc zQ`n|Bngm4zP!!TzK$%?Z-G;AmCHO7HG zJ4a(MJnx8jrjb>P`5nQ+l}d5)GCk*Icu;gi*^oOINvafMb|ZIakvKmN9Bc9!zuX@| z8c!6fcJBtgI}cj%Z*hu}cIGcMT*eEDaRt3viG8Pz`YPlFCsx%E3 ze|0qp+oBM@_a-zIsY9^~(nq26QCP#uvzBLITT-Fz1pxTVGcnL9>X6Hfuvh0pCi`ERa%Md2+UxG~gfM-;9Wc)ekf>K{tXe9Mtf!(RFbeqz0o?=Tkh6Nvrj3gQ`mk*o^N zm!-*o=#C|``9cYa3e9*JN%R@qkelPrEPd#e)szjS?u45l-g~tSiv;RefFk~@$ll69Yelw0B?`5LzC;tmCJSyx_+HqT%Gc-2 zhqa7V;q8X$f6QtH%hylOT@X$Mzo#h71A{SUK$?cZ-d!_6boCTtWx6T|zRb+Ik5lZx zC5dG%G$-g=G*YM6F_`aAlH>GIDIqE;_y7oJh498JT}+&LXR4d;+c`H(r3h&!=?z9x z4Q9TKSxmY$n+qmpaZ(L5^RA7HmY@KNAqINP#5>dVozR%cDNn*ch4az#C??EvxggEz zsSOE4zWxw3&F#htFngbgdsT{RM~3V7uK!%; zSN!T%2CcRzG~5cBOfItKldRJy+p^9QA@i?}dZ znE+cDmfM=j?ciR(FH$XL?toJf-0P#?``x(7+V%+5_T&Q}4ryu>>On>|O2>w&hEpt* z5)Q%Yc&uncx(~56ht=CiOPu^_jEY%zk8Kpx8pu5Vbwy1^yuRo6Z{#hTke{V6p)&Tv=g`ZHv@IDp| z9-YRIOoK7?Vhu_H48|kcl8_9){<@Y7i_RF`qbV6-7s>n$_Pk7Q+O8Ny@3HclM47Ac z6zq|t>*>*jzQ1Q3l^j2@k0ZK+I`N0qp{^YV!oBYzZE5 zSvR>;F(^9oMiSA@_%a>wFdl#lN12STlFn`{Qmaf}rDn#9RS6j!Q3~}X zj=UMxLXAIWT*~kt-mDJCc)Cpz=ibFBQnyK#3pFG)Am4l|0PbQn#eT`Vij|AEU5G%h z$?8@IdZ=eNwR^{eh9<;Pjkqg_&CZ`Hvor z^fGvd$l6WXOdtBDp6J#m__((+#YK7r9MVZZf^jwc^VldYv>MnCwxEHmjCA-@!jTj?aPs5l^liizJ(^&FE1FpZ{Ym2#`r~ z3$WnCaEA?+aPxO%`B{1|`gSd*Ka{eb%NZ?ZKVE^@Xr40xBKY^cL=YK*9#^7FK>)h( zQSI76fgkV{B@bpHxC!faVCy9_0+fD8)Zyl>Oz5wZTeI&x21V>$btPM->8wm90k^yf zdoyGD<+a&Jz#pF3h!1alyPUX(tHDr~S87UyD+l>$24NU?oQO9D4|DnM<<{P-5v z0EfE~)@KAjemmaKTCM0`k3tG8krF!R2_~LbrBR2%teCVPh=veVmQB9mWCw` zRBgo9P5Zjdo9INN96~`85TLimeAWEwn27-7gW?#U5e%o(cE$*1-b}L?*H}@0i!8#D z>Uo|PP&r6F`v|C&?si$#j^150fj%x~5ONvfry{1>s%V^z?BIVI6%;awoqIAAE+1r% zr%okZN!tCI+p9joS~>M{6SzZ;3?!2Dhs9X!)6EG?W`;1=K2r-_=(Wi~M!Bb|OgmT_ z`2VC)SopD@PttM9_!%^JN0ir>nt%q^UFnwBe^6%XTT+3YDSb?Ycreb%B%%D&Nya3+ z2w8xJsD7FRj?pAvgW`tTb`Y4^yWJDg1&-?3wn>%6BsC2_CNkshL&e|3s0g6 zCp}stZhun&7%~}K)l7`s*HIU=ZT@Ig^~ciyxVAo{|#log(TGcqhFz2n>YD}PfA{!SqL*%27i3L zVt~5xwo(|dpyWNbTT%Xq90l-OjX0{cQ19gm4a+43;MeNTZ=^*pQErF466HVSl3n+B>}KhjI4M{vNuAyFoXS1WABDQ=ro#C9LHsinW@c$u zat7*s0VfDf|5M;;M0)rQl0tU8yk)AY$&F5i9w5cuIvS^~N4`8Er&8j=LloSD zIB@a!n7j^ZL*-A|ES~z_uESM3XAG>{e-s_b5@Y`0H<8?2V(vtNLcG>P#L70QDc=)3S59YTUZanCyxMgJ9IkJd@Js*GAR@QbFvEkyRt*ihX00jFbI`A{T@Hi7a>$ z9dv>9Zj5Nb)QrZRk2L02K06WlI?fU!y<7-R6wIRSDQm0??g)lKHj%zN!@_9%(a0V@-q0Y8JIgQw0k zW7KL3JY)7Dk5n5?r)jU5j0mN7vF}HdGu<)aLXMCHNd@t)OBd>dOcSQhVqu3=2eTsJ zgNs889adQocnYQEJQ%-no23VQ4pIz4bPKzPwc4-DLBR#uam?%N00hJ1njr|mOjTE{ zuR*ca{PW6n35vM9iK!*t8#DOOToBZaHj4?8k)~387a3NBLhj#R<;uK?z!bpJAS{wMPPYv6QFvJ; z1pm(5kCd0#WeWoFpwEhy?MR{TpwFJvXUtWgmeSGOP~>%i;$uC8L4s7CRaGSMz)fV7 zUH@X6>SJwD$y@wy2ft<@D9oe0{#fa=1O4+V;?Bu0XBj9@M&lTPmY1jKr%$u)t-%0H z3-xW%={G`|GW$M+@#1R2?cK`Es+e7a%3W&Y1={ajI{pp38a*BZf*cLMk@lcca%YXg zlb1((z53>tdl)5ewLO~{@W(aPGbV;*m_@yq z!qTY3JAN1dwSq6%J#P}Te0+5klVk5cW$!ppnl4pN5rBxnk}NjD;mr^O8WxI(tuyk`0_N-ZINriG=?|u0V*1~khV8VY1|dGfHsb!! z+(Ui-?Et=|dkl0Y1P6cph=LaS8TfA9T!yz?PpqW;y^36HLg)!o#r+qiEHMP~Vi977 z$7(}MP96Xy$AJ4j@)5S$ z2snd)MC1dM)y=FAI%aa~((I9!l;V~J2~%)Ps1pnWdtN_h)#4y1#Z|)Fy9R6MzFoTe zsG`5SF9Og>19#F$6A!2U5?$CmJUloKIWH2K!Pd!8Gl`-1B`tWbEj% zwiRkjD6ZDTM|sd?csJIOZSX&P3A_*kqq5%5i_x!yzuk!p2uJdXg!FMp@@_6aB7IoK zTfZ~n1_C0XsCgX-MJnqGCJnx&_GY%K+A@wwo}wu?zoJ5#%SCTshjddm*NlVOA60_o!t^8= zI0W__5IW`8Nk&UmI_i37>*#cFxlw+_lofMOq0LpPidbt%JRf+;51US0iZ2wkzhXBU z{sXo$ZRM!4y-fB)6GIa>mYK;(pHg%hKn`sr{vXS;Aw-_P)O1OwGV)Fmp4(3wz9Z;JL^LazLgBqs3c>31Ete zkvJ1G`mg2RFVoXBnbHFFXWG}DO5nA2ddz$^Q8rNcLw=sroH}ESu(vXg%7D4dr20c9 zVNbh2>kz^V5OkSK&mtMk#;7y~;;>bHPfBU~h1=K)Dez%9_oT_M9oq@hXPaCI-KAEa zu{h^qo^D~8_;yJU*(bQ2%Oy5pYPXS<8wW+^w*v_EnVFo=7Mxz0CO69%AvIkDua;ml zz0U!d&tone{&(zC2X!Ary4j(iv_c8}woL+hqX_34lAb%E5GR|RK3+PiU)tc&EO!lKt<)6Q?q{01?$TSpi z38`d+Wo9~JQFS7;L2m6=S4)!eGXEzn&)k-^*? zd1y`4oT}4%G%!z%}xCXHc>M$mhmTVAT336kckoBel%Bj z)&g8&jvAf@O!Xhv1y`%@vuHDzBU2eIKJHE-d^ihaG#+dinEZ??qTvKcSlIFl81&S% zoHEM=3Op{yn%GAlOe-^MQu7mA{UvC{^itXKzvVGn(In#i#7D#%-g`5-t%^txqr;ss zRa0U@3P+4G!CJk))@m4Yv!C;=t6-d2%gT=&k-LlU|HZLBjegiyu>*aHJ!<&T@twR$ z^k4HAr3$u8`D~&vUEwT~q%_-kU^k{QgYV^l6xU@aP~?)2R7Ni$;PRB>bq>wO4x z2Q47emNCk?Js?qGe-5jolGaEsMPNIPaN$dtXL$dp|N+K@#;;e$!}L;e9} z9|)HU8%z}N04-t!fy*cV-| z&}2yI^chFepYwSOh4h{7N6VIfD{fU8et0cv8q!pPWz}4dDhN9|6I4wEbU6S->l0aK z?`%!J%XqGI<%f9I^uH^v<41c29XWsR#SV7|oO?9xCy>;&NqxDJX*3)v0PF5mQe}Es z@{;McY=s=QsWN-j8l0i~VYxwu_RW_Ls(MO$M{F8D_^*6~WTdgNv!&mSpEEAgV7HKY zTz%Wg9D9(mFuZm&NL&x$k&5rqgW!Yx@a3u(zOIv;Ue;XgsP!R%QYvY);a(757zH9- zc4Ud;32BE97bj;-a`!?>KVi0llNL>XV{9ku{Qmt2^8w^JR*d2BdNFU}#jr1+?>tXidnE0BuK=S-> z=h>P=fbRnz5T;}T#2o|*n;igrz#sHq*Bq9%ys)H0F?pyPCv1_YM@pkxZGk0jT@WbQ z5KDokY=z2KTuDMU4aqZi^4=l86&mO^S~CWqFJ#i%2anIL^fydaUH znXJV@%IYSNofgsOQP}Cg&4d09K3VJd-5y#GZ}o0}XOvHnK&sdphlZ&~#{|6}+ePr)l?$_|NKwLRKN(BdZ3 zo#DJ@U=>sU752Y!1jPp&lbVL#t1ET51sA7t1e0$u;%X|Ct*=X&mew+NwOB)Prz=`#`&@WnIu3xwe)a~C4 zL3v7x3@n3V8V#$U@_G!`_`vmnCMluP{oO7rK%lLl3x8yU+u<%d=vI7RcD(rIYmub< zT~sKdn`Pe^#RKp{qrZlIH+Iz?rGH+&5V9Psbt{^s~I1Ml@4D2Us9a; zf4SJtwo@OBo~(qNojBF^%Gy!d?!UHHei#89mXzm%#QE2`WDj{{{~$+0LOqi*%6P%0 z%3*@i?u*OGyVk3B*A@ywsLuGBl2XYGDBy!kJtwQF*UaS`^K4pW=iof1FET}khs3Pk z`NJ&y!b>98;h~${_Too$)x{x$R6!8lWcpKg1iM0@TPL@5L~j{1C5nuVnU4R5xHDw3 zqy^a<2LKeQ&$;g-_YXS^u5A2l7-&=BGi7NvGn(RPbh&U4IM@v9x)hMm*~+kBFCBdP zu4W6LX$?j_MX-4Jo@9aOZxENUak7i;55J?NPMBy`KM7T5ki?o8-nY?+u$qaWER8=g zX0`0P5AGVR99*~Hw`{`*p!!-^knJK}Mz1=QZU%3}(R)yvgcrj?|fbhq#uk$67 zMp4}MhtDq#SrBar_6ynA{zL$l`8iMX#AmJRP2+R3}^5MRaqpmbj8GW4!Z$hLkza1`zr z@k1u&zx9zVlB`!`#B2Lg5tCAMDrTA+UfcW6Nk5kMr}E;uAB)ID3+Z}V$xKiXWLCGu zb&@@Pb=!WfDCLy2e{fUTg0SW%7c@zmHGmJkn5=1dILIl&6ZLKPV0MRz{m^T^tnU0UCMJ`aMmWMX6AQLqmL;?q?P zsbsx@f@LdX-&7D>Q*qjpw6tK(m1T$qYAVZXr#d;VCrG*3N1uYBJ$*>h8d-xGYpn=o zUXj?>QLCMN@Z(K7T^8!Pfq%bg=|gHJDV*VtQ|Rre}=?E(~;cSh>N0a!&!`UV$bA_ zrNERQ=kmQr#)YKfW1eZN?^ZaROvEf+Yg$8b;+I~$(Pc$u*9{X-G#3IEkEt*`$QSVIog6J# zA`y-Qp5M6VpbaKYFu}LMRK3jUvBOu0mF2z1`>m?1rp5!TB?KT<)b`${2^}{Z=Kap0 z{@V3UP2Cu&xngy8UO?MRAL3Ui;OO2=NV3gbgfYwkP86@NxCxSNd?D*Z;Zxl1p2TPq zrfV*YYx>zPG-*J6HTk{i<}%v5b&p^5)+`-ncA=7+ncNZE0?ZkE3V~-}!vX1E{LVMpgh3KmU##d}~-$~?0L z!|)PA9W6o#giPgsU|Bd3WY?@A&mz2kBdC8gH59E4D;y?C1g*@8X)44>)LvUB+KSRrZn=Pa@>glXfFN%iKv9F#NG)hABKjwmrQf`7$ zE^WH##}=w5_T5xu{lMbWSxb-&^K6pkh!Q&d0xdri^MFOgdH#*LE+|n)iWM|pweW{VTV9CFXr9w? zT@lQL5&`5YX#i=(c#8(v!80ed^u*m4}!_GKMeCmXy@wwvgds+K#6l{NU|Do5{(O1B!Z{bv(e>!|OAEauS zFeCzQ!T5<^)IA>Yesp68z2Lp{xE_t0@12s0l`&0uW2#aSd@}jt+iIPR$@|wAI{##s zO~&Eqz$0ku7AcgPbRy%=czUPh9_h?#Y7j1-_uwi+$vayFT~X+LPFx#MV3UgN7xq*W zdRE@0<>|@hX2qG>alJKa2Lf$fQ{-%T4DfS`J5Uf9P!LYt8I`KK-+Y^67+c?upqH?A zbu+jCX>IsTy&Mr$c#Z{Qw{IN)7_C$@ll$C^JjFaM4UaBV3d+sjB%0sMUs6dF*N}-xms`V{CaT%m*h#p@O z>BQbq6`f=qyyS0ry8-B=tf6jBpPis4XrLe+l{eb)ECZnKA49`I8v$CsCnT;z#CU*a z3rJ6pN9ZOU#7HD0wcJsit~-$nq-<+5xq1!z^C_`6szx(sQ!bfJfwoLDM^!hV!6YSJ z+0L#W|7eCMNd}#2)Rrn)R4P|t<_mHSDlSf8mDcyxcR%pilbomaJVaG_erwu*dH6n; zqfkc$7&t{y139)h%fUV|pyCnKR07)+)&mzNl~E!yFB_feQ(|~4lV8CVewB`IK~pJV z&M*5ev^{b(giYFsq`_n9ZtN>{C@9!j#P?p^RxU&>uHm3yb=kO%=F>&qmOf-m(WdU_ z|GyTDdlZ_dFE9Y<2rhwQ#LPA(L4NcFlH`}C(gvI9b*L6E0yhqi4ydqdDEI}QbYJ#w z6s3BOr4oJ1EEBU=s*~`r&>xDG?ao@fK z-5cUhSAgf=s%@m1wL)&1?g>1;v`GxC45skT;j)yN7-vDMotdI z3OSDKnsivlGMbhGKdZ2B)r5|NC4od58dXW%bW&>Fm^=Eey|!iZb?s;alW-ume{ME6 z^-@gBV6DY|joezuIF0uoWhvV7FGr*jd;7XXF#8r@)E{3E0EdqiKw}A+tfszOT1xAM zI@Yp=1WjEk8mu1Q_};EU1QG6i8p@7^)KpTH<|>_KzF@VKS?)}5?*^>Muh{Dbomv}C zZ)MM%Wl3xss_PQ69Hptk8=e64H@5$<)w6K{ka$v-q*jkReP%Hpze^vX@;;S^oiF#p zP^ZC<|BZbn$a_rk_ND!%!^nzsbP&HxMfr4&>`&zRfbmN4n7}mH0brX_P`(N#XNl#< zmlf3~Eab19m+!$p{M;v`C0hYbGa_hx+LXnSpxzr-XRM%bQN=*EL!~-s>=JoHgqoiD zmVUtXU2Q0#koE<;u(ea_d7+7=)KNo`nZe3H+js%Zapby%dzMdg8Q?dPc>0LC=XW%$ zA&94IY=F+HD-W#y=xdOp2alN6y9Fl0=p-sQ1-ZEslOzb)HC zFhk+y8%GUGuIY{$8=Ly=tk*N+t09D{jR&g)Q+MN9*#U%VFjBCoYKH{i_rn4lrfa>o z|Ip`>IH&N+O+v3&tywmNYXlqo#0uK=MYXTRWm&c7fih5AWF1K^{7`h}&tQ%WMSXlH zROqnOkl9@Ep_(hq0c+Lm%78cqD5!7Hhd0}Sm(MfNEQPfILeGVu3nP>A1{j(9C!*9% ze%Y-f92R*nz*5!ps^FtUL*f%R2QFQZ?qg>85EhKo2PkKZ?fG5MUQ(OS#3l1T7ru+F zj{*hHy1JjQSmy((?D|kgxB4pGy3VpoV$y(Rb%Ou@QQXk+LK+jk1>2b~=1%HZh4Dy`vziB=x^Yls~C#>020lv-;?LpQ~-2kH;EQQ~}+TdG)vi3@3};f$5i3CQ3^ zYuR*OoV=rykE7K;8F2*>kUmk|ppqG+Wg5r&D9;dTq!bzT=#>%e^-IZIqXezVLBrT& z@UWkNe@2~93z#=99oN6=eT_z!x91M{2FA`8&61U;EHu_+{`Z+zQ}A4Ix8FtM{{Ptf z%BU*4w@*+36#)eWk$R*XrKLqWr8}j&J5&UuyG!Xt>KwYeI}aeufkSuCMxXyXGi%M4 zS!>pOdOykWu6^(O>iAtNOJpgMtw<0u=ihwTrl^KTyoGbW!|`F5VD^;|{;*Ck`6BwK z;R!>C7GoQZuIm}L!o>aW6XTd5)NV}ssjS7%Bne6|c$O3=(!|DcO2obc5h<%vtQa7IKA^Y(eaz^nI_J}jXD6Qbc0+zw*m zGAIlpF_r2+duF^JU?lZXDB#CXv2-iSNV9zV=2n^iF}4MD^%w0|x+=}D5%*+(Z+p)n zGcHG)kIj}gk@-va5Iz_UmCi7B(sM-TG9gZ}QMBu+aG7*L>S^TK`ae}ldtf4`t3`*4 zS+Go=c!Y$kP>Ok=f!pk;I~OzWHnjn_M&IKy?9^)CuV?9YyHgdXu4(;7Bd5 zQBNYajdS@nDLd2>L`LZ_uqL%P^s?e#6x`!(UOu7E#8ZB2dT(B!9;#i)q>$wuuwA^h z1As!TH~iTQ%?dE+i+}q5Ts+rXiQ4Zbt;Os7rw1K@bJs%jRGxR}QP$xyB(hl|UGzI{ z_&}Bl{<|`5m=#psfJY=E?{IQ)LLo3%Td_LJuKal7>!>LA_aF(-0WAGk`b#2n8oQuR zBXSrK%_V)B-RXe|Lo6jl_-`$PR(VcOtlCKd8NuQV~m%VsU#5A;sxAif^%f2W!v zV6na%<#KXl>0(A?!t>d|Xs6GdrDS?=5%hQbgnWqO&}rE3oN3R2{281Vn#d2EoVz@B zFNsQTDcvkO^}5C)G@p3%M-UpQ=)qV!vgOej0_~u zxVm?()qPlQu+IR^jSYtx)EOOxcHyV4N>Mx8W1m86nCC2Aq}jL3u;Zzt0>tq%$*_Zg z&GV8S1T?JU?YpbxzgXO#7f|@|2zNjV06!N&KF*F8sq|(Fg7m&tlTDpz=v;hi6_F}?!{@{|?Ly{}xL_P%Q^5Mf!3Uv<6(a-(z0BoMwi+9SaqTkg#>?mqAtcx z7Vh2pH*2+T)_C~?zp_=^DTZ1|e#lm#W1_Vlgs`z7dTFc5)y!=)yBXI-q93sE$jN)W zci(K*?77VK`%s(xh#R+Q~3K z_SwGZ*lrDT=#Mw+#TV5Lh&{A|&l%X$hAv(%Jbc;)oh`WA`CHg`HO0zn^yJ?xXia%> zY$BfiLyFS#=9dCN5Pa)_=e%*kN9L;KaGTbp9fi%{(1NmOTlM$WOpd2na~su$2FzP8YrqpiD@lmitMf1)uah)UIlDowLgx;4CIVWA`=~L--eODx>>w0 zq42Eoza~BAJ$%bJ8Q@=ev~=X5hW6KsUuq+grCk-ylG{ChyStG|2W^?vp5IkS1!|R| zJSPJ+XDyG$!`L6Bm17Q=bH6bt)CN0vhdsU=$w}W%*ORs^itINANY8Cb2CVGrJspQ` zb)d7%O^4T_1pw(B^m`ENeE5N!-7XZc0m)L83yNq5Ii!L#^uAxITrXC#pbdEI`eu*v z#E0BJaTx@Uo~e9t8hIOS_`46)_Yv|b{mzas8ou{kUhRy)ro0!yLl7r4i6TRolRV}n zz-b$y`%$$Iokcs&O|=MfK(P&vM=x10xL%c2mnubaFlTN1%ctRr)FX*W-I!^U`wo+i zI-^egAkap=9LUdqa}}h(l>NB8Yf;Z7cl&ARwr@Ayo=ud*FQ^{V<~}t`@2c&7K7)kz zyBVdYim}v8y6~A}!9RB7>w@1h#(aCtmq=hdK;2j1FUGnr_YR@HWSDx=ZKq)<6Hr6Q_OlXKN8P8$@+TzJM)aIEAUWv3 zRqdt7&kapo0e$O~MVW5fCL9lD+K$`%mK__~j;r%g3SKioa1-)p~6CIl7WCx&<1X52k`&E#vUN_LjxZ=#tYs}e7C}f@Xbwd?wN6I)TQcH2O z@5phbWfo`MPTKAqrfOkfq9=v|)5=zU=+cfCgud1f%5fmbfuHk`W((P-W)v1iwI)-# zTTw^evY{)a)4mqLo2YoA7YM3Gxm#068=i-tQ=<$RvO;o68E$ctQBJ1Sa@yiRVIdk} zL=b9xV0Un+?$XP$2Q1o(0S4>|1Npxj?(l%Ge|wek#Dct)dyLE%#oYoGJE@PoZ|C<; z@)J&;GVmBE7WbN<@i=`{Eg{7Dbq{hzio)Y-6WX=!z)WCDZV)D?Ctnk;_MI}L>ZwtX zq3*g$rM9E=EZfxURP~agWyVx(C)$<#uvSu-H&`7L~=IWbY`erWU!GmxK~32z&7iUb+4*)M{62<(fbyUL}X z;gLm}Me|4C>eTss;;XQP>xoXUeV5lBizj>0%{g1R)I0IYWtBK63}X;0EhH7hLQ8V% z&Om<@Nl(RSGmZ4NM3d2HhT)ech{7#I(Uv79d#if5Ql5nb4U;ciMlm(CS+y)@o4N&_ z{#9|!`p$5O@O?)9JeGu3iqbtzYq7Wpi&>&;f(%-8*3}2kD_Px)daZ;a znk{{2M~%;IcIhlz@B$u?f|ir$Ee}Uwu6A6X!*;bG+>FQSp%Jg5dz~>OjdfER!Hgc2 zT^048Zs#3gx&VRG(F35LS%gfHvX}iqLC+*XDfZHS&(dK__!}bD{u5%5pkn z7n#LZcQwzs7b~;B)y6MFzNeECGlF>$ce|L_o+43@7eQsrt6(qxD|?McH8|!+ zi~&PUPFv{vaG(@l1+Ui{n-B=zCyWgUsRQv~->GuKGC1xZjYvO^bI=im)K{aT(C@qA z#}k2~RC=rwBn4zh)Cy?h$VQQ>9B05SnMGgDWEh*k-}&|hnc&GufLcy76!=D+pO()y zOV6e(>{dC4K*$4dzk9CM>Y`JxWx|WBFFz^D&<{W;$)#;>9HC)^Y0^bktoQ4W>w!j6(8#7d2(>HFoYbWxPa;=9VaWbohWgh0wIqJUyA;R;LdJ;Q%B>TbjyysI8lR36tBt z*F(=XO&(Q%$)4OFQXseJpCeeXN$>+qW61gL^>!B8eBL!fr#{c7gZUD!vgLgBYtI!S zXjja|Ll6cT2_qA}pijQTowea`BG`{%3k?X@5@b$NY`xD?3ST+0FjMxUZ$JJg8^G?S zw~Ia13HUvWu(o;x88d}GgT)xtGEhbJ3XN_Og2@`3`$~T3kNiRX{E+Q^ne~<{-`lqr z{HS=iS}K7}2@P4>3@Yq8rqv9HtLpvr)HJtwVkF;*rWtefVj9t?7M#iwaZ`?h@=sv4 zwfFU}Ei5Trm~;xVn}N$)fwy;pv`aaXfTUMiW{s*NVx5xmAPT3tJHUh9NSUd%+&HY# zxTMlL&3Kp3e3wt5wzgX|WBPF24sXDiDOohs$f4-v{q{2Yiuo^+g*TFgl8lZVV-vqJ z7Tfl^6QX?fo4Z#GSaGz9l`X#EdP{n1-QLt(U$$Iw`J@aC(U!xf4@(c%m)9e7zU!zC z4}7VdAlTeSKR)(VGCPJQzMyDAKe6#Rvp^scd|8b3jk6U-jeLDjbz0~5vRKWi&9lSw=8yHd5Ypk-r=N=*>&*L`*@5vnFxto1Bx7H98)pfdGR2n=eWjXGX?eq@pEG%q4pLag@G(l6N7amC4vea^al|i&J zo8DR}R@#f7i!z1mpj9l$6W7y3u_#7*Ctk;1O@MHwe38G#PD zXK4WD6J!+7$M8do`F=p4;H%MORtoN>AL4I6m)cIUrudR*Z*#v^Lk%)SC<6O8lf z=qF5psNO-g+DoF4qNl#1s1Lt+F2)K-O6F$0n}TiVFnd0FZQuw7DND&}`x&?2VW+be zzom_~X4GoV_&^Em=ntJ`SqcO3YRfQCKr@#(V3pLi*Rls#8-&yhpP@}JOnGZ{I=Vbv zd}nWmSOJEUkv$!{Z0u}J-TA?XZU4QlmL)iRbc%RTHQM_$e?g0-YfP9o(q!~+csQI$ zK)aoBALEJpAlRWN8Ja5%5zs;@9Z@%L=!8y9IRmRQ-hL{9+*0rKv)e7a!eJVPt$%h8 zvxlwXPV%n=toc+k6kgGB)4uzZ16)oi(Els1D|9?|dNg+I;Kvyr2u66}yDMNz{W9!-8T&0< z9`tLV5LKyQC`jb%NvOiU<7S9Zx%z-+2|nS_vTw@MU-zVdrvN5Yxqn*2m`yO0H5hc< zo?Mjk8+8TMg;C2?Dz5B1Aqd_vuUx41yZq#^ROedQSyiDr%6|oXUUOqQldf`eBe+=* z1TPO#@lWWV%VIh;asl>;g0>-AZY#M92GUD^P`#CM{+3l=v?B??h9y~ zMbgEK3L|ktg{6D<(H}cSKkutKzK<>;y{_P=omYFkncFbMmzW3essXsRB-@|bErFiYvPPVZ!)vc1PQ;Jo_0&@kl0D?z9*FXtQcPj ztMzyy*Xeb2Z>yFNa}rRlp@L4rW1|zNHFNrboj@s2ULkLv-tte{ciH$CTWz48mk9vt z>3;gh*>45~RB=G?or>l4@9C)bya_rZli4?X!4%^{8G0Xra}r?vb}LqHx4`-lEfi1u z*B0crsH33Mi*5^f(#Zkxv0M=zRWJ)NKuSM`p!~TuZ)JF-ZpEN_Mx$H@R^oUJwq&PF zXqpF@7wo>n&Vy0BRkahDEeT^h_1*B*3BF1nqd!9mt0btk=9%&sqL0g78^dK&I$Un0 z)}&%VO>sHP=(L831;_M%{%hVcQo`WDr-<*=OcL+ER{NuA&u}OEo}J0LFz=b4z>`&#jB*MLq2J&h!&9@o{VO zwYu({G*vbgPE=Qxu5zJ}!VmFiJOnOx$?15~i*MoiUoSoRKq;xb{iFVkFColaGzrqN z@>(D)dGes>A7c6{*LM4&*F#VDg(nJR*}x2?IR?4DvV@+1ON zfuGxXg4k8DO-p573F@$PwK^6%qc6$Ol*>RS%d^KeDH`{ncFrpoa#ww_LfVm-dbo)! zN}KX_*Qg-eJhvCZzLrP|Y|~@X&Xq*6>Jb)Mo#-kBQwo)OzFd&Ne^R?l_YJ8F!jZ!` z7u8U~7G8(S~@urM;F z7b4B;``hMIlP^ua4Uc16d>O9n8Jv5w0y1}`4c~8jHO&SJHBd24L8k6Hn4Rr{AV|=S3HYCloaak< z`wC}VdCjdWA7_6SXq0pqgE?Y@A$+F?N4>(LU#-ufDpwli9}@v=&6tBABSl$mx6eSm zYym_5K>|URD$7U9KPr9aJq8;WH-ac_UusZI!9EqfaS+c$7YR^V5$QyFWeg$jR{B*H z4a?hwrRGJqS|j>0NanjXQn4K*Pu6f{_|1i_xjrH?!!ws9Lj9w`_=A z@pXIADP9D)JMFL(*+HgIoweJ3Hw*{pgB4)VKkK zdwNC9X6lE|b^zGsSGab(>>#KT*`tn^kqRQ~OSE#1W7Bc^u#Qo{gLZI!WnNyALdg9t z=FQ>IVr*mnYCcH#iPx>m$foh}*%2;;9_(sg*SPIRPiq)yx{(?5Y%xorkii72G zv$3bKYY4;r{q~+Yw0drlXJiJaPo;(TrJ7Pe-(pJ?vLR0#;$v0IykGro{+7<-2}dv8m)YC4 zsesa{czQQjDu9Ldmh99J%9}1_5ulTe#mTnV;5*2{f=w9Wn*A+_xGPUfk`r4GB;`aEQkpd)ZSj8EYN`#wd6z05IlD;7Z|)jhM^WA ztus>Vv$o>r%7U#>)(htR(8rRRcRmV^{mk*()>Zd;3{J*--*OC~DdMH*YW91nUu$@P zY3I@%DnXG!TGKa7Q{{)wyDpS`Z@6vP-JITVZ3N>4f7*HIjIf4zi!W0YT*=5h%tP6G zevw9YYww^pMsHrTRb!24C}pXeA&L8W{u3Av1j!`P!q8dIANx%jT=QRzea8yLL-H7O zg)YnEQE+IX6Mv1Rr)9RV=|VQvMQ)BwUXCSh{`?g`#N!jE`E{jFp(jq8Z$-5dcG%X>nL1+YPd`8n>(p}-c@!<}9T(=L#1zT=fIv`13~G>80;F0BH6%20Ep=KO z0GZ3ZQBrTNe&fA}fKA)muLqLW{dQM!iR-v7NV5DEzKtTAdi(B*e^7KV$q>Wpkf7E| zb50UPwrE`>jhn@}gT7YNGlI_}pRK~_pY0h14X1m5V~>LQq1Za8oiPYIDa-f;sd#Y zcDUVzqhptwmjsumY>2I*T{fjxgzSjoa(m+-%2-VIR*7s=SYwXYpqp_z#WxF#s#Rd< zcmwlq{S(??Ak?uDAm$*K*I~PSOeW-Zb-SpbcjKMsE~&Ebf96|>O94G0T`GR?Co%9X zoT16tY0BM7k%kE`yzlA7YUZW8;uPL99k*HO?e?$6l$-oT9@^m_*(*^F_^g*M=v=>eI2o^n9%Pr5?lmlmp>E{s5Nj~x!};_dDqpH0koFDG0kXL zOWPnD#(!R|Bc>!zdfifZ0}bhnRv_su>9P?TJUn@xx&A&>MiT@u~uqLW{da5j3+G9YU>3JeCn1OS>p0UCopmL8 z3)Va5{Yq;o;M3uCTO0t}RY&%wMoh~Sh?-)n+8XMApiyATWal=`dP8w(gb=MsFVnoT zyPj>(f0(eoiiNac<1>?3RvTWUwe8gK{6LVn$3CVkXcye|KCU}O{9@BW9FhXOr@k92 z$DPX>kV3QT=cdV|v-k;`e6-VCJzeysOfh3f5$LtUOm+$KsZ4Lu_Fgr*(a(bkX&MW& z3X`J>3-`@I8^j(6nA*G)9+5S!viDxTQ!GibBAY}ZA^OYq_C2zqW>#B`MNA`9hJs>6 zU#L0`aR$>~az_kgNyiXVAFZ8m=*&88qt1<*S&_>P2MZ-82E|DJjZ|l5+vKpI>~DZ=Kxi@a-b-h5%ME5J4XTS`&6 zZoq&RFO}Z-dwWjt-9z>F7N3>6E$oEZazGU>9TTV+`7({1d45!fbtSnpsc-`1EC1JqGzR>|7byEk!PP2vt36DJ<{bj?GRJu-Ds4qfdx1-m^^NoE`-XN2CT6~CW{)68e>}wpg-DpXx=y;3)#Prr zT?F!FlC3wq&qTT@3`8Rb*LA=^E4-!hi~CT z-&zk1$K0(dGS9I03{T=eGr=1MEJS;SNgMh)qtDWPFfIo|U5w&fjHgyMTYI*0Nyn<)KQ&tm=LitCT53i%K7fgfu<3Wf@sP2)f1t* zMJYz^w2-9yd&E#<*)YPk4EL-j=I2 zp{YK3I)Bny-&{u7csL1VgBG)wR{T;j>y`KvU}i=5tm*Iwk>8Vs|k+7eXO0ndvY&uPPR?yvQV4#3s%v-inRcYoC_suE5G3pt*+;hn$H zUP&!JAzC@W8O-vFiXzLSiHW3@U7<~Gdgub%`9&4qzrIwxBv2PSJ4#?u0{uE{apj@^ zwyKYp7pg^U6s;-fMC;QXaLcvNuN{V!VA$VW)3C7H&`%$o-Qa4SnWgNZG4^B#^g0ut zjn39cPK=@ctIinZ5ArI+us~YqRc}Z!Az|An>^FQ%xd;7#SBo)ivT$l~WqmCManNy& zX!1q)K2z9gBHGiqbT7K^UU)55pY62%CMtnMS~}=~&pi<2&`+t-D*n-#X1^L0nkQw! zb=}{k;epXO=~*xa0J<2L;R#e!Vf_5JeritDJ6o3mvOmV@qkm+B$RL*Y(Z+oG&ktt0 z!_{P!Yjgjmtqh!X+v1vsVJO?@%x~+zt_O8)!%dXRBz58{{hr&O1_%#~T7aO2s(yX8a?l*)v6m#lqT zDX6HNHn|CZ(<7;KDvZ5H5jTh#YJi3sGuS)bd?jf66en(W8*X(PcwqNqP^(eFCnh*6 zTPHBZ-E|Qrpidq*m@tD~HB2F8`%H3BJbFCsI-{NhaRA*g6YSdgN)|x-^{*HH5P+?C zXp^t?t{mAd&k{X0TNMs_H#56kT>DZ#d#!^qWye=gyiIiR@haS)Jc=Ys#TFSR^5OQGeh)Gwp3p0MdYBY7OnJZB0jKGQeSC zNcN<0+8LknO^1iTe#OM*nFr4bb`@uxjKvZm|JCkK%VZ7$6i>!k;5rTAu5d?%tWw6g zt=b*h-Jd>Ijf09>^zqdp15Zd-73lirKx>XCbE{klcSS4ZxEBN8*+EP7Xz5`_o~eRT z)AET}A0FWCGV}k10K~FZJ_Q_g$1yj0=ygBu&-E{Ra{O+|K_d|j^yd7TjDFJYZ+ZGBG0$k9r!7sDI7{D8-G?mk-p+JcU(&G z!QapOtm(dwXu}N}8*Y{FzXUM-rn)=fsJwB2=TzUyXh3n%mz(fN+kMD+E(Qn=vw@_b zXUSDXb-Ch|af_yA;SXyiT;Uchm29$HX|4?HE?iDGljz24%o1`JV+~l9myD4}yx+nd z3^ zuvtE%$N_pOfkL z=U^?Ts`-NT6!z?2f>=qXit4W0OMHwt*u>A-_zk#3%QUpP9B zBT#hpp_x_2jrPJ%Ivy?Vj&@(IL-Bd{tf1qKqMf7lFrp{%Jwb`WtE+t|Ig?=_Ia$M_v!=(6YVI{W z?lmyvMz!}3U(ZU12zQTf2GZc!o@_f~#$m^Qs6{*?l}_b&u{r5$SpyXz%DuVOtz1u%iCx0XpHy*s>u=Yz`Y6ztlGP zP#8gf893Kf%1AwWn}P%>vHCu zf@Snh=Wv6Gv{AYLHTxA6XNW|G2x z!x&&kMEPoT@6`rN#ph?aBoag)jEutJ!t;w(!SOHfcwJSjB!YlIEXNbE`;bA0>S0?w zmkKe;k~(&RCoiGD&g>b>y(^pHzu03^`gwVRM(iSMDcq&>pS!aOSh?_U^TZM)bYX_9 z`gI(lzb)6N*|GVE!V2F$a&T6yCrUlRE!W2jPl_MF2r(QCGZ@6m2$wA;Z}@KiG||L5 z%-EXa@g2MvZ5HJiZdOs%&h-UJylPb|zsK({o#+u7W(qbx|D=>b9xu$p;Wal;s)DK1 zi;ir~>SVR`rtMQ8_t*}^^4_Er)l$#wv?)5-up0B+2|^fO+AEt1Xy?qV<@T1X=w{zz z!G|K`@y($20XwMgiMTG{06`lW;-NzRlTDCNpm0 zYznetu>CM{(X4iP63P%pvt??2qFrEsXCB6xzDvohwz_BMMV@mMw+LGa&U5})TF}quF=FDk_9~}1H!*++63B)oqR6uKBMi^jtx;&0q5a!%L z)9^DTb;1vsL&x<&$PVTpN%3d5SJEldB#gCP80E0I$Lq3$t1l%fxT~ZboJi5zGZUeG|2~}-vVCAX*hvN3qS~h zMehJS4r3iR-s>y6={U6H#IM{Nr`onn?#G4`FVHx@ib%H?`4M6CT8L&(tUjK*zC9s^ zwL9Uwu6>!$@Z$YnKjs^P`2g;4vWiSmTX*Efw`#Mx=T;xLd#G(+eVQ)`dwpR`U1scG zw(e)=^Qjr@s>FmuLGt0WG$?y~_#a_58QE>5?L~HYMVAn#ql2w9xm=2gi0BT6MQ|yI zgEfP3OaJw>a0~Xs9(?euGxeL>h57pS4#)LVWd6DhtC?7aX_j;;joJpwIz}gf5`+;> z#v?nL4Iu}1VYv+PFA(Z(l)#gp+mdqM$bJZa{2}YQfjOR&ju{}8v_6cVtk+#RUx zmRN|<8#@_jD9!>gkYu-1!;2iXH^TJ)AW=cFD%=0_=v)A4&~UBK=7x*KzTxWD`<96@ zli-t<++b7ad?)edwFZ{6HJd224P7Ke6VDVK38^B%b87=}>u!J2pT-!Vm7eR~$y?8V z_`9Z)I2dn48VUM2G>0K(#3V10vBUt*Bdqq1B{I_I-u_AB1y?5c_CW{t@nBqE1gzfD ze0LeE^VaQRSDFJER#(hs3AZY~kAy@&IX8Z}cb~xfP{r!fd1034;B=DrxTtuRo#V7G zjn95x7Axhl{`TbD`-%yV^44PK+RUCCsZ@zrT#+WE;bNsttbk0i&TFH)(9t3QK6?)d zNyT_)V}E)wO!J~!<5-qYl7r1*!PR|ccJ+n`PWd^hz4F8oPJJdnfu!98X-05cRc5OB&^lXja+EC#W7c^H>wi%$U2Lz zfGaZBsW6t2p|r&a2}u_N4sUdBExCckdLM^Duadl9F;zUS>PtI6TDm>oufDzF=f9jA z@xAtDc0O{6KFUF>@+~x*i6rP!>Rm{)AZS)g@z^hr*Z}WrE^!Je+VbAd>%U!sT3{Z%lE!-mbJ#Mc^u55O4I@4XN(QPDEuWK0M`aec5DA4mo z$*M35&fy{omtLyG4rY@Rd1iWTd^X4$DG^)I$k@xZ<;yjFBoCC78yy1+T7-n_86kmYk+H5-72Z}ir-B<=&(2iZeqiNL;rD)B-+blaxpsISMKVzDcrX(p0r{mq0s9yb;o}a5Mf_L1wG4rdzcyi#FUt{Vlsj=)l?Y4FH=DHDf zP;%Ryy+Eve8zg(|wY;U}3^|T$WaW0Qb28ne!t1%c)P$e%U#2WvUOAt7?(5wCZn?c^ zEVr&>xgDN9GD6~jZHAIx>~%KYQmv<+abt;!YI~hWiF#iL6n8IqyPcOe8{baru2Ftr zk9>%PRF-Gno4w<{v*T%_I|pqjy;)EDetXP!AmDskKL=fy7@yO+UGiY%U#K&@zVba+ zFkTBKPP^`Hjl*nkg8x23M4YbipHT-|ms@E~W{31AA!`;$g^-(tQm9YFQSjG6Iin?2 z%38!ok&sj~HjmF0NCs78+0aP(mG}$257cVR^NOVjYMtk2N7Jsh<`cFWwhEY%krK-| z?mJkPacaxZtujhUMZfz)LTco^nxWoroJr3)yz3w%;pxR8TeZ8rr-(iZHaB0UrnsK} z(D`plC4O()8zIZ$h(-^!voco&S#RvxOkN$xeCiHTm+H(&VidL3Amg3Xg}sX0TXnfR zlYFtaGcA)lR-z>?MH~_NjcK2M5gj(e90RG4y-K$Hvjz%^*3fxtUnY{iG_}_r(-o!b zUv5Gcu2+j^ttB~-p^?EMHJD*0AQAx&!@c%%qqMl{<;rs$aM?NQ-0&|r z^yG-|#-`>TOoEvs(quYV2xGbcO!o$ok1^^S(=JtMFYI!>*s-4A7L=b%9A{sC*66Ox zW|-@DL_$J}h0j!!o-U$I+_pp|-3*r#q+PPfq1(jt0Sp>z@JdL(?s)=kM?&I)qbhbY zsEo$oI^O;M%tof*sgWPG(8yy3o`h7DP;`+jB)4`^su^%c&`3>>na817dn>v%55O;* zAk{hAYTt;`T*c(VtOD>qNF4RQ$pRvWKg2k=Qsl1y34~D5uTSj#CsNe0LX)^6~hn zT=`cFp75@pEvn27)RKMTcgrvQhs+-PZZ)uUZe}|)=6`VEXYMy5$dAzdJCNd7sGqZC3$#y8`^$&>> zX274XAfxfY6wHQgOk7}rA^PRHOC4YzKlQ+8#C-z5)t@nYy<%Y5naWm{vZZHI>g3Qe z>k5bTdXt?40?j11`ipsUI5Rj;AW0fJXTJ`)9Epjk9Eqt6hm27MEw93+gbKb&7P|dV zO`fTbhiJmtCw09VE}GH)y=XpY9lCHkUfTUiLPL3@BC?H6q4pHlKQT)qQbTx>2tw|u zftiT>3Ou0d>ntkj1*%m({tw9**xttKvX9+|R-f^M8zU{)=1NeEviRM%`i$A*vJjiu z+cOg2_t=t1H9u;(-OfHWy}2|XqVfGy`d@BaI z{-KzM;&=KC>1kvI3i#(A@;_$@h~4oV(&z9yMnXb*E&hk71tTGMzrK>RQ)@v5_Dg`ufZviPSX%1&>B?v&`<+Pgu47RqDZjZR`I_<_;2tLBUS2mlH#ZK3hD8pBMcE7? zE{0~O^GhGg!Gvj6^}u3o3-OWINo~ovJ7G6tQL~=Py<5wqr8Yeys}YI+g8;c#tgeXb zUFwko4WGSlKzfNpy*97Qo4+@=pKTIYXcDL?D^sp1^Vtl{k`}7^?@>F3bN>xf-KNc6W!Fa|*OeI{8D1d27rki`TN*e*RIUS}^Wt z>*C43`W0|&crRQ2;N$}5fnJSZtY*Hmv*>YZ@rpOi^jnSH&?Ez`Nsk&Cqqc2qsEq7n z9W}3cU6SF1Ca)LM)`4HFv`n%^;A|FMpj!&tG!93%W<9r6V%3+f#Et-k-DAJlx8=uG z;>9QCP1%malZ{T+e>qcmG*+aJxzgR*Hdn1C3s^hClLQcP$w;BT}X=w$Mm+Z%xTLvOmRww&?h!p7Y38yLZ8p60diT$X}+62y(V7n-P9fWSb zuNGAtMPY1Y1hqh@?Y4Et4>rUHmAvAxK4SaF-e`R*&4b!1nD?5w#xnY)1J3l`h3sIPwc+dzEWS7j zpCpA>hxfXjg9Mfc7U}J{vYc{iRlRkB0q2_D+u4_$JU)TN%|?PV*9Qh0T#pb?;_6x| zxR(%w@ZAY~Erj>_l+(5>%k2Wzw;o5_a2x8t`|VE7WmL9^*`5iRvdYn)h6SkKkrTb@ zC{e<}2X`uYajZXf%>awV6L8@F&K42Oc64^kl584>&(<+&kxEXSUNrR=A8%F2h*)Ya zL@^?(bWS35g%-Qj6W?;W9c>hA)g~r^ryx}+7dZ&e2>K~vJrBAp*cbG=GyWQ?OYyo`5ss3_VGD*ZV_mbtXwQTA6Jy zd#YnjpXy=ivEqzLKi5xNKz!y^ARGx%H3^Q-h8J#r*$?pTP@Q1iFOJy1Ki*-d!D8z} zu`XPAJvPKjY+b+6y*{us z4ptt$GOq2iidT{HUNXtFdy@^SK&SQgV*;W;ra`rP7vG99sA=_2eL5c|o@(-t1)X9{%$!Bf5wnAB<&)?;)41Iew<|Ie(j}@j>7L}M2>34Yp7#VrO%BV9;4+se zC*-d>V?i1`S5fWcR+T1?QslWOHougZmSvWeD5_m)mJlXd-A=>|o{Em=1!5f%&^0(| z)={ecFlCkmi#Rr5=-FmuEfI(v0*~W;Be!E+Ut*dVDye-ak;j?f!D0SDZ;<^^LV8pW zNIV_Hl>lG9Qk2mMEB?sC_8C6sNTYm0GtC}y6;_`h@2RC4v)A(F4 zPW?Se;W38>;0=uSn}ZFL!x9Y#?Zd&wNyU#L1Qh%gP}dQu;N!TUB1yM0-5Q6D+5Qe1 z%yrtV6VBi#-%DO*@MgdtJ}mnQoGZ@C+ISC+g4j;cppHxfp$uJHNAFU6VvEU%g|G~`=rPM9as(*y&Vi++ENO&a$J#4ne8d41GsHj$DnvW2UN78N5gd-+ue zbL^3Y^v#JpEUIKDP3&eT-Ly=1aaXUjl&EtFRZJc1tN2K1u2#mnoRw%@>9Ag-)=0^! z+W~N>65{9(14=pB8giZ^)5VrmWE_IW0=A3Gbs^c^#Vt`j+iVVz|Ijzq+H9vi(@cX{ ztCpS}yyeiexEf={&oHFP*s$ULJ^k^Kl!tq)<`fd@4%-P50%>_(L#KNl-HA0 z+K)U(%AGBC1tD&nBE}b)okXFDO{ao;`FI4k%v$`*My6GlKFvp~?*_?E$7T9yZvnei zcFPwG+Q@TzzTKup;19^gjeZf9?8zV1OQhs}<(rEu>1m#b8PvGM82ipddp2j($s}<= za&t*%5sNl4yZqID&r&dZ$kIRPlY!uZM4V!V=RAOXBMDv+Yi_)pKZBX}SJpVxY z2tL|0A5|)uTqY3>Bc7`?SFy)&P|RXYjE>b*-u)r>HuHR;{w-!%X?srG^VwQI(?l6{kK>ZP3$Q+O^AzCBPCPjUZzLBo znE2u`)HHD*UmCZw7kyzQ*6Z02Ys%P(mD4$gf%NFJ?q2O$1WJiaC|+;>p852;j61iM zlkLT-Iy~^NZ~IxfM*pu*@c-Gp70?~OpVh5i_Hmkni;GXq(xT2RW~4!)<{?s{G;p;4 z(a1*&%#e&O=6BDP?&wtCztL$ptpP$Y?~5R#R;`oo;>|&B6AIGAoeLlS-nTR$yHrq- zM$7&*90iEg<);`iBO50B0<#gZ2#hRw+Ht=|j%Znx649H4#TEw|k0%e1VAOZd>3!Vl zejvB4`bl%()kofs#Vby?7+ermibluP_O1SSq|Y)@z{58e{e&3&N|C}p(@DbMq^m|q zr%1!*rF=@oA!+@~gIsRp-0*#=noE}H&nt;7RJvpCJmu{C^EuyDA`RTMlO;U@Sx&xz zB_9Y0YaN3V^==&$s(GSm0g;w_s6MDwlHhxk?rGzv~s}vT<7f6k#!$Pyr zN@9W*!bAxCi3kc~J7>dQ@tYjR?~|?3WkJ4E0WUGX)4>Y)bLE|{YM=t*$mzMfrltuFev!U8<`6GHijVw!)&De8So2^o7;`?4a>x1fhe|5@$d?j?;mO z+|(~{x8RSL$wDewZ$|2DD|z_bSftW43ntQgQ7Mp-%)bGeR>fi5vKWcaGcgsPA1L{*R_Z=pk5kU7ucPZ%>U!a{-r#U1D<447=)Na`FF~eFg%5S|*TatjGp@5B*BEU9R7%jwSX9z3V@IDVlbo(R76 zyC787atv<4HhaNH#YoC#_sodKJtXshyG4=NeQ2+5mHYH~UDdSa4Z9qn+1fMHggBux z&!4p0^5;KyG1kpj&u)SggqX~p7pBOBDZofDcI!9gq%0%HjHdhgeLiIj3mxXJnw08W zeb7V9`oF48Y?RqTrdz!pH?q`4(q-7ppWNCH%McCQnW-$OeuVUSO9kY~IDfG!Re#<5 zqMw1f_kuLVU@~AaAi^BW9qDtZSr**|AixJoFX?vpAervHm3h&^3`oB^?tJNcz5Fb( zn6@>Cn9<%fd{|L>w+|9iyYPe@eGpX#*UuC99Objq6NG-bPg zb=>|e%QL1(JTo?C4}-(3v|N*s*83bU`NuDj+Q%o^?< zncUo8ASQ_u0kymrgVYxoJ!9Xz6Bb^9t(SE8pJudq-Hr zd)39HpZH#qG+Nt}d7HqNeHeVO*svOZ!MDRQf`*9}zVD7tC4b-5 z_TrzMiiB-$uVoOX!cH@)n``I2ZW?b5=6-(|9`WZqJ#nxc%e9NBQvOavW;pF$ILz&U=hg#^G!(p`jrmEV7o+YyB(~ zLIp*<)@QL+jLhLYI0}u5p*yCiKFkxmIFcbL?0e#|y;&1%AxpAe8?sQp`nY6#PUF&O zpiPwjYNxy5l0+@>M3d!Dv=?^d^nBza8NQGGL5%1B*hcZV`7b0aukwwq0Er}f<#pt=s&-;&I!&RFpNhjn=13e}f^lf1lE%(44X zb1U%a%egOgr+NQsTe5Cd!kcfqC)X)0x9fUW|Ky_Er=lN^XUfL!o>g79(p~@AV&=?R~j!`T6hP`EI3K;1p0={86)cK~BzX=kN3X zf8?K(wPoXyS8o@W$5vFox|;I$(pzi0s`OQXOUiElVXy!Acx4*r?Z$TYbN>GWtNM@K zJIlPYRkyg-+HUWTOwXxzj%?fcDqiMhz>ljx949-=-i-Kh_1KBUKX&esw4a``^RJ>* zXwhtT%ei{n#FzEH|C;yZ>+$!u_x#*+`=L8{b9SH^9&27u3G_Gxqxe`L2UJtdxghk z&-wzDFvLvW{chK5u3{n6GSKKy!P&C6w^IFpbD0bcp^A{{2lcLh_DXj@ybtYvc^;(2 M)78&qol`;+0Fu7JivR!s literal 0 HcmV?d00001 diff --git a/docs/output.md b/docs/output.md index 721362ccd..3e678e036 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,9 +1,5 @@ # ![nf-core/chipseq](images/nf-core-chipseq_logo.png) -## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/chipseq/output](https://nf-co.re/chipseq/output) - -> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ - ## Introduction This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. @@ -32,7 +28,7 @@ The initial QC and alignments are performed at the library-level e.g. if the sam -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You get information about adapter contamination and other overrepresented sequences. +[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). ### Adapter trimming diff --git a/docs/usage.md b/docs/usage.md index 7b9c7474d..68caa1da7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -88,6 +88,50 @@ NAIVE_INPUT,3,BLA203A49_S1_L006_R1_001.fastq.gz,,, Example design files have been provided with the pipeline for [paired-end](../assets/design_pe.csv) and [single-end](../assets/design_se.csv) data. +## Samplesheet input + +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. + +```console +--input '[path to samplesheet file]' +``` + +### Multiple runs of the same sample + +The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: + +```console +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +``` + +### Full samplesheet + +The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. + +A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. + +```console +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz +CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz +TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, +TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, +TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +``` + +| Column | Description | +|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | + +An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. + ## Running the pipeline The typical command for running the pipeline is as follows: @@ -100,7 +144,7 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: -```bash +```console work # Directory containing the nextflow working files results # Finished results (configurable, see below) .nextflow_log # Log file from Nextflow @@ -111,13 +155,13 @@ results # Finished results (configurable, see below) When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```bash +```console nextflow pull nf-core/chipseq ``` ### Reproducibility -It's a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. +It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. First, go to the [nf-core/chipseq releases page](https://github.com/nf-core/chipseq/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. @@ -131,7 +175,7 @@ This version number will be logged in reports when you run the pipeline, so that Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Conda) - see below. +Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Conda) - see below. When using Biocontainers, most of these software packaging methods pull Docker containers from quay.io e.g [FastQC](https://quay.io/repository/biocontainers/fastqc) except for Singularity which directly downloads Singularity images via https hosted by the [Galaxy project](https://depot.galaxyproject.org/singularity/) and Conda which downloads and installs software locally from [Bioconda](https://bioconda.github.io/). > We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. @@ -143,21 +187,20 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. * `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Docker](https://docker.com/) * `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) * `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) - * Pulls software from Docker Hub: [`nfcore/chipseq`](https://hub.docker.com/r/nfcore/chipseq/) + * A generic configuration profile to be used with [Podman](https://podman.io/) +* `shifter` + * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) +* `charliecloud` + * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) * `conda` - * Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity or Podman. - * A generic configuration profile to be used with [Conda](https://conda.io/docs/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) + * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. * `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters + * A profile with a complete configuration for automated testing + * Includes links to test data so needs no other parameters ### `-resume` @@ -169,27 +212,140 @@ You can also supply a run name to resume a specific run: `-resume [run-name]`. U Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. -#### Custom resource requests +## Custom configuration + +### Resource requests + +Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. + +For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: + +```console +[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' -Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with an error code of `143` (exceeded requested resources) it will automatically resubmit with higher requests (2 x original, then 3 x original). If it still fails after three times then the pipeline is stopped. +Caused by: + Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -Whilst these default requirements will hopefully work for most people with most data, you may find that you want to customise the compute resources that the pipeline requests. You can do this by creating a custom config file. For example, to give the workflow process `star` 32GB of memory, you could use the following config: +Command executed: + STAR \ + --genomeDir star \ + --readFilesIn WT_REP1_trimmed.fq.gz \ + --runThreadN 2 \ + --outFileNamePrefix WT_REP1. \ + + +Command exit status: + 137 + +Command output: + (empty) + +Command error: + .command.sh: line 9: 30 Killed STAR --genomeDir star --readFilesIn WT_REP1_trimmed.fq.gz --runThreadN 2 --outFileNamePrefix WT_REP1. +Work dir: + /home/pipelinetest/work/9d/172ca5881234073e8d76f2a19c88fb + +Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` +``` + +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: star { - memory = 32.GB - } + withName: STAR_ALIGN { + memory = 100.GB + } } ``` -See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information. +> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. + +### Tool-specific options -If you are likely to be running `nf-core` pipelines regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter (see definition above). You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. +For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. + +The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: + +* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. + +* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. + +The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. + +When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. + +As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. + +Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. + +As you will see in the example below, we have: + +* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. +* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. +* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. + +```nextflow +params { + modules { + 'star_align' { + args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" + publish_dir = "my_star_directory" + publish_files = ['out':'log', 'tab':'log', 'bam':''] + } + } +} +``` + +### Updating containers + +The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. + +1. Check the default version used by the pipeline in the module file for [Pangolin](https://github.com/nf-core/viralrecon/blob/a85d5969f9025409e3618d6c280ef15ce417df65/modules/nf-core/software/pangolin/main.nf#L14-L19) +2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) +3. Create the custom config accordingly: + + * For Docker: + + ```nextflow + process { + withName: PANGOLIN { + container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + * For Singularity: + + ```nextflow + process { + withName: PANGOLIN { + container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + * For Conda: + + ```nextflow + process { + withName: PANGOLIN { + conda = 'bioconda::pangolin=3.0.5' + } + } + ``` + +> **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. + +### nf-core/configs + +In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. + +See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -### Running in the background +## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -198,11 +354,11 @@ The Nextflow `-bg` flag launches Nextflow in the background, detached from your Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -#### Nextflow memory requirements +## Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```bash +```console NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 361352d0c..000000000 --- a/environment.yml +++ /dev/null @@ -1,33 +0,0 @@ -# You can use this file to create a conda environment for this pipeline: -# conda env create -f environment.yml -name: nf-core-chipseq-1.3.0dev -channels: - - conda-forge - - bioconda - - defaults -dependencies: - ## conda-forge packages - - conda-forge::python=3.7.8 - - conda-forge::markdown=3.2.2 - - conda-forge::pymdown-extensions=7.1 - - conda-forge::pygments=2.6.1 - - conda-forge::r-base=4.0.2 - - conda-forge::r-optparse=1.6.6 - - conda-forge::r-rcolorbrewer=1.1_2 - - conda-forge::r-reshape2=1.4.4 - - conda-forge::r-ggplot2=3.3.2 - - conda-forge::r-tidyr=1.1.0 - - conda-forge::r-scales=1.1.1 - - conda-forge::r-pheatmap=1.0.12 - - conda-forge::r-lattice=0.20_41 - - conda-forge::r-upsetr=1.4.0 - - conda-forge::r-xfun=0.16 - - ## bioconda packages - - bioconda::samtools=1.10 - - bioconda::bamtools=2.5.1 - - bioconda::pysam=0.16.0.1 - - bioconda::bedtools=2.29.2 - - bioconda::bioconductor-biocparallel=1.22.0 - - bioconda::bioconductor-deseq2=1.28.0 - - bioconda::bioconductor-vsn=3.56.0 diff --git a/lib/Checks.groovy b/lib/Checks.groovy deleted file mode 100755 index 034e9d838..000000000 --- a/lib/Checks.groovy +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file holds several functions used to perform standard checks for the nf-core pipeline template. - */ - -class Checks { - - static void aws_batch(workflow, params) { - if (workflow.profile.contains('awsbatch')) { - assert !params.awsqueue || !params.awsregion : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - assert !params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - assert params.tracedir.startsWith('s3:') : "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." - } - } - - static void hostname(workflow, params, log) { - Map colors = Headers.log_colours(params.monochrome_logs) - if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } - } - - // Show a big warning message if we're not running MACS - static void macs2_warn(params, log) { - if (!params.macs_gsize) { - def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' - log.warn "=================================================================\n" + - " WARNING! MACS genome size parameter not $warnstring.\n" + - " Peak calling, annotation and differential analysis will be skipped.\n" + - " Please specify value for '--macs_gsize' to run these steps.\n" + - "=======================================================================" - } - } -} diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy new file mode 100755 index 000000000..8d6920dd6 --- /dev/null +++ b/lib/NfcoreSchema.groovy @@ -0,0 +1,517 @@ +// +// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. +// + +import org.everit.json.schema.Schema +import org.everit.json.schema.loader.SchemaLoader +import org.everit.json.schema.ValidationException +import org.json.JSONObject +import org.json.JSONTokener +import org.json.JSONArray +import groovy.json.JsonSlurper +import groovy.json.JsonBuilder + +class NfcoreSchema { + + // + // Resolve Schema path relative to main workflow directory + // + public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { + return "${workflow.projectDir}/${schema_filename}" + } + + // + // Function to loop over all parameters defined in schema and check + // whether the given parameters adhere to the specifications + // + /* groovylint-disable-next-line UnusedPrivateMethodParameter */ + public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { + def has_error = false + //=====================================================================// + // Check for nextflow core params and unexpected params + def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text + def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') + def nf_params = [ + // Options for base `nextflow` command + 'bg', + 'c', + 'C', + 'config', + 'd', + 'D', + 'dockerize', + 'h', + 'log', + 'q', + 'quiet', + 'syslog', + 'v', + 'version', + + // Options for `nextflow run` command + 'ansi', + 'ansi-log', + 'bg', + 'bucket-dir', + 'c', + 'cache', + 'config', + 'dsl2', + 'dump-channels', + 'dump-hashes', + 'E', + 'entry', + 'latest', + 'lib', + 'main-script', + 'N', + 'name', + 'offline', + 'params-file', + 'pi', + 'plugins', + 'poll-interval', + 'pool-size', + 'profile', + 'ps', + 'qs', + 'queue-size', + 'r', + 'resume', + 'revision', + 'stdin', + 'stub', + 'stub-run', + 'test', + 'w', + 'with-charliecloud', + 'with-conda', + 'with-dag', + 'with-docker', + 'with-mpi', + 'with-notification', + 'with-podman', + 'with-report', + 'with-singularity', + 'with-timeline', + 'with-tower', + 'with-trace', + 'with-weblog', + 'without-docker', + 'without-podman', + 'work-dir' + ] + def unexpectedParams = [] + + // Collect expected parameters from the schema + def expectedParams = [] + for (group in schemaParams) { + for (p in group.value['properties']) { + expectedParams.push(p.key) + } + } + + for (specifiedParam in params.keySet()) { + // nextflow params + if (nf_params.contains(specifiedParam)) { + log.error "ERROR: You used a core Nextflow option with two hyphens: '--${specifiedParam}'. Please resubmit with '-${specifiedParam}'" + has_error = true + } + // unexpected params + def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' + def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } + def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() + def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { + // Temporarily remove camelCase/camel-case params #1035 + def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} + if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ + unexpectedParams.push(specifiedParam) + } + } + } + + //=====================================================================// + // Validate parameters against the schema + InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() + JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) + + // Remove anything that's in params.schema_ignore_params + raw_schema = removeIgnoredParams(raw_schema, params) + + Schema schema = SchemaLoader.load(raw_schema) + + // Clean the parameters + def cleanedParams = cleanParameters(params) + + // Convert to JSONObject + def jsonParams = new JsonBuilder(cleanedParams) + JSONObject params_json = new JSONObject(jsonParams.toString()) + + // Validate + try { + schema.validate(params_json) + } catch (ValidationException e) { + println '' + log.error 'ERROR: Validation of pipeline parameters failed!' + JSONObject exceptionJSON = e.toJSON() + printExceptions(exceptionJSON, params_json, log) + println '' + has_error = true + } + + // Check for unexpected parameters + if (unexpectedParams.size() > 0) { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + println '' + def warn_msg = 'Found unexpected parameters:' + for (unexpectedParam in unexpectedParams) { + warn_msg = warn_msg + "\n* --${unexpectedParam}: ${params[unexpectedParam].toString()}" + } + log.warn warn_msg + log.info "- ${colors.dim}Ignore this warning: params.schema_ignore_params = \"${unexpectedParams.join(',')}\" ${colors.reset}" + println '' + } + + if (has_error) { + System.exit(1) + } + } + + // + // Beautify parameters for --help + // + public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + Integer num_hidden = 0 + String output = '' + output += 'Typical pipeline command:\n\n' + output += " ${colors.cyan}${command}${colors.reset}\n\n" + Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) + Integer max_chars = paramsMaxChars(params_map) + 1 + Integer desc_indent = max_chars + 14 + Integer dec_linewidth = 160 - desc_indent + for (group in params_map.keySet()) { + Integer num_params = 0 + String group_output = colors.underlined + colors.bold + group + colors.reset + '\n' + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (group_params.get(param).hidden && !params.show_hidden_params) { + num_hidden += 1 + continue; + } + def type = '[' + group_params.get(param).type + ']' + def description = group_params.get(param).description + def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def description_default = description + colors.dim + defaultValue + colors.reset + // Wrap long description texts + // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap + if (description_default.length() > dec_linewidth){ + List olines = [] + String oline = "" // " " * indent + description_default.split(" ").each() { wrd -> + if ((oline.size() + wrd.size()) <= dec_linewidth) { + oline += wrd + " " + } else { + olines += oline + oline = wrd + " " + } + } + olines += oline + description_default = olines.join("\n" + " " * desc_indent) + } + group_output += " --" + param.padRight(max_chars) + colors.dim + type.padRight(10) + colors.reset + description_default + '\n' + num_params += 1 + } + group_output += '\n' + if (num_params > 0){ + output += group_output + } + } + if (num_hidden > 0){ + output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset + } + output += NfcoreTemplate.dashedLine(params.monochrome_logs) + return output + } + + // + // Groovy Map summarising parameters/workflow options used by the pipeline + // + public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { + // Get a selection of core Nextflow workflow options + def Map workflow_summary = [:] + if (workflow.revision) { + workflow_summary['revision'] = workflow.revision + } + workflow_summary['runName'] = workflow.runName + if (workflow.containerEngine) { + workflow_summary['containerEngine'] = workflow.containerEngine + } + if (workflow.container) { + workflow_summary['container'] = workflow.container + } + workflow_summary['launchDir'] = workflow.launchDir + workflow_summary['workDir'] = workflow.workDir + workflow_summary['projectDir'] = workflow.projectDir + workflow_summary['userName'] = workflow.userName + workflow_summary['profile'] = workflow.profile + workflow_summary['configFiles'] = workflow.configFiles.join(', ') + + // Get pipeline parameters defined in JSON Schema + def Map params_summary = [:] + def blacklist = ['hostnames'] + def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) + for (group in params_map.keySet()) { + def sub_params = new LinkedHashMap() + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (params.containsKey(param) && !blacklist.contains(param)) { + def params_value = params.get(param) + def schema_value = group_params.get(param).default + def param_type = group_params.get(param).type + if (schema_value != null) { + if (param_type == 'string') { + if (schema_value.contains('$projectDir') || schema_value.contains('${projectDir}')) { + def sub_string = schema_value.replace('\$projectDir', '') + sub_string = sub_string.replace('\${projectDir}', '') + if (params_value.contains(sub_string)) { + schema_value = params_value + } + } + if (schema_value.contains('$params.outdir') || schema_value.contains('${params.outdir}')) { + def sub_string = schema_value.replace('\$params.outdir', '') + sub_string = sub_string.replace('\${params.outdir}', '') + if ("${params.outdir}${sub_string}" == params_value) { + schema_value = params_value + } + } + } + } + + // We have a default in the schema, and this isn't it + if (schema_value != null && params_value != schema_value) { + sub_params.put(param, params_value) + } + // No default in the schema, and this isn't empty + else if (schema_value == null && params_value != "" && params_value != null && params_value != false) { + sub_params.put(param, params_value) + } + } + } + params_summary.put(group, sub_params) + } + return [ 'Core Nextflow options' : workflow_summary ] << params_summary + } + + // + // Beautify parameters for summary and return as string + // + public static String paramsSummaryLog(workflow, params) { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + String output = '' + def params_map = paramsSummaryMap(workflow, params) + def max_chars = paramsMaxChars(params_map) + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + if (group_params) { + output += colors.bold + group + colors.reset + '\n' + for (param in group_params.keySet()) { + output += " " + colors.blue + param.padRight(max_chars) + ": " + colors.green + group_params.get(param) + colors.reset + '\n' + } + output += '\n' + } + } + output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" + output += NfcoreTemplate.dashedLine(params.monochrome_logs) + return output + } + + // + // Loop over nested exceptions and print the causingException + // + private static void printExceptions(ex_json, params_json, log) { + def causingExceptions = ex_json['causingExceptions'] + if (causingExceptions.length() == 0) { + def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ + // Missing required param + if (m.matches()) { + log.error "* Missing required parameter: --${m[0][1]}" + } + // Other base-level error + else if (ex_json['pointerToViolation'] == '#') { + log.error "* ${ex_json['message']}" + } + // Error with specific param + else { + def param = ex_json['pointerToViolation'] - ~/^#\// + def param_val = params_json[param].toString() + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } + } + for (ex in causingExceptions) { + printExceptions(ex, params_json, log) + } + } + + // + // Remove an element from a JSONArray + // + private static JSONArray removeElement(json_array, element) { + def list = [] + int len = json_array.length() + for (int i=0;i + if(raw_schema.keySet().contains('definitions')){ + raw_schema.definitions.each { definition -> + for (key in definition.keySet()){ + if (definition[key].get("properties").keySet().contains(ignore_param)){ + // Remove the param to ignore + definition[key].get("properties").remove(ignore_param) + // If the param was required, change this + if (definition[key].has("required")) { + def cleaned_required = removeElement(definition[key].required, ignore_param) + definition[key].put("required", cleaned_required) + } + } + } + } + } + if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { + raw_schema.get("properties").remove(ignore_param) + } + if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { + def cleaned_required = removeElement(raw_schema.required, ignore_param) + raw_schema.put("required", cleaned_required) + } + } + return raw_schema + } + + // + // Clean and check parameters relative to Nextflow native classes + // + private static Map cleanParameters(params) { + def new_params = params.getClass().newInstance(params) + for (p in params) { + // remove anything evaluating to false + if (!p['value']) { + new_params.remove(p.key) + } + // Cast MemoryUnit to String + if (p['value'].getClass() == nextflow.util.MemoryUnit) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast Duration to String + if (p['value'].getClass() == nextflow.util.Duration) { + new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) + } + // Cast LinkedHashMap to String + if (p['value'].getClass() == LinkedHashMap) { + new_params.replace(p.key, p['value'].toString()) + } + } + return new_params + } + + // + // This function tries to read a JSON params file + // + private static LinkedHashMap paramsLoad(String json_schema) { + def params_map = new LinkedHashMap() + try { + params_map = paramsRead(json_schema) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + // + // Method to actually read in JSON file using Groovy. + // Group (as Key), values are all parameters + // - Parameter1 as Key, Description as Value + // - Parameter2 as Key, Description as Value + // .... + // Group + // - + private static LinkedHashMap paramsRead(String json_schema) throws Exception { + def json = new File(json_schema).text + def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') + def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') + /* Tree looks like this in nf-core schema + * definitions <- this is what the first get('definitions') gets us + group 1 + title + description + properties + parameter 1 + type + description + parameter 2 + type + description + group 2 + title + description + properties + parameter 1 + type + description + * properties <- parameters can also be ungrouped, outside of definitions + parameter 1 + type + description + */ + + // Grouped params + def params_map = new LinkedHashMap() + schema_definitions.each { key, val -> + def Map group = schema_definitions."$key".properties // Gets the property object of the group + def title = schema_definitions."$key".title + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put(innerkey, value) + } + params_map.put(title, sub_params) + } + + // Ungrouped params + def ungrouped_params = new LinkedHashMap() + schema_properties.each { innerkey, value -> + ungrouped_params.put(innerkey, value) + } + params_map.put("Other parameters", ungrouped_params) + + return params_map + } + + // + // Get maximum number of characters across all parameter names + // + private static Integer paramsMaxChars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (param.size() > max_chars) { + max_chars = param.size() + } + } + } + return max_chars + } +} diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy new file mode 100755 index 000000000..44551e0a3 --- /dev/null +++ b/lib/NfcoreTemplate.groovy @@ -0,0 +1,270 @@ +// +// This file holds several functions used within the nf-core pipeline template. +// + +import org.yaml.snakeyaml.Yaml + +class NfcoreTemplate { + + // + // Check AWS Batch related parameters have been specified correctly + // + public static void awsBatch(workflow, params) { + if (workflow.profile.contains('awsbatch')) { + // Check params.awsqueue and params.awsregion have been set if running on AWSBatch + assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" + // Check outdir paths to be S3 buckets if running on AWSBatch + assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" + } + } + + // + // Check params.hostnames + // + public static void hostName(workflow, params, log) { + Map colors = logColours(params.monochrome_logs) + if (params.hostnames) { + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } + } + } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." + } + } + } + + // + // Construct and send completion email + // + public static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[]) { + + // Set up the e-mail variables + def subject = "[$workflow.manifest.name] Successful: $workflow.runName" + if (!workflow.success) { + subject = "[$workflow.manifest.name] FAILED: $workflow.runName" + } + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['Date Started'] = workflow.start + misc_fields['Date Completed'] = workflow.complete + misc_fields['Pipeline script file path'] = workflow.scriptFile + misc_fields['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision + misc_fields['Nextflow Version'] = workflow.nextflow.version + misc_fields['Nextflow Build'] = workflow.nextflow.build + misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + def email_fields = [:] + email_fields['version'] = workflow.manifest.version + email_fields['runName'] = workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary << misc_fields + + // On success try attach the multiqc report + def mqc_report = null + try { + if (workflow.success) { + mqc_report = multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { + if (mqc_report.size() > 1) { + log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" + } + mqc_report = mqc_report[0] + } + } + } catch (all) { + if (multiqc_report) { + log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" + } + } + + // Check if we are only sending emails on failure + def email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("$projectDir/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("$projectDir/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] + def sf = new File("$projectDir/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + Map colors = logColours(params.monochrome_logs) + if (email_address) { + try { + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" + } catch (all) { + // Catch failures and try with plaintext + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { + mail_cmd += [ '-A', mqc_report ] + } + mail_cmd.execute() << email_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" + } + } + + // Write summary e-mail HTML to a file + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + def output_hf = new File(output_d, "pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + def output_tf = new File(output_d, "pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } + } + + // + // Print pipeline summary on completion + // + public static void summary(workflow, params, log) { + Map colors = logColours(params.monochrome_logs) + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + } + } else { + hostName(workflow, params, log) + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } + } + + // + // ANSII Colours used for terminal logging + // + public static Map logColours(Boolean monochrome_logs) { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes + } + + // + // Does what is says on the tin + // + public static String dashedLine(monochrome_logs) { + Map colors = logColours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" + } + + // + // nf-core logo + // + public static String logo(workflow, monochrome_logs) { + Map colors = logColours(monochrome_logs) + String.format( + """\n + ${dashedLine(monochrome_logs)} + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} + ${dashedLine(monochrome_logs)} + """.stripIndent() + ) + } +} diff --git a/lib/Utils.groovy b/lib/Utils.groovy new file mode 100755 index 000000000..18173e985 --- /dev/null +++ b/lib/Utils.groovy @@ -0,0 +1,47 @@ +// +// This file holds several Groovy functions that could be useful for any Nextflow pipeline +// + +import org.yaml.snakeyaml.Yaml + +class Utils { + + // + // When running with -profile conda, warn if channels have not been set-up appropriately + // + public static void checkCondaChannels(log) { + Yaml parser = new Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } catch(NullPointerException | IOException e) { + log.warn "Could not verify conda channel configuration." + return + } + + // Check that all channels are present + def required_channels = ['conda-forge', 'bioconda', 'defaults'] + def conda_check_failed = !required_channels.every { ch -> ch in channels } + + // Check that they are in the right order + conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda')) + conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) + + if (conda_check_failed) { + log.warn "=============================================================================\n" + + " There is a problem with your Conda configuration!\n\n" + + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + + " NB: The order of the channels matters!\n" + + "===================================================================================" + } + } + + // + // Join module args with appropriate spacing + // + public static String joinModuleArgs(args_list) { + return ' ' + args_list.join(' ') + } +} diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy new file mode 100755 index 000000000..02304f9d9 --- /dev/null +++ b/lib/WorkflowChipseq.groovy @@ -0,0 +1,74 @@ +// +// This file holds several functions specific to the workflow/chipseq.nf in the nf-core/chipseq pipeline +// + +class WorkflowChipseq { + + // + // Check and validate parameters + // + public static void initialise(params, log) { + genomeExistsError(params, log) + macs2_warn(params, log) + + if (!params.fasta) { + log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." + System.exit(1) + } + } + + // + // Get workflow summary for MultiQC + // + public static String paramsSummaryMultiqc(workflow, summary) { + String summary_section = '' + for (group in summary.keySet()) { + def group_params = summary.get(group) // This gets the parameters of that particular group + if (group_params) { + summary_section += "

$group

\n" + summary_section += "
\n" + } + } + + String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" + yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" + yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" + yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" + yaml_file_text += "plot_type: 'html'\n" + yaml_file_text += "data: |\n" + yaml_file_text += "${summary_section}" + return yaml_file_text + } + + // + // Exit pipeline if incorrect --genome key provided + // + private static void genomeExistsError(params, log) { + if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { + log.error "=============================================================================\n" + + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + + " Currently, the available genome keys are:\n" + + " ${params.genomes.keySet().join(", ")}\n" + + "===================================================================================" + System.exit(1) + } + } + + // + // Show a big warning message if we're not running MACS + // + private static void macs2_warn(params, log) { + if (!params.macs_gsize) { + def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' + log.warn "=================================================================\n" + + " WARNING! MACS genome size parameter not $warnstring.\n" + + " Peak calling, annotation and differential analysis will be skipped.\n" + + " Please specify value for '--macs_gsize' to run these steps.\n" + + "=======================================================================" + } + } +} diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy new file mode 100755 index 000000000..bc960fcc8 --- /dev/null +++ b/lib/WorkflowMain.groovy @@ -0,0 +1,94 @@ +// +// This file holds several functions specific to the main.nf workflow in the nf-core/chipseq pipeline +// + +class WorkflowMain { + + // + // Citation string for pipeline + // + public static String citation(workflow) { + return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + // TODO nf-core: Add Zenodo DOI for pipeline after first release + //"* The pipeline\n" + + //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + + "* The nf-core framework\n" + + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + + "* Software dependencies\n" + + " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" + } + + // + // Print help to screen if required + // + public static String help(workflow, params, log) { + def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + def help_string = '' + help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) + help_string += NfcoreSchema.paramsHelp(workflow, params, command) + help_string += '\n' + citation(workflow) + '\n' + help_string += NfcoreTemplate.dashedLine(params.monochrome_logs) + return help_string + } + + // + // Print parameter summary log to screen + // + public static String paramsSummaryLog(workflow, params, log) { + def summary_log = '' + summary_log += NfcoreTemplate.logo(workflow, params.monochrome_logs) + summary_log += NfcoreSchema.paramsSummaryLog(workflow, params) + summary_log += '\n' + citation(workflow) + '\n' + summary_log += NfcoreTemplate.dashedLine(params.monochrome_logs) + return summary_log + } + + // + // Validate parameters and print summary to screen + // + public static void initialise(workflow, params, log) { + // Print help to screen if required + if (params.help) { + log.info help(workflow, params, log) + System.exit(0) + } + + // Validate workflow parameters via the JSON schema + if (params.validate_params) { + NfcoreSchema.validateParameters(workflow, params, log) + } + + // Print parameter summary log to screen + log.info paramsSummaryLog(workflow, params, log) + + // Check that conda channels are set-up correctly + if (params.enable_conda) { + Utils.checkCondaChannels(log) + } + + // Check AWS batch settings + NfcoreTemplate.awsBatch(workflow, params) + + // Check the hostnames against configured profiles + NfcoreTemplate.hostName(workflow, params, log) + + // Check input has been provided + if (!params.input) { + log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" + System.exit(1) + } + } + + // + // Get attribute from genome config file e.g. fasta + // + public static String getGenomeAttribute(params, attribute) { + def val = '' + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey(attribute)) { + val = params.genomes[ params.genome ][ attribute ] + } + } + return val + } +} diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar new file mode 100644 index 0000000000000000000000000000000000000000..805c8bb5e4fd43a12a5891eea5a68788309629b0 GIT binary patch literal 2291171 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�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

A$B3k~{RycObG@6y| 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 $@vz03z8Z`qI{ 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

=%>>2|D73@_9Fx}<*!s;{SFX;r+XReUC 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 z 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

qm4Wk) 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 z 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�!!ybUdR4n8i&a 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≻pfc-p+kq>A@&EZJ32ii;nzX4TDQYlf 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
gy>fqEPDaO`QF}o` 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%0AO0^D-A)i$ldleqyk}TE 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 z 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

tyv*0yP}nk-pv4zbBt@DbR|3V7ZQ73LXi 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 kF-h#lNtCW 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 literal 0 HcmV?d00001 diff --git a/main.nf b/main.nf index 4c7741145..920bd4aaf 100755 --- a/main.nf +++ b/main.nf @@ -1,598 +1,69 @@ #!/usr/bin/env nextflow /* ======================================================================================== - nf-core/chipseq + nf-core/chipseq ======================================================================================== - nf-core/chipseq Analysis Pipeline. - #### Homepage / Documentation - https://github.com/nf-core/chipseq + Github : https://github.com/nf-core/chipseq + Website: https://nf-co.re/chipseq + Slack : https://nfcore.slack.com/channels/chipseq ---------------------------------------------------------------------------------------- */ nextflow.enable.dsl = 2 /* - * Print help message if required - */ -if (params.help) { - def command = "nextflow run nf-core/chipseq --input design.csv --genome GRCh37 -profile docker" - log.info Headers.nf_core(workflow, params.monochrome_logs) - log.info Schema.params_help("$projectDir/nextflow_schema.json", command) - exit 0 -} +======================================================================================== + GENOME PARAMETER VALUES +======================================================================================== +*/ -//////////////////////////////////////////////////// -/* -- DEFAULT PARAMETER VALUES -- */ -//////////////////////////////////////////////////// +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') +params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') +params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') +params.macs_gsize = WorkflowMain.getGenomeAttribute(params, 'macs_gsize') +params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') +params.readme = WorkflowMain.getGenomeAttribute(params, 'readme') /* - * Reference genomes - */ -// Check if genome exists in the config file -if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - exit 1, "The provided genome '${params.genome}' is not available in the iGenomes file. Currently the available genomes are ${params.genomes.keySet().join(", ")}" -} - -// Configurable variables -params.fasta = params.genome ? params.genomes[ params.genome ].fasta ?: false : false -params.bwa_index = params.genome ? params.genomes[ params.genome ].bwa ?: false : false -params.gtf = params.genome ? params.genomes[ params.genome ].gtf ?: false : false -params.gene_bed = params.genome ? params.genomes[ params.genome ].bed12 ?: false : false -params.macs_gsize = params.genome ? params.genomes[ params.genome ].macs_gsize ?: false : false -params.blacklist = params.genome ? params.genomes[ params.genome ].blacklist ?: false : false -anno_readme = params.genome ? params.genomes[ params.genome ].readme ?: false : false +======================================================================================== + VALIDATE & PRINT PARAMETER SUMMARY +======================================================================================== +*/ -//////////////////////////////////////////////////// -/* -- VALIDATE INPUTS -- */ -//////////////////////////////////////////////////// +WorkflowMain.initialise(workflow, params, log) /* - * Validate parameters - */ -if (params.input) { ch_input = file(params.input, checkIfExists: true) } else { exit 1, 'Samples design file not specified!' } -if (params.gtf) { ch_gtf = file(params.gtf, checkIfExists: true) } else { exit 1, 'GTF annotation file not specified!' } -if (params.gene_bed) { ch_gene_bed = file(params.gene_bed, checkIfExists: true) } -if (params.blacklist) { ch_blacklist = Channel.fromPath(params.blacklist, checkIfExists: true) } else { ch_blacklist = Channel.empty() } - -if (params.fasta) { - ch_fasta = file(params.fasta, checkIfExists: true) -} else { - exit 1, 'Fasta file not specified!' -} +======================================================================================== + NAMED WORKFLOW FOR PIPELINE +======================================================================================== +*/ -// Save AWS IGenomes file containing annotation version -if (anno_readme && file(anno_readme).exists()) { - file("${params.outdir}/genome/").mkdirs() - file(anno_readme).copyTo("${params.outdir}/genome/") -} +include { CHIPSEQ } from './workflows/chipseq' -// If --gtf is supplied along with --genome -// Make gene bed from supplied --gtf instead of using iGenomes one automatically -def makeBED = false -if (!params.gene_bed) { - makeBED = true -} else if (params.genome && params.gtf) { - if (params.genomes[ params.genome ].gtf != params.gtf) { - makeBED = true - } +// +// WORKFLOW: Run main nf-core/chipseq analysis pipeline +// +workflow NFCORE_CHIPSEQ { + CHIPSEQ () } /* - * Check parameters - */ -Checks.aws_batch(workflow, params) // Check AWS batch settings -Checks.hostname(workflow, params, log) // Check the hostnames against configured profiles -Checks.macs2_warn(params, log) // Show a big warning message if we're not running MACS - -//////////////////////////////////////////////////// -/* -- CONFIG FILES -- */ -//////////////////////////////////////////////////// - -/* - * Stage config files - */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() -ch_output_docs = file("$projectDir/docs/output.md", checkIfExists: true) -ch_output_docs_images = file("$projectDir/docs/images/", checkIfExists: true) - -// JSON files required by BAMTools for alignment filtering -ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) -ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) - -// Header files for MultiQC -ch_spp_nsc_header = file("$projectDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) -ch_spp_rsc_header = file("$projectDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) -ch_spp_correlation_header = file("$projectDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) -ch_peak_count_header = file("$projectDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) -ch_frip_score_header = file("$projectDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) -ch_peak_annotation_header = file("$projectDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) -ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) -ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - -//////////////////////////////////////////////////// -/* -- PARAMETER SUMMARY -- */ -//////////////////////////////////////////////////// - -/* - * Print parameter summary - */ -// Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name -run_name = params.name -if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - run_name = workflow.runName -} -summary = Schema.params_summary(workflow, params, run_name) -log.info Headers.nf_core(workflow, params.monochrome_logs) -log.info summary.collect { k,v -> "${k.padRight(22)}: $v" }.join("\n") -log.info "-\033[2m----------------------------------------------------\033[0m-" - -//////////////////////////////////////////////////// -/* -- IMPORT LOCAL MODULES/SUBWORKFLOWS -- */ -//////////////////////////////////////////////////// - -include { GTF2BED } from './modules/local/process/gtf2bed' -include { GET_CHROM_SIZES } from './modules/local/process/get_chrom_sizes' -include { MAKE_GENOME_FILTER } from './modules/local/process/make_genome_filter' -include { BEDTOOLS_GENOMECOV } from './modules/local/process/bedtools_genomecov' -include { PLOT_HOMER_ANNOTATEPEAKS } from './modules/local/process/plot_homer_annotatepeaks' -include { PLOT_MACS2_QC } from './modules/local/process/plot_macs2_qc' -include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from './modules/local/process/multiqc_custom_phantompeakqualtools' -include { MULTIQC_CUSTOM_PEAKS } from './modules/local/process/multiqc_custom_peaks' -include { MACS2_CONSENSUS } from './modules/local/process/macs2_consensus' -include { FRIP_SCORE } from './modules/local/process/frip_score' -//include { DESEQ2_FEATURECOUNTS } from './modules/local/process/deseq2_featurecounts' -include { IGV } from './modules/local/process/igv' -include { OUTPUT_DOCUMENTATION } from './modules/local/process/output_documentation' -include { GET_SOFTWARE_VERSIONS } from './modules/local/process/get_software_versions' -include { MULTIQC } from './modules/local/process/multiqc' - -include { INPUT_CHECK } from './modules/local/subworkflow/input_check' -include { BAM_CLEAN } from './modules/local/subworkflow/bam_clean' - -//////////////////////////////////////////////////// -/* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ -//////////////////////////////////////////////////// - -include { BWA_INDEX } from './modules/nf-core/software/bwa/index/main' -include { PICARD_MERGESAMFILES } from './modules/nf-core/software/picard/mergesamfiles/main' -include { PICARD_COLLECTMULTIPLEMETRICS } from './modules/nf-core/software/picard/collectmultiplemetrics/main' -include { PRESEQ_LCEXTRAP } from './modules/nf-core/software/preseq/lcextrap/main' -include { UCSC_BEDRAPHTOBIGWIG } from './modules/nf-core/software/ucsc/bedgraphtobigwig/main' -include { DEEPTOOLS_COMPUTEMATRIX } from './modules/nf-core/software/deeptools/computematrix/main' -include { DEEPTOOLS_PLOTPROFILE } from './modules/nf-core/software/deeptools/plotprofile/main' -include { DEEPTOOLS_PLOTHEATMAP } from './modules/nf-core/software/deeptools/plotheatmap/main' -include { DEEPTOOLS_PLOTFINGERPRINT } from './modules/nf-core/software/deeptools/plotfingerprint/main' -include { PHANTOMPEAKQUALTOOLS } from './modules/nf-core/software/phantompeakqualtools/main' -include { MACS2_CALLPEAK } from './modules/nf-core/software/macs2/callpeak/main' -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 - HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from './modules/nf-core/software/homer/annotatepeaks/main' -include { SUBREAD_FEATURECOUNTS } from './modules/nf-core/software/subread/featurecounts/main' - -include { FASTQC_TRIMGALORE } from './modules/nf-core/subworkflow/fastqc_trimgalore' -include { MAP_BWA_MEM } from './modules/nf-core/subworkflow/map_bwa_mem' -include { MARK_DUPLICATES_PICARD } from './modules/nf-core/subworkflow/mark_duplicates_picard' - -//////////////////////////////////////////////////// -/* -- RUN MAIN WORKFLOW -- */ -//////////////////////////////////////////////////// +======================================================================================== + RUN ALL WORKFLOWS +======================================================================================== +*/ +// +// WORKFLOW: Execute a single named workflow for the pipeline +// See: https://github.com/nf-core/rnaseq/issues/619 +// workflow { - - /* - * Read in samplesheet, validate and stage input files - */ - INPUT_CHECK ( - ch_input, - params.seq_center, - [:] - ) - - /* - * Prepare genome files - */ - ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index - - if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, [:] ) } - - MAKE_GENOME_FILTER ( - GET_CHROM_SIZES ( ch_fasta, [:] ).sizes, - ch_blacklist.ifEmpty([]), - [:] - ) - ch_software_versions = Channel.empty() - ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) - - /* - * Read QC & trimming - */ - nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - params.modules['trimgalore'].args += nextseq - FASTQC_TRIMGALORE ( - INPUT_CHECK.out.reads, - params.skip_fastqc, - params.skip_trimming, - params.modules['fastqc'], - params.modules['trimgalore'] - ) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) - - /* - * Map reads & BAM QC - */ - score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - params.modules['bwa_mem'].args += score - MAP_BWA_MEM ( - FASTQC_TRIMGALORE.out.reads, - ch_index, - ch_fasta, - params.modules['bwa_mem'], - params.modules['samtools_sort_lib'] - ) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) - - /* - * Merge resequenced BAM files - */ - MAP_BWA_MEM - .out - .bam - .map { - meta, bam -> - fmeta = meta.findAll { it.key != 'read_group' } - fmeta.id = fmeta.id.split('_')[0..-2].join('_') - [ fmeta, bam ] } - .groupTuple(by: [0]) - .map { it -> [ it[0], it[1].flatten() ] } - .set { ch_sort_bam } - - PICARD_MERGESAMFILES ( - ch_sort_bam, - params.modules['picard_mergesamfiles'] - ) - ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) - - /* - * Mark duplicates & filter BAM files - */ - MARK_DUPLICATES_PICARD ( - PICARD_MERGESAMFILES.out.bam, - params.modules['picard_markduplicates'], - params.modules['samtools_sort_merged_lib'] - ) - - // Fix getting name sorted BAM here for PE/SE - BAM_CLEAN ( - MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - MAKE_GENOME_FILTER.out.bed.collect(), - ch_bamtools_filter_se_config, - ch_bamtools_filter_pe_config, - params.modules['bam_filter'], - params.modules['bam_remove_orphans'], - params.modules['samtools_sort_filter'] - ) - ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) - - /* - * Post alignment QC - */ - PICARD_COLLECTMULTIPLEMETRICS ( - BAM_CLEAN.out.bam, - ch_fasta, - params.modules['picard_collectmultiplemetrics'] - ) - - PRESEQ_LCEXTRAP ( - BAM_CLEAN.out.bam, - params.modules['preseq_lcextrap'] - ) - ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) - - PHANTOMPEAKQUALTOOLS ( - BAM_CLEAN.out.bam, - params.modules['phantompeakqualtools'] - ) - ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) - - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( - PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), - ch_spp_nsc_header, - ch_spp_rsc_header, - ch_spp_correlation_header, - params.modules['multiqc_custom_phantompeakqualtools'] - ) - - /* - * Coverage tracks - */ - BEDTOOLS_GENOMECOV ( - BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), - params.modules['bedtools_genomecov'] - ) - - UCSC_BEDRAPHTOBIGWIG ( - BEDTOOLS_GENOMECOV.out.bedgraph, - GET_CHROM_SIZES.out.sizes, - params.modules['ucsc_bedgraphtobigwig'] - ) - ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) - - /* - * Coverage plots - */ - DEEPTOOLS_COMPUTEMATRIX ( - UCSC_BEDRAPHTOBIGWIG.out.bigwig, - ch_gene_bed, - params.modules['deeptools_computematrix'] - ) - ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) - - DEEPTOOLS_PLOTPROFILE ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix, - params.modules['deeptools_plotprofile'] - ) - - DEEPTOOLS_PLOTHEATMAP ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix, - params.modules['deeptools_plotheatmap'] - ) - - /* - * Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] - */ - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - .set { ch_control_bam_bai } - - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - .combine(ch_control_bam_bai, by: 0) - .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - .set { ch_ip_control_bam_bai } - - /* - * plotFingerprint for IP and control together - */ - params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" - DEEPTOOLS_PLOTFINGERPRINT ( - ch_ip_control_bam_bai, - params.modules['deeptools_plotfingerprint'] - ) - - peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - if (params.macs_gsize) { - - /* - * Call peaks - */ - broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" - pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' - fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' - pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' - params.modules['macs2_callpeak'].publish_dir += "/$peakType" - params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" - - // Create channel: [ val(meta), ip_bam, control_bam ] - ch_ip_control_bam_bai - .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - .set { ch_ip_control_bam } - - MACS2_CALLPEAK ( - ch_ip_control_bam, - params.macs_gsize, - params.modules['macs2_callpeak'] - ) - ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) - - ch_ip_control_bam - .join(MACS2_CALLPEAK.out.peak, by: [0]) - .map { it -> [ it[0], it[1], it[3] ] } - .set { ch_ip_peak } - FRIP_SCORE ( - ch_ip_peak, - params.modules['frip_score'] - ) - - ch_ip_peak - .join(FRIP_SCORE.out.txt, by: [0]) - .map { it -> [ it[0], it[2], it[3] ] } - .set { ch_ip_peak_frip } - MULTIQC_CUSTOM_PEAKS ( - ch_ip_peak_frip, - ch_peak_count_header, - ch_frip_score_header, - params.modules['multiqc_custom_peaks'] - ) - - params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" - PLOT_MACS2_QC ( - MACS2_CALLPEAK.out.peak.collect{it[1]}, - params.modules['plot_macs2_qc'] - ) - - params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" - HOMER_ANNOTATEPEAKS_MACS2 ( - MACS2_CALLPEAK.out.peak, - ch_fasta, - ch_gtf, - params.modules['homer_annotatepeaks_macs2'] - ) - ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) - - params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt", - params.modules['plot_homer_annotatepeaks'] - ) - - // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - MACS2_CALLPEAK - .out - .peak - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - .groupTuple() - .map { - antibody, groups, peaks -> - [ antibody, - groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - peaks ] } - .map { - antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } - .set { ch_antibody_peaks } - - params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" - MACS2_CONSENSUS ( - ch_antibody_peaks, - params.modules['macs2_consensus'] - ) - - params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" - HOMER_ANNOTATEPEAKS_CONSENSUS ( - MACS2_CONSENSUS.out.bed, - ch_fasta, - ch_gtf, - params.modules['homer_annotatepeaks_consensus'] - ) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - - // Create channel: [ val(meta), ip_bam ] - MACS2_CONSENSUS - .out - .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .combine(ch_ip_saf) - .map { - it -> - fmeta = it[1] - fmeta['replicates_exist'] = it[4]['replicates_exist'] - fmeta['multiple_groups'] = it[4]['multiple_groups'] - [ fmeta, it[2], it[5] ] } - .set { ch_ip_bam } - - params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" - SUBREAD_FEATURECOUNTS ( - ch_ip_bam, - params.modules['subread_featurecounts'] - ) - ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) - - // - // DESEQ2_FEATURECOUNTS ( - // params.modules['deseq2_featurecounts'] - // ) - // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - - } - - /* - * Create IGV session - */ - IGV ( - ch_fasta, - UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - params.modules['ucsc_bedgraphtobigwig'], - params.modules['macs2_callpeak'], - params.modules['macs2_consensus'], - [:] - ) - - /* - * Pipeline reporting - */ - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect(), - params.modules['get_software_versions'] - ) - - OUTPUT_DOCUMENTATION ( - ch_output_docs, - ch_output_docs_images, - [:] - ) - - /* - * MultiQC - */ - workflow_summary = Schema.params_mqc_summary(summary) - ch_workflow_summary = Channel.value(workflow_summary) - params.modules['multiqc'].publish_dir += "/$peakType" - MULTIQC ( - ch_multiqc_config, - ch_multiqc_custom_config.collect().ifEmpty([]), - GET_SOFTWARE_VERSIONS.out.yaml.collect(), - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - - FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - - MAP_BWA_MEM.out.stats.collect{it[1]}, - MAP_BWA_MEM.out.flagstat.collect{it[1]}, - MAP_BWA_MEM.out.idxstats.collect{it[1]}, - - MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), - - BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), - PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), - - PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - - MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), - // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - - params.modules['multiqc'] - ) + NFCORE_CHIPSEQ () } -//////////////////////////////////////////////////// -/* -- COMPLETION EMAIL -- */ -//////////////////////////////////////////////////// - -workflow.onComplete { - def multiqc_report = [] - Completion.email(workflow, params, summary, run_name, projectDir, multiqc_report, log) - Completion.summary(workflow, params, log) -} - -//////////////////////////////////////////////////// -/* -- THE END -- */ -//////////////////////////////////////////////////// +/* +======================================================================================== + THE END +======================================================================================== +*/ diff --git a/modules.json b/modules.json new file mode 100644 index 000000000..a11f8855c --- /dev/null +++ b/modules.json @@ -0,0 +1,14 @@ +{ + "name": "nf-core/chipseq", + "homePage": "https://github.com/nf-core/chipseq", + "repos": { + "nf-core/modules": { + "fastqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + }, + "multiqc": { + "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + } + } + } +} diff --git a/modules/local/process/bam_filter.nf b/modules/local/bam_filter.nf similarity index 97% rename from modules/local/process/bam_filter.nf rename to modules/local/bam_filter.nf index a72f54125..0aa34fcea 100644 --- a/modules/local/process/bam_filter.nf +++ b/modules/local/bam_filter.nf @@ -1,47 +1,47 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -/* - * Filter BAM file - */ -process BAM_FILTER { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(bam), path(bai) - path bed - path bamtools_filter_se_config - path bamtools_filter_pe_config - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' - def dup_params = params.keep_dups ? '' : '-F 0x0400' - def multimap_params = params.keep_multi_map ? '' : '-q 1' - def blacklist_params = params.blacklist ? "-L $bed" : '' - def config = meta.single_end ? bamtools_filter_se_config : bamtools_filter_pe_config - """ - samtools view \\ - $filter_params \\ - $dup_params \\ - $multimap_params \\ - $blacklist_params \\ - -b $bam \\ - | bamtools filter \\ - -out ${prefix}.bam \\ - -script $config - echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//' > bamtools.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +/* + * Filter BAM file + */ +process BAM_FILTER { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(bai) + path bed + path bamtools_filter_se_config + path bamtools_filter_pe_config + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' + def dup_params = params.keep_dups ? '' : '-F 0x0400' + def multimap_params = params.keep_multi_map ? '' : '-q 1' + def blacklist_params = params.blacklist ? "-L $bed" : '' + def config = meta.single_end ? bamtools_filter_se_config : bamtools_filter_pe_config + """ + samtools view \\ + $filter_params \\ + $dup_params \\ + $multimap_params \\ + $blacklist_params \\ + -b $bam \\ + | bamtools filter \\ + -out ${prefix}.bam \\ + -script $config + echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//' > bamtools.version.txt + """ +} diff --git a/modules/local/process/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf similarity index 96% rename from modules/local/process/bam_remove_orphans.nf rename to modules/local/bam_remove_orphans.nf index 9d6e001ef..ea33faebe 100644 --- a/modules/local/process/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -1,36 +1,36 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -/* - * Remove orphan reads from paired-end BAM file - */ -process BAM_REMOVE_ORPHANS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("${prefix}.bam"), emit: bam - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def ioptions = initOptions(options) - prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - if (!meta.single_end) { - """ - samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam - bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $ioptions.args - """ - } else { - """ - ln -s $bam ${prefix}.bam - """ - } -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +/* + * Remove orphan reads from paired-end BAM file + */ +process BAM_REMOVE_ORPHANS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("${prefix}.bam"), emit: bam + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def ioptions = initOptions(options) + prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + if (!meta.single_end) { + """ + samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam + bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $ioptions.args + """ + } else { + """ + ln -s $bam ${prefix}.bam + """ + } +} diff --git a/modules/local/process/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf similarity index 97% rename from modules/local/process/bedtools_genomecov.nf rename to modules/local/bedtools_genomecov.nf index 21464e905..208bded25 100644 --- a/modules/local/process/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -1,46 +1,46 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process BEDTOOLS_GENOMECOV { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - - conda (params.conda ? "bioconda::bedtools=2.29.2" : null) - - input: - tuple val(meta), path(bam), path(flagstat) - val options - - output: - tuple val(meta), path("*.bedGraph"), emit: bedgraph - tuple val(meta), path("*.txt"), emit: scale_factor - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def pe = meta.single_end ? '' : '-pc' - def extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' - """ - SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') - echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt - - bedtools \\ - genomecov \\ - -ibam $bam \\ - -bg \\ - -scale \$SCALE_FACTOR \\ - $pe \\ - $extend \\ - | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph - - bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process BEDTOOLS_GENOMECOV { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) + + input: + tuple val(meta), path(bam), path(flagstat) + val options + + output: + tuple val(meta), path("*.bedGraph"), emit: bedgraph + tuple val(meta), path("*.txt"), emit: scale_factor + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def pe = meta.single_end ? '' : '-pc' + def extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' + """ + SCALE_FACTOR=\$(grep 'mapped (' $flagstat | awk '{print 1000000/\$1}') + echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt + + bedtools \\ + genomecov \\ + -ibam $bam \\ + -bg \\ + -scale \$SCALE_FACTOR \\ + $pe \\ + $extend \\ + | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph + + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt + """ +} diff --git a/modules/local/process/deseq2_featurecounts.nf b/modules/local/deseq2_featurecounts.nf similarity index 97% rename from modules/local/process/deseq2_featurecounts.nf rename to modules/local/deseq2_featurecounts.nf index 4586ee7e1..7673a4295 100644 --- a/modules/local/process/deseq2_featurecounts.nf +++ b/modules/local/deseq2_featurecounts.nf @@ -1,55 +1,55 @@ -conda (params.conda ? "${baseDir}/environment.yml" : null) - -// /* -// * STEP 7.4: Differential analysis with DESeq2 -// */ -// process CONSENSUS_PEAKS_DESEQ2 { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts -// path deseq2_pca_header from ch_deseq2_pca_header -// path deseq2_clustering_header from ch_deseq2_clustering_header -// -// output: -// path '*.tsv' into ch_macs_consensus_deseq_mqc -// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv -// path '*.{RData,results.txt,pdf,log}' -// path 'sizeFactors' -// path '*vs*/*.{pdf,txt}' -// path '*vs*/*.bed' -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' -// vst = params.deseq2_vst ? '--vst TRUE' : '' -// """ -// featurecounts_deseq2.r \\ -// --featurecount_file $counts \\ -// --bam_suffix '$bam_ext' \\ -// --outdir ./ \\ -// --outprefix $prefix \\ -// --outsuffix '' \\ -// --cores $task.cpus \\ -// $vst -// -// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv -// -// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv -// -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt -// """ -// } +conda (params.conda ? "${baseDir}/environment.yml" : null) + +// /* +// * STEP 7.4: Differential analysis with DESeq2 +// */ +// process CONSENSUS_PEAKS_DESEQ2 { +// tag "${antibody}" +// label 'process_medium' +// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, +// saveAs: { filename -> +// if (filename.endsWith('.igv.txt')) null +// else filename +// } +// +// when: +// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis +// +// input: +// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts +// path deseq2_pca_header from ch_deseq2_pca_header +// path deseq2_clustering_header from ch_deseq2_clustering_header +// +// output: +// path '*.tsv' into ch_macs_consensus_deseq_mqc +// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv +// path '*.{RData,results.txt,pdf,log}' +// path 'sizeFactors' +// path '*vs*/*.{pdf,txt}' +// path '*vs*/*.bed' +// +// script: +// prefix = "${antibody}.consensus_peaks" +// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' +// vst = params.deseq2_vst ? '--vst TRUE' : '' +// """ +// featurecounts_deseq2.r \\ +// --featurecount_file $counts \\ +// --bam_suffix '$bam_ext' \\ +// --outdir ./ \\ +// --outprefix $prefix \\ +// --outsuffix '' \\ +// --cores $task.cpus \\ +// $vst +// +// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv +// +// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt +// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt +// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv +// +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt +// """ +// } diff --git a/modules/local/process/frip_score.nf b/modules/local/frip_score.nf similarity index 97% rename from modules/local/process/frip_score.nf rename to modules/local/frip_score.nf index 1fd0a7b41..cb19cbfc5 100644 --- a/modules/local/process/frip_score.nf +++ b/modules/local/frip_score.nf @@ -1,28 +1,28 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -process FRIP_SCORE { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(bam), path(peak) - val options - - output: - tuple val(meta), path("*.txt"), emit: txt - - script: - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $ioptions.args | awk -F '\t' '{sum += \$NF} END {print sum}') - samtools flagstat $bam > ${bam}.flagstat - grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +process FRIP_SCORE { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(bam), path(peak) + val options + + output: + tuple val(meta), path("*.txt"), emit: txt + + script: + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $ioptions.args | awk -F '\t' '{sum += \$NF} END {print sum}') + samtools flagstat $bam > ${bam}.flagstat + grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt + """ +} diff --git a/modules/local/functions.nf b/modules/local/functions.nf new file mode 100644 index 000000000..da9da093d --- /dev/null +++ b/modules/local/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/local/process/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf similarity index 96% rename from modules/local/process/get_chrom_sizes.nf rename to modules/local/get_chrom_sizes.nf index e929db2d4..11ab9ff7f 100644 --- a/modules/local/process/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,34 +1,34 @@ -// Import generic module functions -include { saveFiles } from './functions' - -/* - * Get chromosome sizes from a fasta file - */ -process GET_CHROM_SIZES { - tag "$fasta" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - path fasta - val options - - output: - path '*.sizes', emit: sizes - path '*.fai', emit: fai - path "*.version.txt", emit: version - - script: - def software = 'samtools' - """ - samtools faidx $fasta - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { saveFiles } from './functions' + +/* + * Get chromosome sizes from a fasta file + */ +process GET_CHROM_SIZES { + tag "$fasta" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + path fasta + val options + + output: + path '*.sizes', emit: sizes + path '*.fai', emit: fai + path "*.version.txt", emit: version + + script: + def software = 'samtools' + """ + samtools faidx $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf new file mode 100644 index 000000000..3e9926b85 --- /dev/null +++ b/modules/local/get_software_versions.nf @@ -0,0 +1,33 @@ +// Import generic module functions +include { saveFiles } from './functions' + +params.options = [:] + +process GET_SOFTWARE_VERSIONS { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + cache false + + input: + path versions + + output: + path "software_versions.tsv" , emit: tsv + path 'software_versions_mqc.yaml', emit: yaml + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + echo $workflow.manifest.version > pipeline.version.txt + echo $workflow.nextflow.version > nextflow.version.txt + scrape_software_versions.py &> software_versions_mqc.yaml + """ +} diff --git a/modules/local/process/gtf2bed.nf b/modules/local/gtf2bed.nf similarity index 96% rename from modules/local/process/gtf2bed.nf rename to modules/local/gtf2bed.nf index 4258b2379..8026a0ec0 100644 --- a/modules/local/process/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -1,30 +1,30 @@ -// Import generic module functions -include { saveFiles } from './functions' - -/* - * Convert GTF file to BED format - */ -process GTF2BED { - tag "$gtf" - label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } - - container "quay.io/biocontainers/perl:5.26.2" - //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" - - conda (params.conda ? "conda-forge::perl=5.26.2" : null) - - input: - path gtf - val options - - output: - path '*.bed' - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - gtf2bed $gtf > ${gtf.baseName}.bed - """ -} +// Import generic module functions +include { saveFiles } from './functions' + +/* + * Convert GTF file to BED format + */ +process GTF2BED { + tag "$gtf" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } + + container "quay.io/biocontainers/perl:5.26.2" + //container "https://depot.galaxyproject.org/singularity/perl:5.26.2" + + conda (params.conda ? "conda-forge::perl=5.26.2" : null) + + input: + path gtf + val options + + output: + path '*.bed' + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + gtf2bed $gtf > ${gtf.baseName}.bed + """ +} diff --git a/modules/local/process/igv.nf b/modules/local/igv.nf similarity index 97% rename from modules/local/process/igv.nf rename to modules/local/igv.nf index c13aa3503..c131e044a 100644 --- a/modules/local/process/igv.nf +++ b/modules/local/igv.nf @@ -1,39 +1,39 @@ -// Import generic module functions -include { saveFiles } from './functions' - -/* - * Create IGV session file - */ -process IGV { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - path fasta - path ("${bigwig_options.publish_dir}/*") - path ("${peak_options.publish_dir}/*") - path ("${consensus_options.publish_dir}/*") - val bigwig_options - val peak_options - val consensus_options - // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) - val options - - output: - path "*files.txt", emit: txt - path "*.xml", emit: xml - - script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ - """ - find * -type l -name "*.bigWig" -exec echo -e ""{}"\\t0,0,178" \\; > bigwig.igv.txt - find * -type l -name "*Peak" -exec echo -e ""{}"\\t0,0,178" \\; > peaks.igv.txt - - cat *.txt > igv_files.txt - igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' - """ -} -// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt +// Import generic module functions +include { saveFiles } from './functions' + +/* + * Create IGV session file + */ +process IGV { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path fasta + path ("${bigwig_options.publish_dir}/*") + path ("${peak_options.publish_dir}/*") + path ("${consensus_options.publish_dir}/*") + val bigwig_options + val peak_options + val consensus_options + // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) + val options + + output: + path "*files.txt", emit: txt + path "*.xml", emit: xml + + script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ + """ + find * -type l -name "*.bigWig" -exec echo -e ""{}"\\t0,0,178" \\; > bigwig.igv.txt + find * -type l -name "*Peak" -exec echo -e ""{}"\\t0,0,178" \\; > peaks.igv.txt + + cat *.txt > igv_files.txt + igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' + """ +} +// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt +// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt diff --git a/modules/local/process/macs2_consensus.nf b/modules/local/macs2_consensus.nf similarity index 97% rename from modules/local/process/macs2_consensus.nf rename to modules/local/macs2_consensus.nf index b3ba35ff4..727c25b63 100644 --- a/modules/local/process/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -1,55 +1,55 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -/* - * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts - */ -process MACS2_CONSENSUS { - tag "$meta.id" - label 'process_long' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(peaks) - val options - - output: - tuple val(meta), path("*.bed"), emit: bed - tuple val(meta), path("*.saf"), emit: saf - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.boolean.txt"), emit: boolean_txt - tuple val(meta), path("*.intersect.txt"), emit: intersect_txt - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - if (meta.multiple_groups || meta.replicates_exist) { - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" - def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') - def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') - def expandparam = params.narrow_peak ? '--is_narrow_peak' : '' - """ - sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ - | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt - - macs2_merged_expand.py \\ - ${prefix}.txt \\ - ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ - ${prefix}.boolean.txt \\ - --min_replicates $params.min_reps_consensus \\ - $expandparam - - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed - - echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf - - plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf - """ - } -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +/* + * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts + */ +process MACS2_CONSENSUS { + tag "$meta.id" + label 'process_long' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(peaks) + val options + + output: + tuple val(meta), path("*.bed"), emit: bed + tuple val(meta), path("*.saf"), emit: saf + tuple val(meta), path("*.pdf"), emit: pdf + tuple val(meta), path("*.boolean.txt"), emit: boolean_txt + tuple val(meta), path("*.intersect.txt"), emit: intersect_txt + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + if (meta.multiple_groups || meta.replicates_exist) { + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') + def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') + def expandparam = params.narrow_peak ? '--is_narrow_peak' : '' + """ + sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ + | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt + + macs2_merged_expand.py \\ + ${prefix}.txt \\ + ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ + ${prefix}.boolean.txt \\ + --min_replicates $params.min_reps_consensus \\ + $expandparam + + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed + + echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf + + plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf + """ + } +} diff --git a/modules/local/process/make_genome_filter.nf b/modules/local/make_genome_filter.nf similarity index 96% rename from modules/local/process/make_genome_filter.nf rename to modules/local/make_genome_filter.nf index 042fcdc49..e008a4455 100644 --- a/modules/local/process/make_genome_filter.nf +++ b/modules/local/make_genome_filter.nf @@ -1,41 +1,41 @@ -// Import generic module functions -include { saveFiles } from './functions' - -/* - * Prepare genome intervals for filtering by removing regions in blacklist file - */ -process MAKE_GENOME_FILTER { - tag "$sizes" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } - - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - - conda (params.conda ? "bioconda::bedtools=2.29.2" : null) - - input: - path sizes - path blacklist - val options - - output: - path '*.bed', emit: bed - path "*.version.txt", emit: version - - script: - def software = 'bedtools' - def file_out = "${sizes.simpleName}.include_regions.bed" - if (params.blacklist) { - """ - sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out - bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt - """ - } else { - """ - awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out - bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt - """ - } -} +// Import generic module functions +include { saveFiles } from './functions' + +/* + * Prepare genome intervals for filtering by removing regions in blacklist file + */ +process MAKE_GENOME_FILTER { + tag "$sizes" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"genome", publish_id:'') } + + container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" + //container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" + + conda (params.conda ? "bioconda::bedtools=2.29.2" : null) + + input: + path sizes + path blacklist + val options + + output: + path '*.bed', emit: bed + path "*.version.txt", emit: version + + script: + def software = 'bedtools' + def file_out = "${sizes.simpleName}.include_regions.bed" + if (params.blacklist) { + """ + sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt + """ + } else { + """ + awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out + bedtools --version | sed -e "s/bedtools v//g" > ${software}.version.txt + """ + } +} diff --git a/modules/local/process/multiqc.nf b/modules/local/multiqc.nf similarity index 83% rename from modules/local/process/multiqc.nf rename to modules/local/multiqc.nf index 3a9865f8e..26ea1adae 100644 --- a/modules/local/process/multiqc.nf +++ b/modules/local/multiqc.nf @@ -3,10 +3,10 @@ include { initOptions; saveFiles; getSoftwareName } from './functions' // Has the run name been specified by the user? // this has the bonus effect of catching both -name and --name -custom_runName = params.name -if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { - custom_runName = workflow.runName -} +// custom_runName = params.name // TODO remove +// if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { +// custom_runName = workflow.runName +// } process MULTIQC { label 'process_medium' @@ -67,10 +67,10 @@ process MULTIQC { script: def software = getSoftwareName(task.process) def ioptions = initOptions(options) - def rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - def rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' + // def rtitle = custom_runName ? "--title \"$custom_runName\"" : '' + // def rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' def custom_config = params.multiqc_config ? "--config $mqc_custom_config" : '' """ - multiqc -f $ioptions.args $rtitle $rfilename $custom_config . + multiqc -f $ioptions.args $custom_config . """ } diff --git a/modules/local/process/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf similarity index 97% rename from modules/local/process/multiqc_custom_peaks.nf rename to modules/local/multiqc_custom_peaks.nf index f98ee9bae..33abfd908 100644 --- a/modules/local/process/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -1,30 +1,30 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process MULTIQC_CUSTOM_PEAKS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(peak), path(frip) - path peak_count_header - path frip_score_header - val options - - output: - tuple val(meta), path("*.peak_count_mqc.tsv"), emit: count - tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv - cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process MULTIQC_CUSTOM_PEAKS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(peak), path(frip) + path peak_count_header + path frip_score_header + val options + + output: + tuple val(meta), path("*.peak_count_mqc.tsv"), emit: count + tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv + cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv + """ +} diff --git a/modules/local/process/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf similarity index 97% rename from modules/local/process/multiqc_custom_phantompeakqualtools.nf rename to modules/local/multiqc_custom_phantompeakqualtools.nf index a49fbf17c..f7ef7d049 100644 --- a/modules/local/process/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -1,35 +1,35 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - tuple val(meta), path(spp), path(rdata) - path nsc_header - path rsc_header - path correlation_header - val options - - output: - tuple val(meta), path("*.spp_nsc_mqc.tsv"), emit: nsc - tuple val(meta), path("*.spp_rsc_mqc.tsv"), emit: rsc - tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - cp $correlation_header ${prefix}.spp_correlation_mqc.tsv - Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" - - awk -v OFS='\t' '{print "${meta.id}", \$9}' $spp | cat $nsc_header - > ${prefix}.spp_nsc_mqc.tsv - awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + tuple val(meta), path(spp), path(rdata) + path nsc_header + path rsc_header + path correlation_header + val options + + output: + tuple val(meta), path("*.spp_nsc_mqc.tsv"), emit: nsc + tuple val(meta), path("*.spp_rsc_mqc.tsv"), emit: rsc + tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + cp $correlation_header ${prefix}.spp_correlation_mqc.tsv + Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" + + awk -v OFS='\t' '{print "${meta.id}", \$9}' $spp | cat $nsc_header - > ${prefix}.spp_nsc_mqc.tsv + awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv + """ +} diff --git a/modules/local/process/output_documentation.nf b/modules/local/output_documentation.nf similarity index 100% rename from modules/local/process/output_documentation.nf rename to modules/local/output_documentation.nf diff --git a/modules/local/process/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf similarity index 96% rename from modules/local/process/plot_homer_annotatepeaks.nf rename to modules/local/plot_homer_annotatepeaks.nf index c474cfc66..c503c7d24 100644 --- a/modules/local/process/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -1,36 +1,36 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -/* - * Aggregated QC plots for peak-to-gene annotation - */ -process PLOT_HOMER_ANNOTATEPEAKS { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - path annos - path mqc_header - val suffix - val options - - output: - path '*.txt', emit: txt - path '*.pdf', emit: pdf - path '*.tsv', emit: tsv - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def ioptions = initOptions(options) - """ - plot_homer_annotatepeaks.r \\ - -i ${annos.join(',')} \\ - -s ${annos.join(',').replaceAll("${suffix}","")} \\ - $ioptions.args - - find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv - """ -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +/* + * Aggregated QC plots for peak-to-gene annotation + */ +process PLOT_HOMER_ANNOTATEPEAKS { + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path annos + path mqc_header + val suffix + val options + + output: + path '*.txt', emit: txt + path '*.pdf', emit: pdf + path '*.tsv', emit: tsv + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def ioptions = initOptions(options) + """ + plot_homer_annotatepeaks.r \\ + -i ${annos.join(',')} \\ + -s ${annos.join(',').replaceAll("${suffix}","")} \\ + $ioptions.args + + find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv + """ +} diff --git a/modules/local/process/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf similarity index 96% rename from modules/local/process/plot_macs2_qc.nf rename to modules/local/plot_macs2_qc.nf index ee3065f03..8d2cce690 100644 --- a/modules/local/process/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -1,32 +1,32 @@ -// Import generic module functions -include { initOptions; saveFiles } from './functions' - -/* - * Aggregated QC plots for peaks - */ -process PLOT_MACS2_QC { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } - - conda (params.conda ? "${baseDir}/environment.yml" : null) - - input: - path peaks - val options - - output: - path '*.txt', emit: txt - path '*.pdf', emit: pdf - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def ioptions = initOptions(options) - def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - """ - plot_macs2_qc.r \\ - -i ${peaks.join(',')} \\ - -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ - $ioptions.args - """ -} +// Import generic module functions +include { initOptions; saveFiles } from './functions' + +/* + * Aggregated QC plots for peaks + */ +process PLOT_MACS2_QC { + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:task.process.toLowerCase(), publish_id:'') } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path peaks + val options + + output: + path '*.txt', emit: txt + path '*.pdf', emit: pdf + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def ioptions = initOptions(options) + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + """ + plot_macs2_qc.r \\ + -i ${peaks.join(',')} \\ + -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ + $ioptions.args + """ +} diff --git a/modules/local/process/functions.nf b/modules/local/process/functions.nf deleted file mode 100644 index 6f72fdc10..000000000 --- a/modules/local/process/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = (args.publish_files instanceof Map)? args.publish_files : null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/process/get_software_versions.nf b/modules/local/process/get_software_versions.nf deleted file mode 100644 index db1cab64a..000000000 --- a/modules/local/process/get_software_versions.nf +++ /dev/null @@ -1,26 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -/* - * Parse software version numbers - */ -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } - - input: - path versions - val options - - output: - path "software_versions.csv", emit: csv - path 'software_versions_mqc.yaml', emit: yaml - - script: - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf new file mode 100644 index 000000000..efa94f7f5 --- /dev/null +++ b/modules/local/samplesheet_check.nf @@ -0,0 +1,26 @@ +// Import generic module functions +include { saveFiles } from './functions' + +/* + * Reformat design file, check validitiy and create IP vs control mappings + */ +process SAMPLESHEET_CHECK { + tag "$samplesheet" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } + + conda (params.conda ? "${baseDir}/environment.yml" : null) + + input: + path samplesheet + val options + + output: + path '*.csv' + + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + """ + check_samplesheet.py $samplesheet samplesheet.valid.csv + """ +} diff --git a/modules/local/subworkflow/input_check.nf b/modules/local/subworkflow/input_check.nf deleted file mode 100644 index 88c6cac11..000000000 --- a/modules/local/subworkflow/input_check.nf +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Check input samplesheet and get read channels - */ - -include { SAMPLESHEET_CHECK; - get_samplesheet_paths } from '../process/samplesheet_check' - -workflow INPUT_CHECK { - take: - ch_input // file: /path/to/samplesheet.csv - seq_center // string: sequencing center for read group - samplesheet_check_options // map: options for check_samplesheet module - - main: - SAMPLESHEET_CHECK (ch_input, samplesheet_check_options) - .splitCsv(header:true, sep:',') - .map { get_samplesheet_paths(it, seq_center) } - .set { ch_reads } - - emit: - reads = ch_reads // channel: [ val(meta), [ reads ] ] -} diff --git a/modules/nf-core/software/bwa/mem/functions.nf b/modules/nf-core/modules/bwa/index/functions.nf similarity index 97% rename from modules/nf-core/software/bwa/mem/functions.nf rename to modules/nf-core/modules/bwa/index/functions.nf index 75553cdf5..5bafdbe17 100644 --- a/modules/nf-core/software/bwa/mem/functions.nf +++ b/modules/nf-core/modules/bwa/index/functions.nf @@ -1,59 +1,59 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/bwa/index/main.nf b/modules/nf-core/modules/bwa/index/main.nf similarity index 100% rename from modules/nf-core/software/bwa/index/main.nf rename to modules/nf-core/modules/bwa/index/main.nf diff --git a/modules/nf-core/software/bwa/index/meta.yml b/modules/nf-core/modules/bwa/index/meta.yml similarity index 100% rename from modules/nf-core/software/bwa/index/meta.yml rename to modules/nf-core/modules/bwa/index/meta.yml diff --git a/modules/nf-core/software/fastqc/functions.nf b/modules/nf-core/modules/bwa/mem/functions.nf similarity index 97% rename from modules/nf-core/software/fastqc/functions.nf rename to modules/nf-core/modules/bwa/mem/functions.nf index 75553cdf5..5bafdbe17 100644 --- a/modules/nf-core/software/fastqc/functions.nf +++ b/modules/nf-core/modules/bwa/mem/functions.nf @@ -1,59 +1,59 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/bwa/mem/main.nf b/modules/nf-core/modules/bwa/mem/main.nf similarity index 97% rename from modules/nf-core/software/bwa/mem/main.nf rename to modules/nf-core/modules/bwa/mem/main.nf index 127bc7003..f94d2129b 100644 --- a/modules/nf-core/software/bwa/mem/main.nf +++ b/modules/nf-core/modules/bwa/mem/main.nf @@ -1,42 +1,42 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process BWA_MEM { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" - //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" - - conda (params.conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(reads) - path index - path fasta - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def rg = meta.read_group ? "-R ${meta.read_group}" : "" - """ - bwa mem \\ - $ioptions.args \\ - $rg \\ - -t $task.cpus \\ - $fasta \\ - $reads \\ - | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - - - echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process BWA_MEM { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + //container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:eabfac3657eda5818bae4090db989e3d41b01542-0" + + conda (params.conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(reads) + path index + path fasta + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def rg = meta.read_group ? "-R ${meta.read_group}" : "" + """ + bwa mem \\ + $ioptions.args \\ + $rg \\ + -t $task.cpus \\ + $fasta \\ + $reads \\ + | samtools view $ioptions.args2 -@ $task.cpus -bS -o ${prefix}.bam - + + echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/bwa/mem/meta.yml b/modules/nf-core/modules/bwa/mem/meta.yml similarity index 100% rename from modules/nf-core/software/bwa/mem/meta.yml rename to modules/nf-core/modules/bwa/mem/meta.yml diff --git a/modules/nf-core/software/bwa/index/functions.nf b/modules/nf-core/modules/fastqc/functions.nf similarity index 97% rename from modules/nf-core/software/bwa/index/functions.nf rename to modules/nf-core/modules/fastqc/functions.nf index 75553cdf5..5bafdbe17 100644 --- a/modules/nf-core/software/bwa/index/functions.nf +++ b/modules/nf-core/modules/fastqc/functions.nf @@ -1,59 +1,59 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf similarity index 100% rename from modules/nf-core/software/fastqc/main.nf rename to modules/nf-core/modules/fastqc/main.nf diff --git a/modules/nf-core/software/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml similarity index 100% rename from modules/nf-core/software/fastqc/meta.yml rename to modules/nf-core/modules/fastqc/meta.yml diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf new file mode 100644 index 000000000..da9da093d --- /dev/null +++ b/modules/nf-core/modules/multiqc/functions.nf @@ -0,0 +1,68 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf new file mode 100644 index 000000000..da7808002 --- /dev/null +++ b/modules/nf-core/modules/multiqc/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process MULTIQC { + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" + } else { + container "quay.io/biocontainers/multiqc:1.10.1--py_0" + } + + input: + path multiqc_files + + output: + path "*multiqc_report.html", emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + """ + multiqc -f $options.args . + multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml new file mode 100644 index 000000000..532a8bb1e --- /dev/null +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -0,0 +1,39 @@ +name: MultiQC +description: Aggregate results from bioinformatics analyses across many samples into a single report +keywords: + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report +tools: + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ +input: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC +output: + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf similarity index 97% rename from modules/nf-core/software/picard/collectmultiplemetrics/functions.nf rename to modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf index 75553cdf5..5bafdbe17 100644 --- a/modules/nf-core/software/picard/collectmultiplemetrics/functions.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf @@ -1,59 +1,59 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf similarity index 97% rename from modules/nf-core/software/picard/collectmultiplemetrics/main.nf rename to modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index 8850d534c..03d5a4c80 100644 --- a/modules/nf-core/software/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -1,47 +1,47 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_COLLECTMULTIPLEMETRICS { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bam) - path fasta - val options - - output: - tuple val(meta), path("*_metrics"), emit: metrics - tuple val(meta), path("*.pdf"), emit: pdf - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - picard \\ - -Xmx${avail_mem}g \\ - CollectMultipleMetrics \\ - $ioptions.args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.CollectMultipleMetrics \\ - REFERENCE_SEQUENCE=$fasta - - echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_COLLECTMULTIPLEMETRICS { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bam) + path fasta + val options + + output: + tuple val(meta), path("*_metrics"), emit: metrics + tuple val(meta), path("*.pdf"), emit: pdf + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + CollectMultipleMetrics \\ + $ioptions.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.CollectMultipleMetrics \\ + REFERENCE_SEQUENCE=$fasta + + echo \$(picard CollectMultipleMetrics --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/picard/markduplicates/functions.nf b/modules/nf-core/modules/picard/markduplicates/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/picard/markduplicates/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf similarity index 97% rename from modules/nf-core/software/picard/markduplicates/main.nf rename to modules/nf-core/modules/picard/markduplicates/main.nf index 8bfed2565..b102b4f23 100644 --- a/modules/nf-core/software/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -1,46 +1,46 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_MARKDUPLICATES { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.metrics.txt"), emit: metrics - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - """ - picard \\ - -Xmx${avail_mem}g \\ - MarkDuplicates \\ - $ioptions.args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.bam \\ - METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt - - echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_MARKDUPLICATES { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.metrics.txt"), emit: metrics + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + """ + picard \\ + -Xmx${avail_mem}g \\ + MarkDuplicates \\ + $ioptions.args \\ + INPUT=$bam \\ + OUTPUT=${prefix}.bam \\ + METRICS_FILE=${prefix}.MarkDuplicates.metrics.txt + + echo \$(picard MarkDuplicates --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/picard/mergesamfiles/functions.nf b/modules/nf-core/modules/picard/mergesamfiles/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/picard/mergesamfiles/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/picard/mergesamfiles/main.nf b/modules/nf-core/modules/picard/mergesamfiles/main.nf similarity index 97% rename from modules/nf-core/software/picard/mergesamfiles/main.nf rename to modules/nf-core/modules/picard/mergesamfiles/main.nf index 062bbfc85..4e6649d8e 100644 --- a/modules/nf-core/software/picard/mergesamfiles/main.nf +++ b/modules/nf-core/modules/picard/mergesamfiles/main.nf @@ -1,51 +1,51 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process PICARD_MERGESAMFILES { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/picard:2.23.2--0" - //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" - - conda (params.conda ? "bioconda::picard=2.23.2" : null) - - input: - tuple val(meta), path(bams) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - def bam_files = bams.sort() - def avail_mem = 3 - if (!task.memory) { - log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = task.memory.giga - } - if (bam_files.size() > 1) { - """ - picard \\ - -Xmx${avail_mem}g \\ - MergeSamFiles \\ - $ioptions.args \\ - ${'INPUT='+bam_files.join(' INPUT=')} \\ - OUTPUT=${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ - } else { - """ - ln -s ${bam_files[0]} ${prefix}.bam - echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt - """ - } -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process PICARD_MERGESAMFILES { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/picard:2.23.2--0" + //container "https://depot.galaxyproject.org/singularity/picard:2.23.2--0" + + conda (params.conda ? "bioconda::picard=2.23.2" : null) + + input: + tuple val(meta), path(bams) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + def bam_files = bams.sort() + def avail_mem = 3 + if (!task.memory) { + log.info '[Picard MergeSamFiles] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' + } else { + avail_mem = task.memory.giga + } + if (bam_files.size() > 1) { + """ + picard \\ + -Xmx${avail_mem}g \\ + MergeSamFiles \\ + $ioptions.args \\ + ${'INPUT='+bam_files.join(' INPUT=')} \\ + OUTPUT=${prefix}.bam + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ + } else { + """ + ln -s ${bam_files[0]} ${prefix}.bam + echo \$(picard MergeSamFiles --version 2>&1) | awk -F' ' '{print \$NF}' > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/modules/samtools/flagstat/functions.nf b/modules/nf-core/modules/samtools/flagstat/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/samtools/flagstat/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf similarity index 97% rename from modules/nf-core/software/samtools/flagstat/main.nf rename to modules/nf-core/modules/samtools/flagstat/main.nf index 4c14a41ae..be9897c48 100644 --- a/modules/nf-core/software/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -1,29 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_FLAGSTAT { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.flagstat"), emit: flagstat - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools flagstat $bam > ${bam}.flagstat - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools flagstat $bam > ${bam}.flagstat + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/idxstats/functions.nf b/modules/nf-core/modules/samtools/idxstats/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/samtools/idxstats/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf similarity index 97% rename from modules/nf-core/software/samtools/idxstats/main.nf rename to modules/nf-core/modules/samtools/idxstats/main.nf index 9805bb141..3934eb4c7 100644 --- a/modules/nf-core/software/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -1,29 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_IDXSTATS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.idxstats"), emit: idxstats - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools idxstats $bam > ${bam}.idxstats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools idxstats $bam > ${bam}.idxstats + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/samtools/index/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf similarity index 97% rename from modules/nf-core/software/samtools/index/main.nf rename to modules/nf-core/modules/samtools/index/main.nf index 456e2663d..cc9e6407a 100644 --- a/modules/nf-core/software/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -1,29 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_INDEX { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bai"), emit: bai - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools index $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_INDEX { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bai"), emit: bai + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools index $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml similarity index 100% rename from modules/nf-core/software/samtools/index/meta.yml rename to modules/nf-core/modules/samtools/index/meta.yml diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/samtools/sort/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf similarity index 97% rename from modules/nf-core/software/samtools/sort/main.nf rename to modules/nf-core/modules/samtools/sort/main.nf index 9467e2aea..68cce0fc2 100644 --- a/modules/nf-core/software/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -1,32 +1,32 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_SORT { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam) - val options - - output: - tuple val(meta), path("*.bam"), emit: bam - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - """ - samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam) + val options + + output: + tuple val(meta), path("*.bam"), emit: bam + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + """ + samtools sort $ioptions.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/software/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml similarity index 100% rename from modules/nf-core/software/samtools/sort/meta.yml rename to modules/nf-core/modules/samtools/sort/meta.yml diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/samtools/stats/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf similarity index 97% rename from modules/nf-core/software/samtools/stats/main.nf rename to modules/nf-core/modules/samtools/stats/main.nf index 52d5e2d74..a225edff0 100644 --- a/modules/nf-core/software/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,29 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process SAMTOOLS_STATS { - tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - - conda (params.conda ? "bioconda::samtools=1.10" : null) - - input: - tuple val(meta), path(bam), path(bai) - val options - - output: - tuple val(meta), path("*.stats"), emit: stats - path "*.version.txt", emit: version - - script: - def software = getSoftwareName(task.process) - """ - samtools stats $bam > ${bam}.stats - echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt - """ -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process SAMTOOLS_STATS { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" + //container " https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" + + conda (params.conda ? "bioconda::samtools=1.10" : null) + + input: + tuple val(meta), path(bam), path(bai) + val options + + output: + tuple val(meta), path("*.stats"), emit: stats + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + """ + samtools stats $bam > ${bam}.stats + echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' > ${software}.version.txt + """ +} diff --git a/modules/nf-core/modules/trimgalore/functions.nf b/modules/nf-core/modules/trimgalore/functions.nf new file mode 100644 index 000000000..5bafdbe17 --- /dev/null +++ b/modules/nf-core/modules/trimgalore/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * Utility functions used in nf-core DSL2 module files + * ----------------------------------------------------- + */ + +/* + * Extract name of software tool from process name using $task.process + */ +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +/* + * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules + */ +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.publish_by_id = args.publish_by_id ?: false + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files ?: null + options.suffix = args.suffix ?: '' + return options +} + +/* + * Tidy up and join elements of a list to return a path string + */ +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +/* + * Function to save/publish module results + */ +def saveFiles(Map args) { + if (!args.filename.endsWith('.version.txt')) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + if (ioptions.publish_by_id) { + path_list.add(args.publish_id) + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else { + return "${getPathFromList(path_list)}/$args.filename" + } + } +} diff --git a/modules/nf-core/software/trimgalore/main.nf b/modules/nf-core/modules/trimgalore/main.nf similarity index 97% rename from modules/nf-core/software/trimgalore/main.nf rename to modules/nf-core/modules/trimgalore/main.nf index 219b3e659..eb586e4a5 100644 --- a/modules/nf-core/software/trimgalore/main.nf +++ b/modules/nf-core/modules/trimgalore/main.nf @@ -1,79 +1,79 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -process TRIMGALORE { - tag "$meta.id" - label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } - - container "quay.io/biocontainers/trim-galore:0.6.5--0" - //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" - - conda (params.conda ? "bioconda::trim-galore=0.6.5" : null) - - input: - tuple val(meta), path(reads) - val options - - output: - tuple val(meta), path("*.fq.gz"), emit: reads - tuple val(meta), path("*.html"), emit: html optional true - tuple val(meta), path("*.zip"), emit: zip optional true - tuple val(meta), path("*report.txt"), emit: log - path "*.version.txt", emit: version - - script: - // Calculate number of --cores for TrimGalore based on value of task.cpus - // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 - // See: https://github.com/nf-core/atacseq/pull/65 - def cores = 1 - if (task.cpus) { - cores = (task.cpus as int) - 4 - if (meta.single_end) cores = (task.cpus as int) - 3 - if (cores < 1) cores = 1 - if (cores > 4) cores = 4 - } - - // Clipping presets have to be evaluated in the context of SE/PE - def c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' - def c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' - def tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' - def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' - - // Added soft-links to original fastqs for consistent naming in MultiQC - def software = getSoftwareName(task.process) - def ioptions = initOptions(options) - def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - trim_galore \\ - $ioptions.args \\ - --cores $cores \\ - --gzip \\ - $c_r1 \\ - $tpc_r1 \\ - ${prefix}.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - trim_galore \\ - $ioptions.args \\ - --cores $cores \\ - --paired \\ - --gzip \\ - $c_r1 \\ - $c_r2 \\ - $tpc_r1 \\ - $tpc_r2 \\ - ${prefix}_1.fastq.gz \\ - ${prefix}_2.fastq.gz - echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt - """ - } -} +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +process TRIMGALORE { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + container "quay.io/biocontainers/trim-galore:0.6.5--0" + //container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.5--0" + + conda (params.conda ? "bioconda::trim-galore=0.6.5" : null) + + input: + tuple val(meta), path(reads) + val options + + output: + tuple val(meta), path("*.fq.gz"), emit: reads + tuple val(meta), path("*.html"), emit: html optional true + tuple val(meta), path("*.zip"), emit: zip optional true + tuple val(meta), path("*report.txt"), emit: log + path "*.version.txt", emit: version + + script: + // Calculate number of --cores for TrimGalore based on value of task.cpus + // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 + // See: https://github.com/nf-core/atacseq/pull/65 + def cores = 1 + if (task.cpus) { + cores = (task.cpus as int) - 4 + if (meta.single_end) cores = (task.cpus as int) - 3 + if (cores < 1) cores = 1 + if (cores > 4) cores = 4 + } + + // Clipping presets have to be evaluated in the context of SE/PE + def c_r1 = params.clip_r1 > 0 ? "--clip_r1 ${params.clip_r1}" : '' + def c_r2 = params.clip_r2 > 0 ? "--clip_r2 ${params.clip_r2}" : '' + def tpc_r1 = params.three_prime_clip_r1 > 0 ? "--three_prime_clip_r1 ${params.three_prime_clip_r1}" : '' + def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' + + // Added soft-links to original fastqs for consistent naming in MultiQC + def software = getSoftwareName(task.process) + def ioptions = initOptions(options) + def prefix = ioptions.suffix ? "${meta.id}${ioptions.suffix}" : "${meta.id}" + if (meta.single_end) { + """ + [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz + trim_galore \\ + $ioptions.args \\ + --cores $cores \\ + --gzip \\ + $c_r1 \\ + $tpc_r1 \\ + ${prefix}.fastq.gz + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt + """ + } else { + """ + [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz + [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz + trim_galore \\ + $ioptions.args \\ + --cores $cores \\ + --paired \\ + --gzip \\ + $c_r1 \\ + $c_r2 \\ + $tpc_r1 \\ + $tpc_r2 \\ + ${prefix}_1.fastq.gz \\ + ${prefix}_2.fastq.gz + echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//' > ${software}.version.txt + """ + } +} diff --git a/modules/nf-core/software/trimgalore/meta.yml b/modules/nf-core/modules/trimgalore/meta.yml similarity index 100% rename from modules/nf-core/software/trimgalore/meta.yml rename to modules/nf-core/modules/trimgalore/meta.yml diff --git a/modules/nf-core/software/picard/markduplicates/functions.nf b/modules/nf-core/software/picard/markduplicates/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/picard/markduplicates/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/picard/mergesamfiles/functions.nf b/modules/nf-core/software/picard/mergesamfiles/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/picard/mergesamfiles/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/samtools/flagstat/functions.nf b/modules/nf-core/software/samtools/flagstat/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/samtools/flagstat/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/samtools/idxstats/functions.nf b/modules/nf-core/software/samtools/idxstats/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/samtools/idxstats/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/samtools/index/functions.nf b/modules/nf-core/software/samtools/index/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/samtools/index/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/samtools/sort/functions.nf b/modules/nf-core/software/samtools/sort/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/samtools/sort/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/samtools/stats/functions.nf b/modules/nf-core/software/samtools/stats/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/samtools/stats/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/trimgalore/functions.nf b/modules/nf-core/software/trimgalore/functions.nf deleted file mode 100644 index 75553cdf5..000000000 --- a/modules/nf-core/software/trimgalore/functions.nf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ----------------------------------------------------- - * Utility functions used in nf-core DSL2 module files - * ----------------------------------------------------- - */ - -/* - * Extract name of software tool from process name using $task.process - */ -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -/* - * Function to initialise default values and to generate a Groovy Map of available options for nf-core modules - */ -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.publish_by_id = args.publish_by_id ?: false - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files ?: null - options.suffix = args.suffix ?: '' - return options -} - -/* - * Tidy up and join elements of a list to return a path string - */ -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -/* - * Function to save/publish module results - */ -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_id) { - path_list.add(args.publish_id) - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/nextflow.config b/nextflow.config index bad267cbc..d102d6385 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,141 +1,195 @@ /* - * ------------------------------------------------- - * nf-core/chipseq Nextflow config file - * ------------------------------------------------- - * Default config options for all environments. - */ +======================================================================================== + nf-core/chipseq Nextflow config file +======================================================================================== + Default config options for all compute environments +---------------------------------------------------------------------------------------- +*/ // Global default params, used in configs params { + // Input options + input = null + seq_center = '' + fragment_size = 200 + fingerprint_bins = 500000 - // Options: Generic - input = './design.csv' - seq_center = '' - fragment_size = 200 - fingerprint_bins = 500000 - - // Options: References - genome = false - save_reference = false - - // Options: Trimming - clip_r1 = 0 - clip_r2 = 0 - three_prime_clip_r1 = 0 - three_prime_clip_r2 = 0 - trim_nextseq = 0 - skip_trimming = false - save_trimmed = false - - // Options: Alignments - bwa_min_score = false - keep_dups = false - keep_multi_map = false - save_align_intermeds = false - - // Options: Peaks - narrow_peak = false - broad_cutoff = 0.1 - macs_fdr = false - macs_pvalue = false - min_reps_consensus = 1 - save_macs_pileup = false - skip_peak_qc = false - skip_peak_annotation = false - skip_consensus_peaks = false - - // Options: Differential analysis - deseq2_vst = false - skip_diff_analysis = false - - // Options: QC - skip_fastqc = false - skip_picard_metrics = false - skip_preseq = false - skip_plot_profile = false - skip_plot_fingerprint = false - skip_spp = false - skip_igv = false - skip_multiqc = false - - // Options: Config - multiqc_config = false - bamtools_filter_pe_config = "$projectDir/assets/bamtools_filter_pe.json" - bamtools_filter_se_config = "$projectDir/assets/bamtools_filter_se.json" - - // Options: Custom config - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_description = false - config_profile_contact = false - config_profile_url = false - - // Options: Other - conda = false - help = false - outdir = './results' - publish_dir_mode = 'copy' - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - max_multiqc_email_size = 25.MB - tracedir = "${params.outdir}/pipeline_info" - email = false - email_on_fail = false - plaintext_email = false - monochrome_logs = false - name = false - hostnames = false - clusterOptions = false - - // Defaults only, expecting to be overwritten - max_memory = 128.GB - max_cpus = 16 - max_time = 240.h + // References + genome = false + save_reference = false + + // Options: Trimming + clip_r1 = 0 + clip_r2 = 0 + three_prime_clip_r1 = 0 + three_prime_clip_r2 = 0 + trim_nextseq = 0 + skip_trimming = false + save_trimmed = false + + // Options: Alignments + bwa_min_score = false + keep_dups = false + keep_multi_map = false + save_align_intermeds = false + + // Options: Peaks + narrow_peak = false + broad_cutoff = 0.1 + macs_fdr = false + macs_pvalue = false + min_reps_consensus = 1 + save_macs_pileup = false + skip_peak_qc = false + skip_peak_annotation = false + skip_consensus_peaks = false + + // Options: Differential analysis + deseq2_vst = false + skip_diff_analysis = false + + // Options: QC + skip_fastqc = false + skip_picard_metrics = false + skip_preseq = false + skip_plot_profile = false + skip_plot_fingerprint = false + skip_spp = false + skip_igv = false + skip_multiqc = false + + // Options: Config + multiqc_config = false + bamtools_filter_pe_config = "$projectDir/assets/bamtools_filter_pe.json" + bamtools_filter_se_config = "$projectDir/assets/bamtools_filter_se.json" + + // Options: Custom config + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_description = false + config_profile_contact = false + config_profile_url = false + + // Boilerplate options + help = false + outdir = './results' + publish_dir_mode = 'copy' + igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_ignore = false + max_multiqc_email_size = 25.MB + tracedir = "${params.outdir}/pipeline_info" + email = false + email_on_fail = false + plaintext_email = false + monochrome_logs = false + // name = false // TODO remove parameter + hostnames = false + validate_params = true + show_hidden_params = false + schema_ignore_params = 'genomes,modules' + enable_conda = false + // TODO substitute conda by enable_conda + conda = false + singularity_pull_docker_container = false + clusterOptions = false // TODO get rid of it (such as in rnaseq 3.1) + + // MultiQC options + multiqc_config = null + multiqc_title = null + max_multiqc_email_size = '25.MB' + + + // Config options + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + hostnames = [:] + config_profile_description = null + config_profile_contact = null + config_profile_url = null + config_profile_name = null + + // Max resource options + // Defaults only, expecting to be overwritten + max_memory = '128.GB' + max_cpus = 16 + max_time = '240.h' } // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev +// TODO some process will be run by default using this image, they should be refactored process.container = 'nfcore/chipseq:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config by default for all pipelines +// Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' // Load nf-core custom profiles from different Institutions try { - includeConfig "${params.custom_config_base}/nfcore_custom.config" + 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") -} - -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 - } - podman { - podman.enabled = true - } - test { includeConfig 'conf/test.config' } - test_full { includeConfig 'conf/test_full.config' } + System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } // Load igenomes.config if required if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + +profiles { + debug { process.beforeScript = 'echo $HOSTNAME' } + conda { + params.enable_conda = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + docker { + docker.enabled = true + docker.userEmulation = true + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + singularity { + singularity.enabled = true + singularity.autoMounts = true + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + podman { + podman.enabled = true + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + shifter { + shifter.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + } + charliecloud { + charliecloud.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + } + test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } } // Increase time available to build conda environment @@ -143,70 +197,71 @@ conda { createTimeout = "60 min" } // 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" + 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.html" + enabled = true + file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" } report { - enabled = true - file = "${params.tracedir}/execution_report.html" + enabled = true + file = "${params.tracedir}/execution_report_${trace_timestamp}.html" } trace { - enabled = true - file = "${params.tracedir}/execution_trace.txt" + enabled = true + file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" } dag { - enabled = true - file = "${params.tracedir}/pipeline_dag.svg" + enabled = true + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" } manifest { - name = 'nf-core/chipseq' - author = 'Philip Ewels' - homePage = 'https://github.com/nf-core/chipseq' - description = 'ChIP-seq peak-calling and differential analysis pipeline.' - mainScript = 'main.nf' - nextflowVersion = '>=20.07.1' - version = '1.3.0dev' + name = 'nf-core/chipseq' + author = 'Philip Ewels' + homePage = 'https://github.com/nf-core/chipseq' + description = 'ChIP-seq peak-calling and differential analysis pipeline.' + mainScript = 'main.nf' + nextflowVersion = '!>=21.04.0' + version = '1.3.0dev' } // 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 + 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 + } } - } } diff --git a/nextflow_schema.json b/nextflow_schema.json index de8f02cbf..1024fcdce 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -16,10 +16,13 @@ "properties": { "input": { "type": "string", + "format": "file-path", + "mimetype": "text/csv", + "pattern": "^\\S+\\.csv$", + "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#introduction).", - "fa_icon": "fas fa-file-csv", - "default": "./design.csv" + "fa_icon": "fas fa-file-csv" }, "fragment_size": { "type": "integer", @@ -44,6 +47,11 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + }, + "multiqc_title": { + "type": "string", + "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", + "fa_icon": "fas fa-file-signature" } } }, @@ -61,6 +69,9 @@ }, "fasta": { "type": "string", + "format": "file-path", + "mimetype": "text/plain", + "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" @@ -82,7 +93,7 @@ "fa_icon": "fas fa-procedures" }, "macs_gsize": { - "type": "string", + "type": "number", "description": "Effective genome size parameter required by MACS2.", "help_text": "[Effective genome size](https://github.com/taoliu/MACS#-g--gsize) parameter required by MACS2. If using an iGenomes reference these have been provided when `--genome` is set as *GRCh37*, *GRCh38*, *GRCm38*, *WBcel235*, *BDGP6*, *R64-1-1*, *EF2*, *hg38*, *hg19* and *mm10*. For other genomes, if this parameter is not specified then the MACS2 peak-calling and differential analysis will be skipped.", "fa_icon": "fas fa-arrows-alt-h" @@ -101,8 +112,9 @@ }, "igenomes_base": { "type": "string", + "format": "directory-path", "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes/", + "default": "s3://ngi-igenomes/igenomes", "fa_icon": "fas fa-cloud-download-alt", "hidden": true }, @@ -356,6 +368,12 @@ "hidden": true, "fa_icon": "fas fa-users-cog" }, + "config_profile_name": { + "type": "string", + "description": "Institutional config name.", + "hidden": true, + "fa_icon": "fas fa-users-cog" + }, "config_profile_description": { "type": "string", "description": "Institutional config description.", @@ -396,6 +414,7 @@ "description": "Maximum amount of memory that can be requested for any single job.", "default": "128.GB", "fa_icon": "fas fa-memory", + "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", "hidden": true, "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" }, @@ -404,6 +423,7 @@ "description": "Maximum amount of time that can be requested for any single job.", "default": "240.h", "fa_icon": "far fa-clock", + "pattern": "^(\\d+\\.?\\s*(s|m|h|day)\\s*)+$", "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" } @@ -445,13 +465,6 @@ ], "hidden": true }, - "name": { - "type": "string", - "description": "Workflow name.", - "fa_icon": "fas fa-address-card", - "help_text": "A custom name for the pipeline run. Unlike the core nextflow `-name` option with one hyphen this parameter can be reused multiple times, for example if using `-resume`. Passed through to steps such as MultiQC and used for things like report filenames and titles.", - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -469,6 +482,7 @@ "max_multiqc_email_size": { "type": "string", "description": "File size limit when attaching MultiQC reports to summary emails.", + "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", "default": "25.MB", "fa_icon": "fas fa-file-upload", "hidden": true @@ -492,16 +506,32 @@ "fa_icon": "fas fa-cogs", "hidden": true }, - "clusterOptions": { - "type": "string", - "description": "Arguments passed to Nextflow clusterOptions.", - "fa_icon": "fas fa-network-wired", + "validate_params": { + "type": "boolean", + "description": "Boolean whether to validate parameters against the schema at runtime", + "default": true, + "fa_icon": "fas fa-check-square", "hidden": true }, - "conda": { + "show_hidden_params": { "type": "boolean", - "description": "Run this workflow with Conda.", - "hidden": true + "fa_icon": "far fa-eye-slash", + "description": "Show all params when using `--help`", + "hidden": true, + "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." + }, + "enable_conda": { + "type": "boolean", + "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", + "hidden": true, + "fa_icon": "fas fa-bacon" + }, + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", + "hidden": true, + "fa_icon": "fas fa-toolbox", + "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } diff --git a/modules/local/subworkflow/bam_clean.nf b/subworkflows/local/bam_clean.nf similarity index 80% rename from modules/local/subworkflow/bam_clean.nf rename to subworkflows/local/bam_clean.nf index e9813fddd..69c74a8ae 100644 --- a/modules/local/subworkflow/bam_clean.nf +++ b/subworkflows/local/bam_clean.nf @@ -1,32 +1,34 @@ -/* - * Filter BAM file - */ - -include { BAM_FILTER } from '../process/bam_filter' -include { BAM_REMOVE_ORPHANS } from '../process/bam_remove_orphans' -include { BAM_SORT_SAMTOOLS } from '../../nf-core/subworkflow/bam_sort_samtools' - -workflow BAM_CLEAN { - take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data - bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data - bam_filter_options // map: options for bam_filter module - bam_remove_orphans_options // map: options for bam_remove_orphans module - samtools_options // map: options for SAMTools modules - - main: - BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config, bam_filter_options) - BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_options) - BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_options) - - emit: - name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] - bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bamtools_version = BAM_FILTER.out.version // path: *.version.txt -} +/* + * Filter BAM file + */ + +// include { BAM_FILTER } from '../process/bam_filter' +// include { BAM_REMOVE_ORPHANS } from '../process/bam_remove_orphans' +include { BAM_FILTER } from '../../modules/local/bam_filter' +include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' +include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' + +workflow BAM_CLEAN { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data + bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data + bam_filter_options // map: options for bam_filter module + bam_remove_orphans_options // map: options for bam_remove_orphans module + samtools_options // map: options for SAMTools modules + + main: + BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config, bam_filter_options) + BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam, bam_remove_orphans_options) + BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam, samtools_options) + + emit: + name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bamtools_version = BAM_FILTER.out.version // path: *.version.txt +} diff --git a/modules/local/process/samplesheet_check.nf b/subworkflows/local/input_check.nf similarity index 53% rename from modules/local/process/samplesheet_check.nf rename to subworkflows/local/input_check.nf index c4057e977..fca645273 100644 --- a/modules/local/process/samplesheet_check.nf +++ b/subworkflows/local/input_check.nf @@ -1,28 +1,28 @@ -// Import generic module functions -include { saveFiles } from './functions' +// +// Check input samplesheet and get read channels +// -/* - * Reformat design file, check validitiy and create IP vs control mappings - */ -process SAMPLESHEET_CHECK { - tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } - - conda (params.conda ? "${baseDir}/environment.yml" : null) +params.options = [:] - input: - path samplesheet - val options +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) - output: - path '*.csv' - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - check_samplesheet.py $samplesheet samplesheet.valid.csv - """ +/* + * Check input samplesheet and get read channels + */ +workflow INPUT_CHECK { + take: + ch_input // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group + samplesheet_check_options // map: options for check_samplesheet module + + main: + SAMPLESHEET_CHECK (ch_input, samplesheet_check_options) + .splitCsv(header:true, sep:',') + .map { get_samplesheet_paths(it, seq_center) } + .set { ch_reads } + + emit: + reads = ch_reads // channel: [ val(meta), [ reads ] ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/modules/nf-core/subworkflow/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf similarity index 83% rename from modules/nf-core/subworkflow/bam_sort_samtools.nf rename to subworkflows/nf-core/bam_sort_samtools.nf index d55b9aad1..4a65e700b 100644 --- a/modules/nf-core/subworkflow/bam_sort_samtools.nf +++ b/subworkflows/nf-core/bam_sort_samtools.nf @@ -1,26 +1,27 @@ -/* - * Sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -include { SAMTOOLS_SORT } from '../software/samtools/sort/main' -include { SAMTOOLS_INDEX } from '../software/samtools/index/main' -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' - -workflow BAM_SORT_SAMTOOLS { - take: - ch_bam // channel: [ val(meta), [ bam ] ] - samtools_options // map: options for SAMTools modules - - main: - SAMTOOLS_SORT(ch_bam, samtools_options) - SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_options) - BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) - - emit: - bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt -} +/* + * Sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +// TODO add addParams +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' + +workflow BAM_SORT_SAMTOOLS { + take: + ch_bam // channel: [ val(meta), [ bam ] ] + samtools_options // map: options for SAMTools modules + + main: + SAMTOOLS_SORT(ch_bam, samtools_options) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam, samtools_options) + BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) + + emit: + bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_SORT.out.version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf similarity index 73% rename from modules/nf-core/subworkflow/bam_stats_samtools.nf rename to subworkflows/nf-core/bam_stats_samtools.nf index 669ae6a54..031990f13 100644 --- a/modules/nf-core/subworkflow/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -1,24 +1,24 @@ -/* - * Run SAMtools stats, flagstat and idxstats - */ - -include { SAMTOOLS_STATS } from '../software/samtools/stats/main' -include { SAMTOOLS_IDXSTATS } from '../software/samtools/idxstats/main' -include { SAMTOOLS_FLAGSTAT } from '../software/samtools/flagstat/main' - -workflow BAM_STATS_SAMTOOLS { - take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - samtools_options // map: options for SAMTools modules - - main: - SAMTOOLS_STATS(ch_bam_bai, samtools_options) - SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_options) - SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_options) - - emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_version = SAMTOOLS_STATS.out.version // path: *.version.txt -} +/* + * Run SAMtools stats, flagstat and idxstats + */ + +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' + +workflow BAM_STATS_SAMTOOLS { + take: + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + samtools_options // map: options for SAMTools modules + + main: + SAMTOOLS_STATS(ch_bam_bai, samtools_options) + SAMTOOLS_FLAGSTAT(ch_bam_bai, samtools_options) + SAMTOOLS_IDXSTATS(ch_bam_bai, samtools_options) + + emit: + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + samtools_version = SAMTOOLS_STATS.out.version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/fastqc_trimgalore.nf b/subworkflows/nf-core/fastqc_trimgalore.nf similarity index 90% rename from modules/nf-core/subworkflow/fastqc_trimgalore.nf rename to subworkflows/nf-core/fastqc_trimgalore.nf index 365d313dc..2ca67dde1 100644 --- a/modules/nf-core/subworkflow/fastqc_trimgalore.nf +++ b/subworkflows/nf-core/fastqc_trimgalore.nf @@ -1,49 +1,49 @@ -/* - * Read QC and trimming - */ - -include { FASTQC } from '../software/fastqc/main' -include { TRIMGALORE } from '../software/trimgalore/main' - -workflow FASTQC_TRIMGALORE { - take: - ch_reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - fastqc_options // map: options for FastQC module - trimgalore_options // map: options for TrimGalore! module - - main: - fastqc_html = Channel.empty() - fastqc_zip = Channel.empty() - fastqc_version = Channel.empty() - if (!skip_fastqc) { - FASTQC(ch_reads, fastqc_options).html.set { fastqc_html } - fastqc_zip = FASTQC.out.zip - fastqc_version = FASTQC.out.version - } - - ch_trim_reads = ch_reads - trim_html = Channel.empty() - trim_zip = Channel.empty() - trim_log = Channel.empty() - trimgalore_version = Channel.empty() - if (!skip_trimming) { - TRIMGALORE(ch_reads, trimgalore_options).reads.set { ch_trim_reads } - trim_html = TRIMGALORE.out.html - trim_zip = TRIMGALORE.out.zip - trim_log = TRIMGALORE.out.log - trimgalore_version = TRIMGALORE.out.version - } - - emit: - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] - fastqc_version // path: *.version.txt - - reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] - trimgalore_version // path: *.version.txt -} +/* + * Read QC and trimming + */ + +include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' +include { TRIMGALORE } from '../../modules/nf-core/modules/trimgalore/main' + +workflow FASTQC_TRIMGALORE { + take: + ch_reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + fastqc_options // map: options for FastQC module + trimgalore_options // map: options for TrimGalore! module + + main: + fastqc_html = Channel.empty() + fastqc_zip = Channel.empty() + fastqc_version = Channel.empty() + if (!skip_fastqc) { + FASTQC(ch_reads, fastqc_options).html.set { fastqc_html } + fastqc_zip = FASTQC.out.zip + fastqc_version = FASTQC.out.version + } + + ch_trim_reads = ch_reads + trim_html = Channel.empty() + trim_zip = Channel.empty() + trim_log = Channel.empty() + trimgalore_version = Channel.empty() + if (!skip_trimming) { + TRIMGALORE(ch_reads, trimgalore_options).reads.set { ch_trim_reads } + trim_html = TRIMGALORE.out.html + trim_zip = TRIMGALORE.out.zip + trim_log = TRIMGALORE.out.log + trimgalore_version = TRIMGALORE.out.version + } + + emit: + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] + fastqc_version // path: *.version.txt + + reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] + trimgalore_version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/map_bwa_mem.nf b/subworkflows/nf-core/map_bwa_mem.nf similarity index 93% rename from modules/nf-core/subworkflow/map_bwa_mem.nf rename to subworkflows/nf-core/map_bwa_mem.nf index f46077e4b..79fdbd6bc 100644 --- a/modules/nf-core/subworkflow/map_bwa_mem.nf +++ b/subworkflows/nf-core/map_bwa_mem.nf @@ -1,28 +1,28 @@ -/* - * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -include { BWA_MEM } from '../software/bwa/mem/main' -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' - -workflow MAP_BWA_MEM { - take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index - ch_fasta // path: /path/to/genome.fasta - bwa_mem_options // map: options for BWA MEM module - samtools_options // map: options for SAMTools modules - - main: - BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_options) - BAM_SORT_SAMTOOLS(BWA_MEM.out.bam, samtools_options) - - emit: - bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bwa_version = BWA_MEM.out.version // path: *.version.txt - samtools_version = BAM_SORT_SAMTOOLS.out.samtools_version // path: *.version.txt -} +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow MAP_BWA_MEM { + take: + ch_reads // channel: [ val(meta), [ reads ] ] + ch_index // path: /path/to/index + ch_fasta // path: /path/to/genome.fasta + bwa_mem_options // map: options for BWA MEM module + samtools_options // map: options for SAMTools modules + + main: + BWA_MEM(ch_reads, ch_index, ch_fasta, bwa_mem_options) + BAM_SORT_SAMTOOLS(BWA_MEM.out.bam, samtools_options) + + emit: + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + bwa_version = BWA_MEM.out.version // path: *.version.txt + samtools_version = BAM_SORT_SAMTOOLS.out.samtools_version // path: *.version.txt +} diff --git a/modules/nf-core/subworkflow/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf similarity index 88% rename from modules/nf-core/subworkflow/mark_duplicates_picard.nf rename to subworkflows/nf-core/mark_duplicates_picard.nf index f147831f5..a8ba9bed4 100644 --- a/modules/nf-core/subworkflow/mark_duplicates_picard.nf +++ b/subworkflows/nf-core/mark_duplicates_picard.nf @@ -1,29 +1,29 @@ -/* - * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -include { PICARD_MARKDUPLICATES } from '../software/picard/markduplicates/main' -include { SAMTOOLS_INDEX } from '../software/samtools/index/main' -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' - -workflow MARK_DUPLICATES_PICARD { - take: - ch_bam // channel: [ val(meta), [ bam ] ] - markduplicates_options // map: options for picard MarkDuplicates module - samtools_options // map: options for SAMTools modules - - main: - PICARD_MARKDUPLICATES(ch_bam, markduplicates_options) - SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_options) - BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) - - emit: - bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] - metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt - samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt -} +/* + * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' + +workflow MARK_DUPLICATES_PICARD { + take: + ch_bam // channel: [ val(meta), [ bam ] ] + markduplicates_options // map: options for picard MarkDuplicates module + samtools_options // map: options for SAMTools modules + + main: + PICARD_MARKDUPLICATES(ch_bam, markduplicates_options) + SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam, samtools_options) + BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), samtools_options) + + emit: + bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] + metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + picard_version = PICARD_MARKDUPLICATES.out.version // path: *.version.txt + samtools_version = SAMTOOLS_INDEX.out.version // path: *.version.txt +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf new file mode 100644 index 000000000..aed9dcaf2 --- /dev/null +++ b/workflows/chipseq.nf @@ -0,0 +1,628 @@ +/* +======================================================================================== + VALIDATE INPUTS +======================================================================================== +*/ + +def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) + +// Validate input parameters +WorkflowChipseq.initialise(params, log) + +// Check input path parameters to see if they exist +def checkPathParamList = [ + params.input, params.multiqc_config, + params.fasta, + params.gtf, params.gene_bed, + params.bwa_index, + params.blacklist, + params.bamtools_filter_pe_config, params.bamtools_filter_se_config +] + +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!' } + +// Check fasta reference file +if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } else { exit 1, 'Fasta file not specified!' } + +// Check gtf annotation file +if (params.gtf) { ch_gtf = file(params.gtf, checkIfExists: true) } else { exit 1, 'GTF annotation file not specified!' } + +// Check bed annotation file +if (params.gene_bed) { ch_gene_bed = file(params.gene_bed, checkIfExists: true) } + +// Check bed blacklist file +if (params.blacklist) { + ch_blacklist = Channel.fromPath(params.blacklist, checkIfExists: true) +} else { + ch_blacklist = Channel.empty() +} + +// Save AWS IGenomes file containing annotation version +def anno_readme = params.genomes[ params.genome ]?.readme +if (anno_readme && file(anno_readme).exists()) { + file("${params.outdir}/genome/").mkdirs() + file(anno_readme).copyTo("${params.outdir}/genome/") +} + +// If --gtf is supplied along with --genome +// Make gene bed from supplied --gtf instead of using iGenomes one automatically +def makeBED = false +if (!params.gene_bed) { + makeBED = true +} else if (params.genome && params.gtf) { + if (params.genomes[ params.genome ].gtf != params.gtf) { + makeBED = true + } +} + +/* +======================================================================================== + CONFIG FILES +======================================================================================== +*/ + +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +ch_output_docs = file("$projectDir/docs/output.md", checkIfExists: true) +ch_output_docs_images = file("$projectDir/docs/images/", checkIfExists: true) + +// JSON files required by BAMTools for alignment filtering +ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) +ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) + +// Header files for MultiQC +ch_spp_nsc_header = file("$projectDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) +ch_spp_rsc_header = file("$projectDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) +ch_spp_correlation_header = file("$projectDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) +ch_peak_count_header = file("$projectDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) +ch_frip_score_header = file("$projectDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) +ch_peak_annotation_header = file("$projectDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) +ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) +ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + +/* +======================================================================================== + IMPORT LOCAL MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +// Don't overwrite global params.modules, create a copy instead and use that within the main script. +def modules = params.modules.clone() + +// +// MODULE: Local to the pipeline +// +include { GTF2BED } from '../modules/local/gtf2bed' +include { GET_CHROM_SIZES } from '../modules/local/get_chrom_sizes' +include { MAKE_GENOME_FILTER } from '../modules/local/make_genome_filter' +include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' +include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' +include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' +include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' +include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' +include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' +include { FRIP_SCORE } from '../modules/local/frip_score' +//include { DESEQ2_FEATURECOUNTS } from '../modules/local/deseq2_featurecounts' +include { IGV } from '../modules/local/igv' +include { OUTPUT_DOCUMENTATION } from '../modules/local/output_documentation' +include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' //HERE +// TODO template version below to be removed +// include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) +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' addParams( options: [:] ) +include { BAM_CLEAN } from '../subworkflows/local/bam_clean' addParams( options: [:] ) + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +def multiqc_options = modules['multiqc'] +multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' + +// +// MODULE: Installed directly from nf-core/modules +// +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) +// include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) // TODO review +include { BWA_INDEX } from '../modules/nf-core/modules/bwa/index/main' +include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' +include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' +include { PRESEQ_LCEXTRAP } from '../modules/nf-core/software/preseq/lcextrap/main' +include { UCSC_BEDRAPHTOBIGWIG } from '../modules/nf-core/software/ucsc/bedgraphtobigwig/main' +include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/software/deeptools/computematrix/main' +include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/software/deeptools/plotprofile/main' +include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/software/deeptools/plotheatmap/main' +include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/software/deeptools/plotfingerprint/main' +include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/software/phantompeakqualtools/main' +include { MACS2_CALLPEAK } from '../modules/nf-core/software/macs2/callpeak/main' +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 + HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/software/homer/annotatepeaks/main' +include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/software/subread/featurecounts/main' + +// TODO place correctly the local subworflows +include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' +include { MAP_BWA_MEM } from '../subworkflows/nf-core/map_bwa_mem' +include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' + +/* +======================================================================================== + RUN MAIN WORKFLOW +======================================================================================== +*/ + +// Info required for completion email and summary +def multiqc_report = [] + +workflow CHIPSEQ { + + ch_software_versions = Channel.empty() + + // + // SUBWORKFLOW: Read in samplesheet, validate and stage input files + // + INPUT_CHECK ( + ch_input, + params.seq_center, + [:] + ) + + // + // MODULE: Run FastQC + // + // TODO check if this fastqc process from nf-core is needed Don't think so done in FASTQC_TRIMGALORE + // FASTQC ( + // INPUT_CHECK.out.reads + // ) + // ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + + // + // SUBWORKFLOW: Prepare genome files + // + ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta, params.modules['bwa_index'] ).index + + if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf, [:] ) } + + MAKE_GENOME_FILTER ( + GET_CHROM_SIZES ( ch_fasta, [:] ).sizes, + ch_blacklist.ifEmpty([]), + [:] + ) + ch_software_versions = Channel.empty() + ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.version.first().ifEmpty(null)) + + // + // SUBWORKFLOW: Read QC & trimming + // + nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' + params.modules['trimgalore'].args += nextseq + FASTQC_TRIMGALORE ( + INPUT_CHECK.out.reads, + params.skip_fastqc, + params.skip_trimming, + params.modules['fastqc'], + params.modules['trimgalore'] + ) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) + + // + // SUBWORKFLOW: Map reads & BAM QC + // + score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + params.modules['bwa_mem'].args += score + MAP_BWA_MEM ( + FASTQC_TRIMGALORE.out.reads, + ch_index, + ch_fasta, + params.modules['bwa_mem'], + params.modules['samtools_sort_lib'] + ) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_version.first()) + ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_version.first().ifEmpty(null)) + + // + // SUBWORKFLOW: Merge resequenced BAM files + // + MAP_BWA_MEM + .out + .bam + .map { + meta, bam -> + fmeta = meta.findAll { it.key != 'read_group' } + fmeta.id = fmeta.id.split('_')[0..-2].join('_') + [ fmeta, bam ] } + .groupTuple(by: [0]) + .map { it -> [ it[0], it[1].flatten() ] } + .set { ch_sort_bam } + + PICARD_MERGESAMFILES ( + ch_sort_bam, + params.modules['picard_mergesamfiles'] + ) + ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.version.first().ifEmpty(null)) + + // + // SUBWORKFLOW: Mark duplicates & filter BAM files + // + MARK_DUPLICATES_PICARD ( + PICARD_MERGESAMFILES.out.bam, + params.modules['picard_markduplicates'], + params.modules['samtools_sort_merged_lib'] + ) + + // + // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE + // + BAM_CLEAN ( + MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), + MAKE_GENOME_FILTER.out.bed.collect(), + ch_bamtools_filter_se_config, + ch_bamtools_filter_pe_config, + params.modules['bam_filter'], + params.modules['bam_remove_orphans'], + params.modules['samtools_sort_filter'] + ) + ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) + + // + // MODULE: Post alignment QC + // + PICARD_COLLECTMULTIPLEMETRICS ( + BAM_CLEAN.out.bam, + ch_fasta, + params.modules['picard_collectmultiplemetrics'] + ) + + // + // MODULE: Library coverage + // + PRESEQ_LCEXTRAP ( + BAM_CLEAN.out.bam, + params.modules['preseq_lcextrap'] + ) + ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.version.first().ifEmpty(null)) + + // + // MODULE: Strand cross-correlation + // + PHANTOMPEAKQUALTOOLS ( + BAM_CLEAN.out.bam, + params.modules['phantompeakqualtools'] + ) + ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.version.first().ifEmpty(null)) + + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + ch_spp_nsc_header, + ch_spp_rsc_header, + ch_spp_correlation_header, + params.modules['multiqc_custom_phantompeakqualtools'] + ) + + // + // MODULE: Coverage tracks + // + BEDTOOLS_GENOMECOV ( + BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]), + params.modules['bedtools_genomecov'] + ) + + // + // MODULE: Coverage tracks + // + UCSC_BEDRAPHTOBIGWIG ( + BEDTOOLS_GENOMECOV.out.bedgraph, + GET_CHROM_SIZES.out.sizes, + params.modules['ucsc_bedgraphtobigwig'] + ) + ch_software_versions = ch_software_versions.mix(UCSC_BEDRAPHTOBIGWIG.out.version.first().ifEmpty(null)) + + // + // MODULE: Coverage plots + // + DEEPTOOLS_COMPUTEMATRIX ( + UCSC_BEDRAPHTOBIGWIG.out.bigwig, + ch_gene_bed, + params.modules['deeptools_computematrix'] + ) + ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.version.first().ifEmpty(null)) + + DEEPTOOLS_PLOTPROFILE ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotprofile'] + ) + + DEEPTOOLS_PLOTHEATMAP ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix, + params.modules['deeptools_plotheatmap'] + ) + + // + // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // + BAM_CLEAN + .out + .bam + .join ( BAM_CLEAN.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } + .set { ch_control_bam_bai } + + BAM_CLEAN + .out + .bam + .join ( BAM_CLEAN.out.bai, by: [0] ) + .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } + .combine(ch_control_bam_bai, by: 0) + .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + .set { ch_ip_control_bam_bai } + + // + // plotFingerprint for IP and control together + // + params.modules['deeptools_plotfingerprint'].args += " --numberOfSamples $params.fingerprint_bins" + DEEPTOOLS_PLOTFINGERPRINT ( + ch_ip_control_bam_bai, + params.modules['deeptools_plotfingerprint'] + ) + + peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + if (params.macs_gsize) { + + // + // Call peaks + // + broad = params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}" + pileup = params.save_macs_pileup ? '--bdg --SPMR' : '' + fdr = params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '' + pvalue = params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + params.modules['macs2_callpeak'].publish_dir += "/$peakType" + params.modules['macs2_callpeak'].args += " $broad $pileup $fdr $pvalue" + + // Create channel: [ val(meta), ip_bam, control_bam ] + ch_ip_control_bam_bai + .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + .set { ch_ip_control_bam } + + MACS2_CALLPEAK ( + ch_ip_control_bam, + params.macs_gsize, + params.modules['macs2_callpeak'] + ) + ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.version.first().ifEmpty(null)) + + ch_ip_control_bam + .join(MACS2_CALLPEAK.out.peak, by: [0]) + .map { it -> [ it[0], it[1], it[3] ] } + .set { ch_ip_peak } + FRIP_SCORE ( + ch_ip_peak, + params.modules['frip_score'] + ) + + ch_ip_peak + .join(FRIP_SCORE.out.txt, by: [0]) + .map { it -> [ it[0], it[2], it[3] ] } + .set { ch_ip_peak_frip } + MULTIQC_CUSTOM_PEAKS ( + ch_ip_peak_frip, + ch_peak_count_header, + ch_frip_score_header, + params.modules['multiqc_custom_peaks'] + ) + + params.modules['plot_macs2_qc'].publish_dir += "/$peakType/qc" + PLOT_MACS2_QC ( + MACS2_CALLPEAK.out.peak.collect{it[1]}, + params.modules['plot_macs2_qc'] + ) + + params.modules['homer_annotatepeaks_macs2'].publish_dir += "/$peakType" + HOMER_ANNOTATEPEAKS_MACS2 ( + MACS2_CALLPEAK.out.peak, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_macs2'] + ) + ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.version.first().ifEmpty(null)) + + params.modules['plot_homer_annotatepeaks'].publish_dir += "/$peakType/qc" + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt", + params.modules['plot_homer_annotatepeaks'] + ) + + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + MACS2_CALLPEAK + .out + .peak + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + params.modules['macs2_consensus'].publish_dir += "/$peakType/consensus" + MACS2_CONSENSUS ( + ch_antibody_peaks, + params.modules['macs2_consensus'] + ) + + params.modules['homer_annotatepeaks_consensus'].publish_dir += "/$peakType/consensus" + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, + ch_fasta, + ch_gtf, + params.modules['homer_annotatepeaks_consensus'] + ) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .combine(ch_ip_saf) + .map { + it -> + fmeta = it[1] + fmeta['replicates_exist'] = it[4]['replicates_exist'] + fmeta['multiple_groups'] = it[4]['multiple_groups'] + [ fmeta, it[2], it[5] ] } + .set { ch_ip_bam } + + params.modules['subread_featurecounts'].publish_dir += "/$peakType/consensus" + SUBREAD_FEATURECOUNTS ( + ch_ip_bam, + params.modules['subread_featurecounts'] + ) + ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.version.first().ifEmpty(null)) + + // + // DESEQ2_FEATURECOUNTS ( + // params.modules['deseq2_featurecounts'] + // ) + // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + + } + + // + // Create IGV session + // + IGV ( + ch_fasta, + UCSC_BEDRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + params.modules['ucsc_bedgraphtobigwig'], + params.modules['macs2_callpeak'], + params.modules['macs2_consensus'], + [:] + ) + + // + // MODULE: Pipeline reporting + // + ch_software_versions + .map { it -> if (it) [ it.baseName, it ] } + .groupTuple() + .map { it[1][0] } + .flatten() + .collect() + .set { ch_software_versions } + + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect() //, + // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick + ) + + OUTPUT_DOCUMENTATION ( + ch_output_docs, + ch_output_docs_images, + [:] + ) + + // + // MODULE: MultiQC + // + // ch_multiqc_files = Channel.empty() + // ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + // ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + + if (!params.skip_multiqc) { + workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) + ch_workflow_summary = Channel.value(workflow_summary) + // params.modules['multiqc'].publish_dir += "/$peakType" // TODO place this in template 2.1 version + + MULTIQC ( + ch_multiqc_config, + ch_multiqc_custom_config.collect().ifEmpty([]), + GET_SOFTWARE_VERSIONS.out.yaml.collect(), + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + + FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + + MAP_BWA_MEM.out.stats.collect{it[1]}, + MAP_BWA_MEM.out.flagstat.collect{it[1]}, + MAP_BWA_MEM.out.idxstats.collect{it[1]}, + + MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + + BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), + BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), + PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + + PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), + + MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), + PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + + params.modules['multiqc'] // TODO check if needed, addParams should do it, now is declare as input + ) + 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) +} + +/* +======================================================================================== + THE END +======================================================================================== +*/ From d537fe8cee93992095b4968207cbe6a0ff9f9af4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 9 Sep 2021 18:13:11 +0200 Subject: [PATCH 175/538] Fix lint --- .editorconfig | 3 + CHANGELOG.md | 16 +-- CITATIONS.md | 49 ++++----- assets/bamtools_filter_pe.json | 6 +- assets/bamtools_filter_se.json | 2 +- bin/featurecounts_deseq2.r | 16 +-- bin/gtf2bed | 126 +++++++++++----------- bin/markdown_to_html.py | 32 +++--- bin/plot_homer_annotatepeaks.r | 76 ++++++------- bin/plot_macs2_qc.r | 52 ++++----- docs/output.md | 108 +++++++++---------- lib/Schema.groovy | 24 ++--- lib/WorkflowChipseq.groovy | 8 +- modules/local/plot_homer_annotatepeaks.nf | 2 +- workflows/chipseq.nf | 19 ++-- 15 files changed, 273 insertions(+), 266 deletions(-) diff --git a/.editorconfig b/.editorconfig index 95549501a..57d9144e8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -25,3 +25,6 @@ indent_size = unset [/assets/email*] indent_size = unset + +[/assets/blacklists/GRCh37-blacklist.bed] +trim_trailing_whitespace = unset diff --git a/CHANGELOG.md b/CHANGELOG.md index fd40908b0..822cb4966 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,14 +52,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Replace `set` with `tuple` and `file()` with `path()` in all processes * Capitalise process names * Parameters: - * `--bwa_min_score` to set minimum alignment score for BWA MEM - * `--macs_fdr` to provide FDR threshold for MACS2 peak calling - * `--macs_pvalue` to provide p-value threshold for MACS2 peak calling - * `--skip_peak_qc` to skip MACS2 peak QC plot generation - * `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER - * `--skip_consensus_peaks` to skip consensus peak generation - * `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 - * `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) + * `--bwa_min_score` to set minimum alignment score for BWA MEM + * `--macs_fdr` to provide FDR threshold for MACS2 peak calling + * `--macs_pvalue` to provide p-value threshold for MACS2 peak calling + * `--skip_peak_qc` to skip MACS2 peak QC plot generation + * `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER + * `--skip_consensus_peaks` to skip consensus peak generation + * `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 + * `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) ### `Removed` diff --git a/CITATIONS.md b/CITATIONS.md index bae3ea84f..53fa3bd24 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,4 +1,5 @@ # nf-core/chipseq: Citations + ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) > Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. @@ -9,40 +10,40 @@ ## Pipeline tools * [BWA](https://www.ncbi.nlm.nih.gov/pubmed/19451168/) - > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. + > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. * [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) - > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. + > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. * [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) - > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. * [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) - > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. + > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. * [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) - > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. * [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) - > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. + > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. * [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) - > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. + > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. * [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) - > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. + > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. * [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) - > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. + > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. * [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) - > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. + > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. * [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) - > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. + > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. * [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) @@ -55,40 +56,40 @@ ## R packages * [R](https://www.R-project.org/) - > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. + > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. * [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) - > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. + > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. * [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) - > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). + > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). * [UpSetR](https://CRAN.R-project.org/package=UpSetR) - > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. + > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. * [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) - > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. + > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. * [reshape2](http://www.jstatsoft.org/v21/i12/) - > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. + > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. * [scales](https://CRAN.R-project.org/package=scales) - > Hadley Wickham (2018). scales: Scale Functions for Visualization. + > Hadley Wickham (2018). scales: Scale Functions for Visualization. * [pheatmap](https://CRAN.R-project.org/package=pheatmap) - > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. + > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. * [lattice](https://cran.r-project.org/web/packages/lattice/index.html) - > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. + > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. * [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) - > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. + > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. * [optparse](https://CRAN.R-project.org/package=optparse) - > Trevor L Davis (2018). optparse: Command Line Option Parser. + > Trevor L Davis (2018). optparse: Command Line Option Parser. * [xfun](https://CRAN.R-project.org/package=xfun) - > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. + > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. ## Software packaging/containerisation tools diff --git a/assets/bamtools_filter_pe.json b/assets/bamtools_filter_pe.json index 323c186c0..b69b41ba5 100755 --- a/assets/bamtools_filter_pe.json +++ b/assets/bamtools_filter_pe.json @@ -1,15 +1,15 @@ { "filters" : [ { "id" : "insert_min", - "insertSize" : ">=-2000" + "insertSize" : ">=-2000" }, { "id" : "insert_max", - "insertSize" : "<=2000" + "insertSize" : "<=2000" }, { "id" : "mismatch", - "tag" : "NM:<=4" + "tag" : "NM:<=4" } ], diff --git a/assets/bamtools_filter_se.json b/assets/bamtools_filter_se.json index 0b21d3e97..f62800e7f 100755 --- a/assets/bamtools_filter_se.json +++ b/assets/bamtools_filter_se.json @@ -1,7 +1,7 @@ { "filters" : [ { "id" : "mismatch", - "tag" : "NM:<=4" + "tag" : "NM:<=4" } ], diff --git a/bin/featurecounts_deseq2.r b/bin/featurecounts_deseq2.r index b75335a5b..32ba77dc7 100755 --- a/bin/featurecounts_deseq2.r +++ b/bin/featurecounts_deseq2.r @@ -116,9 +116,9 @@ if (file.exists(PlotFile) == FALSE) { xlab(paste0("PC1: ",percentVar[1],"% variance")) + ylab(paste0("PC2: ",percentVar[2],"% variance")) + theme(panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - panel.background = element_blank(), - panel.border = element_rect(colour = "black", fill=NA, size=1)) + panel.grid.minor = element_blank(), + panel.background = element_blank(), + panel.border = element_rect(colour = "black", fill=NA, size=1)) print(plot) ## WRITE PC1 vs PC2 VALUES TO FILE @@ -262,11 +262,11 @@ if (file.exists(ResultsFile) == FALSE) { clabels <- sapply(combs,function(x){paste(x,collapse=' & ')}) plotdat <- data.frame(x=unlist(lapply(combs, function(x){rld.subset[, x[1] ]})),y=unlist(lapply(combs, function(y){rld.subset[, y[2] ]})),comp=rep(clabels, each=nrow(rld.subset))) plot <- xyplot(y~x|comp,plotdat, - panel=function(...){ - panel.xyplot(...) - panel.abline(0,1,col="red") - }, - par.strip.text=list(cex=0.5)) + panel=function(...){ + panel.xyplot(...) + panel.abline(0,1,col="red") + }, + par.strip.text=list(cex=0.5)) print(plot) dev.off() diff --git a/bin/gtf2bed b/bin/gtf2bed index e6904926d..66d523067 100755 --- a/bin/gtf2bed +++ b/bin/gtf2bed @@ -33,90 +33,90 @@ my $in_cmd =($in =~ /\.gz$/ ? "gunzip -c $in|" : $in =~ /\.zip$/ ? "unzip -p $in open IN, $in_cmd; while () { - $gff = 2 if /^##gff-version 2/; - $gff = 3 if /^##gff-version 3/; - next if /^#/ && $gff; - - s/\s+$//; - # 0-chr 1-src 2-feat 3-beg 4-end 5-scor 6-dir 7-fram 8-attr - my @f = split /\t/; - if ($gff) { + $gff = 2 if /^##gff-version 2/; + $gff = 3 if /^##gff-version 3/; + next if /^#/ && $gff; + + s/\s+$//; + # 0-chr 1-src 2-feat 3-beg 4-end 5-scor 6-dir 7-fram 8-attr + my @f = split /\t/; + if ($gff) { # most ver 2's stick gene names in the id field - ($id) = $f[8]=~ /\bID="([^"]+)"/; + ($id) = $f[8]=~ /\bID="([^"]+)"/; # most ver 3's stick unquoted names in the name field - ($id) = $f[8]=~ /\bName=([^";]+)/ if !$id && $gff == 3; - } else { - ($id) = $f[8]=~ /transcript_id "([^"]+)"/; - } + ($id) = $f[8]=~ /\bName=([^";]+)/ if !$id && $gff == 3; + } else { + ($id) = $f[8]=~ /transcript_id "([^"]+)"/; + } - next unless $id && $f[0]; + next unless $id && $f[0]; - if ($f[2] eq 'exon') { - die "no position at exon on line $." if ! $f[3]; + if ($f[2] eq 'exon') { + die "no position at exon on line $." if ! $f[3]; # gff3 puts :\d in exons sometimes $id =~ s/:\d+$// if $gff == 3; - push @{$exons{$id}}, \@f; - # save lowest start - $trans{$id} = \@f if !$trans{$id}; - } elsif ($f[2] eq 'start_codon') { - #optional, output codon start/stop as "thick" region in bed - $sc{$id}->[0] = $f[3]; - } elsif ($f[2] eq 'stop_codon') { - $sc{$id}->[1] = $f[4]; - } elsif ($f[2] eq 'miRNA' ) { - $trans{$id} = \@f if !$trans{$id}; - push @{$exons{$id}}, \@f; - } + push @{$exons{$id}}, \@f; + # save lowest start + $trans{$id} = \@f if !$trans{$id}; + } elsif ($f[2] eq 'start_codon') { + #optional, output codon start/stop as "thick" region in bed + $sc{$id}->[0] = $f[3]; + } elsif ($f[2] eq 'stop_codon') { + $sc{$id}->[1] = $f[4]; + } elsif ($f[2] eq 'miRNA' ) { + $trans{$id} = \@f if !$trans{$id}; + push @{$exons{$id}}, \@f; + } } for $id ( - # sort by chr then pos - sort { - $trans{$a}->[0] eq $trans{$b}->[0] ? - $trans{$a}->[3] <=> $trans{$b}->[3] : - $trans{$a}->[0] cmp $trans{$b}->[0] - } (keys(%trans)) ) { - my ($chr, undef, undef, undef, undef, undef, $dir, undef, $attr, undef, $cds, $cde) = @{$trans{$id}}; + # sort by chr then pos + sort { + $trans{$a}->[0] eq $trans{$b}->[0] ? + $trans{$a}->[3] <=> $trans{$b}->[3] : + $trans{$a}->[0] cmp $trans{$b}->[0] + } (keys(%trans)) ) { + my ($chr, undef, undef, undef, undef, undef, $dir, undef, $attr, undef, $cds, $cde) = @{$trans{$id}}; my ($cds, $cde); ($cds, $cde) = @{$sc{$id}} if $sc{$id}; - # sort by pos - my @ex = sort { - $a->[3] <=> $b->[3] - } @{$exons{$id}}; - - my $beg = $ex[0][3]; - my $end = $ex[-1][4]; - - if ($dir eq '-') { - # swap - $tmp=$cds; - $cds=$cde; - $cde=$tmp; - $cds -= 2 if $cds; - $cde += 2 if $cde; - } + # sort by pos + my @ex = sort { + $a->[3] <=> $b->[3] + } @{$exons{$id}}; + + my $beg = $ex[0][3]; + my $end = $ex[-1][4]; + + if ($dir eq '-') { + # swap + $tmp=$cds; + $cds=$cde; + $cde=$tmp; + $cds -= 2 if $cds; + $cde += 2 if $cde; + } - # not specified, just use exons - $cds = $beg if !$cds; - $cde = $end if !$cde; + # not specified, just use exons + $cds = $beg if !$cds; + $cde = $end if !$cde; - # adjust start for bed - --$beg; --$cds; + # adjust start for bed + --$beg; --$cds; - my $exn = @ex; # exon count - my $exst = join ",", map {$_->[3]-$beg-1} @ex; # exon start - my $exsz = join ",", map {$_->[4]-$_->[3]+1} @ex; # exon size + my $exn = @ex; # exon count + my $exst = join ",", map {$_->[3]-$beg-1} @ex; # exon start + my $exsz = join ",", map {$_->[4]-$_->[3]+1} @ex; # exon size my $gene_id; my $extend = ""; if ($extended) { - ($gene_id) = $attr =~ /gene_name "([^"]+)"/; - ($gene_id) = $attr =~ /gene_id "([^"]+)"/ unless $gene_id; + ($gene_id) = $attr =~ /gene_name "([^"]+)"/; + ($gene_id) = $attr =~ /gene_id "([^"]+)"/ unless $gene_id; $extend="\t$gene_id"; } - # added an extra comma to make it look exactly like ucsc's beds - print "$chr\t$beg\t$end\t$id\t0\t$dir\t$cds\t$cde\t0\t$exn\t$exsz,\t$exst,$extend\n"; + # added an extra comma to make it look exactly like ucsc's beds + print "$chr\t$beg\t$end\t$id\t0\t$dir\t$cds\t$cde\t0\t$exn\t$exsz,\t$exst,$extend\n"; } diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py index a26d1ff5e..1187b2720 100755 --- a/bin/markdown_to_html.py +++ b/bin/markdown_to_html.py @@ -27,33 +27,33 @@ def wrap_html(contents): + + + + + + + + + ''' + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f'''\\ + + + + + + ''' + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + module_versions = {} + module_versions["${getProcessName(task.process)}"] = { + 'python': platform.python_version(), + 'yaml': yaml.__version__ + } + + with open("$versions") as f: + workflow_versions = yaml.safe_load(f) | module_versions + + workflow_versions["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version" + } + + versions_mqc = { + 'id': 'software_versions', + 'section_name': '${workflow.manifest.name} Software Versions', + 'section_href': 'https://github.com/${workflow.manifest.name}', + 'plot_type': 'html', + 'description': 'are collected at run time from the software output.', + 'data': _make_versions_html(workflow_versions) + } + + with open("software_versions.yml", 'w') as f: + yaml.dump(workflow_versions, f, default_flow_style=False) + with open("software_versions_mqc.yml", 'w') as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open('versions.yml', 'w') as f: + yaml.dump(module_versions, f, default_flow_style=False) + """ +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 000000000..8d4a6ed42 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,33 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" diff --git a/subworkflows/local/bam_clean.nf b/subworkflows/local/bam_clean.nf index 68e35a63b..d53912588 100644 --- a/subworkflows/local/bam_clean.nf +++ b/subworkflows/local/bam_clean.nf @@ -19,16 +19,24 @@ workflow BAM_CLEAN { bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data main: + + ch_versions = Channel.empty() + BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config) BAM_REMOVE_ORPHANS(BAM_FILTER.out.bam) BAM_SORT_SAMTOOLS(BAM_REMOVE_ORPHANS.out.bam) + ch_versions = ch_versions.mix(BAM_FILTER.out.versions, + BAM_REMOVE_ORPHANS.out.versions, + BAM_SORT_SAMTOOLS.out.versions) + emit: - name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] - bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bamtools_version = BAM_FILTER.out.version // path: versions.yml + name_bam = BAM_REMOVE_ORPHANS.out.bam // channel: [ val(meta), [ bam ] ] + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf index c524ac321..e7652259a 100644 --- a/subworkflows/nf-core/bam_sort_samtools.nf +++ b/subworkflows/nf-core/bam_sort_samtools.nf @@ -15,15 +15,23 @@ workflow BAM_SORT_SAMTOOLS { ch_bam // channel: [ val(meta), [ bam ] ] main: + + ch_versions = Channel.empty() + SAMTOOLS_SORT(ch_bam) SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam) BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first(), + SAMTOOLS_INDEX.out.versions.first(), + BAM_STATS_SAMTOOLS.out.versions) + emit: bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_versions = SAMTOOLS_SORT.out.versions // path: versions.yml + + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 919ab5b24..013ffac9e 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -13,13 +13,21 @@ workflow BAM_STATS_SAMTOOLS { ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] main: + + ch_versions = Channel.empty() + SAMTOOLS_STATS(ch_bam_bai) SAMTOOLS_FLAGSTAT(ch_bam_bai) SAMTOOLS_IDXSTATS(ch_bam_bai) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first(), + SAMTOOLS_FLAGSTAT.out.versions.first(), + SAMTOOLS_IDXSTATS.out.versions.first()) + emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - samtools_versions = SAMTOOLS_STATS.out.versions // path: versions.yml + + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/fastqc_trimgalore.nf b/subworkflows/nf-core/fastqc_trimgalore.nf index 2cb1cc7eb..0636f0a55 100644 --- a/subworkflows/nf-core/fastqc_trimgalore.nf +++ b/subworkflows/nf-core/fastqc_trimgalore.nf @@ -16,36 +16,37 @@ workflow FASTQC_TRIMGALORE { skip_trimming // boolean: true/false main: - fastqc_html = Channel.empty() - fastqc_zip = Channel.empty() - fastqc_version = Channel.empty() + + ch_versions = Channel.empty() + fastqc_html = Channel.empty() + fastqc_zip = Channel.empty() if (!skip_fastqc) { FASTQC(ch_reads).html.set { fastqc_html } fastqc_zip = FASTQC.out.zip - fastqc_versions = FASTQC.out.versions } - ch_trim_reads = ch_reads - trim_html = Channel.empty() - trim_zip = Channel.empty() - trim_log = Channel.empty() - trimgalore_version = Channel.empty() + ch_trim_reads = ch_reads + trim_html = Channel.empty() + trim_zip = Channel.empty() + trim_log = Channel.empty() if (!skip_trimming) { TRIMGALORE(ch_reads).reads.set { ch_trim_reads } trim_html = TRIMGALORE.out.html trim_zip = TRIMGALORE.out.zip trim_log = TRIMGALORE.out.log - trimgalore_versions = TRIMGALORE.out.versions } + ch_versions = ch_versions.mix(FASTQC.out.versions.first(), + TRIMGALORE.out.versions.first()) + emit: - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] - fastqc_version // path: versions.yml - - reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] - trimgalore_version // path: versions.yml + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] + + reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] + + versions = ch_versions // path: versions.yml } diff --git a/subworkflows/nf-core/map_bwa_mem.nf b/subworkflows/nf-core/map_bwa_mem.nf index 079c2651e..8ce4cf9c1 100644 --- a/subworkflows/nf-core/map_bwa_mem.nf +++ b/subworkflows/nf-core/map_bwa_mem.nf @@ -16,15 +16,21 @@ workflow MAP_BWA_MEM { ch_index // path: /path/to/index main: + + ch_versions = Channel.empty() + BWA_MEM(ch_reads, ch_index) BAM_SORT_SAMTOOLS(BWA_MEM.out.bam) + ch_versions = ch_versions.mix(BWA_MEM.out.versions.first(), + BAM_SORT_SAMTOOLS.out.versions) + emit: bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - bwa_versions = BWA_MEM.out.versions // path: versions.yml - samtools_versions = BAM_SORT_SAMTOOLS.out.samtools_versions // path: versions.yml + + versions = ch_versions // path: versions.yml } diff --git a/subworkflows/nf-core/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf index 06cc40ea9..9f8e53608 100644 --- a/subworkflows/nf-core/mark_duplicates_picard.nf +++ b/subworkflows/nf-core/mark_duplicates_picard.nf @@ -14,10 +14,17 @@ workflow MARK_DUPLICATES_PICARD { ch_bam // channel: [ val(meta), [ bam ] ] main: + + ch_versions = Channel.empty() + PICARD_MARKDUPLICATES(ch_bam) SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam) BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES.out.versions.first(), + SAMTOOLS_INDEX.out.versions.first(), + BAM_STATS_SAMTOOLS.out.versions) + emit: bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] @@ -25,6 +32,6 @@ workflow MARK_DUPLICATES_PICARD { stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - picard_versions = PICARD_MARKDUPLICATES.out.versions // path: versions.yml - samtools_versions = SAMTOOLS_INDEX.out.versions // path: versions.yml + + versions = ch_versions // path: versions.yml } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 151a4dde9..05d242c0f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -118,7 +118,7 @@ include { FRIP_SCORE } from '../modules/local/frip_scor //include { DESEQ2_FEATURECOUNTS } from '../modules/local/deseq2_featurecounts' addParams( options: [:] ) include { IGV } from '../modules/local/igv' addParams( options: [:] ) include { OUTPUT_DOCUMENTATION } from '../modules/local/output_documentation' addParams( options: [:] ) -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: modules['get_software_versions'] ) +// include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: modules['get_software_versions'] ) // TODO template version below to be removed when checked // include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) @@ -176,6 +176,8 @@ include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deept include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) + include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) @@ -197,7 +199,7 @@ def multiqc_report = [] workflow CHIPSEQ { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -228,8 +230,9 @@ workflow CHIPSEQ { GET_CHROM_SIZES ( ch_fasta ).sizes, ch_blacklist.ifEmpty([]) ) - ch_software_versions = Channel.empty() - ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.versions.first().ifEmpty(null)) + // ch_software_versions = Channel.empty() + // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(MAKE_GENOME_FILTER.out.versions) // // SUBWORKFLOW: Read QC & trimming @@ -241,8 +244,8 @@ workflow CHIPSEQ { params.skip_fastqc, params.skip_trimming ) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.trimgalore_version.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) // // SUBWORKFLOW: Map reads & BAM QC @@ -253,8 +256,9 @@ workflow CHIPSEQ { FASTQC_TRIMGALORE.out.reads, ch_index ) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_versions.first()) - ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_versions.first()) + // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(MAP_BWA_MEM.out.versions) // // SUBWORKFLOW: Merge resequenced BAM files @@ -274,7 +278,8 @@ workflow CHIPSEQ { PICARD_MERGESAMFILES ( ch_sort_bam ) - ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions) // // SUBWORKFLOW: Mark duplicates & filter BAM files @@ -292,7 +297,8 @@ workflow CHIPSEQ { ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) - ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_version.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(BAM_CLEAN.out.versions) // // MODULE: Post alignment QC @@ -302,13 +308,16 @@ workflow CHIPSEQ { ch_fasta ) + // TODO Add versions to picard collectmultiplemetrics + // // MODULE: Library coverage // PRESEQ_LCEXTRAP ( BAM_CLEAN.out.bam ) - ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions) // // MODULE: Strand cross-correlation @@ -316,7 +325,8 @@ workflow CHIPSEQ { PHANTOMPEAKQUALTOOLS ( BAM_CLEAN.out.bam ) - ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions) MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), @@ -339,7 +349,8 @@ workflow CHIPSEQ { BEDTOOLS_GENOMECOV.out.bedgraph, GET_CHROM_SIZES.out.sizes ) - ch_software_versions = ch_software_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) // // MODULE: Coverage plots @@ -348,7 +359,8 @@ workflow CHIPSEQ { UCSC_BEDGRAPHTOBIGWIG.out.bigwig, ch_gene_bed ) - ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions) DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix @@ -399,7 +411,8 @@ workflow CHIPSEQ { ch_ip_control_bam, params.macs_gsize ) - ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions) ch_ip_control_bam .join(MACS2_CALLPEAK.out.peak, by: [0]) @@ -428,7 +441,8 @@ workflow CHIPSEQ { ch_fasta, ch_gtf ) - ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions) PLOT_HOMER_ANNOTATEPEAKS ( HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, @@ -492,7 +506,8 @@ workflow CHIPSEQ { SUBREAD_FEATURECOUNTS ( ch_ip_bam ) - ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first().ifEmpty(null)) + // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions) // // DESEQ2_FEATURECOUNTS ( @@ -519,19 +534,23 @@ workflow CHIPSEQ { // // MODULE: Pipeline reporting // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() //, - // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick + // ch_software_versions + // .map { it -> if (it) [ it.baseName, it ] } + // .groupTuple() + // .map { it[1][0] } + // .flatten() + // .collect() + // .set { ch_software_versions } + + // GET_SOFTWARE_VERSIONS ( + // ch_software_versions.map { it }.collect() //, + // // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick + // ) + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile() ) + OUTPUT_DOCUMENTATION ( ch_output_docs, ch_output_docs_images @@ -554,7 +573,7 @@ workflow CHIPSEQ { MULTIQC ( ch_multiqc_config, ch_multiqc_custom_config.collect().ifEmpty([]), - GET_SOFTWARE_VERSIONS.out.yaml.collect(), + CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), From 65ad7b67e5852e6f524345883bf0e044a0a23cc3 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 5 Oct 2021 12:39:40 +0200 Subject: [PATCH 201/538] Fix fastqc_trimgalore --- subworkflows/nf-core/fastqc_trimgalore.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/subworkflows/nf-core/fastqc_trimgalore.nf b/subworkflows/nf-core/fastqc_trimgalore.nf index 0636f0a55..f0638abcb 100644 --- a/subworkflows/nf-core/fastqc_trimgalore.nf +++ b/subworkflows/nf-core/fastqc_trimgalore.nf @@ -23,6 +23,7 @@ workflow FASTQC_TRIMGALORE { if (!skip_fastqc) { FASTQC(ch_reads).html.set { fastqc_html } fastqc_zip = FASTQC.out.zip + ch_versions = ch_versions.mix(FASTQC.out.versions.first()) } ch_trim_reads = ch_reads @@ -34,11 +35,9 @@ workflow FASTQC_TRIMGALORE { trim_html = TRIMGALORE.out.html trim_zip = TRIMGALORE.out.zip trim_log = TRIMGALORE.out.log + ch_versions = ch_versions.mix(TRIMGALORE.out.versions.first()) } - ch_versions = ch_versions.mix(FASTQC.out.versions.first(), - TRIMGALORE.out.versions.first()) - emit: fastqc_html // channel: [ val(meta), [ html ] ] fastqc_zip // channel: [ val(meta), [ zip ] ] From f202fc0b41f2042d6e0c9ff3d94254cc427175bd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 5 Oct 2021 22:35:00 +0200 Subject: [PATCH 202/538] Fix nf-core lint --- .nf-core.yml | 7 +++++++ bin/scrape_software_versions.py | 36 --------------------------------- 2 files changed, 7 insertions(+), 36 deletions(-) delete mode 100755 bin/scrape_software_versions.py diff --git a/.nf-core.yml b/.nf-core.yml index 5ed024fdf..c8445e750 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,4 +1,11 @@ lint: files_unchanged: + - .markdownlint.yml + - assets/email_template.html + - assets/email_template.txt + - lib/NfcoreTemplate.groovy - assets/multiqc_config.yaml actions_ci: False #get rid of the error "CI is not building the correct docker image. Should be: docker build..." + files_exist: + - bin/scrape_software_versions.py + - modules/local/get_software_versions.nf diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index c060d8d5d..000000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/chipseq" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/chipseq Software Versions' -section_href: 'https://github.com/nf-core/chipseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -

-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) From 2f3a0b3c638bb3c67c5d0a8cfa213284ba2b712d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 5 Oct 2021 22:35:23 +0200 Subject: [PATCH 203/538] Fix module import --- modules/local/multiqc_custom_phantompeakqualtools.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index de88fbe49..a62557e2f 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) From 41e97e4440380df546cb5e8b6f3edd45cd6d8803 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Oct 2021 08:23:00 +0200 Subject: [PATCH 204/538] Update python shebang to python3 --- CHANGELOG.md | 1 + bin/bampe_rm_orphan.py | 2 +- bin/check_samplesheet.py | 2 +- bin/igv_files_to_session.py | 2 +- bin/macs2_merged_expand.py | 2 +- bin/markdown_to_html.py | 3 ++- 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8227cdb..c97a823ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) * Updated Nextflow version to `v21.04.0` (see [nextflow#572](https://github.com/nextflow-io/nextflow/issues/1964)) * Move template boilerplate code to Groovy `lib/` +* Added `python3` shebang to appropriate scripts in `bin/` directory ### Other enhancements & fixes diff --git a/bin/bampe_rm_orphan.py b/bin/bampe_rm_orphan.py index 5b0a6f729..5de45ea65 100755 --- a/bin/bampe_rm_orphan.py +++ b/bin/bampe_rm_orphan.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ############################################################################### ############################################################################### diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 79b36ba52..fdbee3889 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys diff --git a/bin/igv_files_to_session.py b/bin/igv_files_to_session.py index 48e749c8e..adfe8f7e2 100755 --- a/bin/igv_files_to_session.py +++ b/bin/igv_files_to_session.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ####################################################################### ####################################################################### diff --git a/bin/macs2_merged_expand.py b/bin/macs2_merged_expand.py index f4e84a14d..0aa184757 100755 --- a/bin/macs2_merged_expand.py +++ b/bin/macs2_merged_expand.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ####################################################################### ####################################################################### diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py index 1187b2720..13350d440 100755 --- a/bin/markdown_to_html.py +++ b/bin/markdown_to_html.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + from __future__ import print_function import argparse import markdown From 23bdb0a4dcdef2415ac4cce362f4109c3c940624 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Oct 2021 08:43:06 +0200 Subject: [PATCH 205/538] Update dumpsoftwareversions to report version trailing zeros --- modules.json | 2 +- modules/nf-core/modules/custom/dumpsoftwareversions/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules.json b/modules.json index 418a10605..832103e19 100644 --- a/modules.json +++ b/modules.json @@ -10,7 +10,7 @@ "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, "custom/dumpsoftwareversions": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" }, "deeptools/computematrix": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index cf10a8e07..faf2073f7 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -79,7 +79,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { } with open("$versions") as f: - workflow_versions = yaml.safe_load(f) | module_versions + workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions workflow_versions["Workflow"] = { "Nextflow": "$workflow.nextflow.version", From 909470e700c301942ab9516fe4f0b9d1e8a0e425 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 22 Oct 2021 18:03:51 +0100 Subject: [PATCH 206/538] First pass updates --- README.md | 15 +- assets/design_pe.csv | 21 -- assets/design_se.csv | 21 -- assets/multiqc/deseq2_clustering_header.txt | 6 +- assets/multiqc/deseq2_pca_header.txt | 4 +- assets/samplesheet.csv | 3 - assets/samplesheet_pe.csv | 21 ++ assets/samplesheet_se.csv | 21 ++ assets/schema_input.json | 10 + bin/check_samplesheet.py | 204 ++++++------- bin/check_samplesheet_old.py | 173 +++++++++++ bin/deseq2_qc.r | 247 ++++++++++++++++ bin/featurecounts_deseq2.r | 301 -------------------- bin/markdown_to_html.py | 92 ------ conf/modules.config | 10 +- conf/test_full.config | 0 docs/usage.md | 159 ++++------- lib/Completion.groovy | 117 -------- lib/Headers.groovy | 39 --- lib/Schema.groovy | 184 ------------ lib/WorkflowChipseq.groovy | 60 ++-- lib/WorkflowMain.groovy | 5 +- main.nf | 1 + nextflow.config | 53 ++-- nextflow_schema.json | 2 +- workflows/chipseq.nf | 46 +-- 26 files changed, 726 insertions(+), 1089 deletions(-) delete mode 100644 assets/design_pe.csv delete mode 100644 assets/design_se.csv delete mode 100644 assets/samplesheet.csv create mode 100644 assets/samplesheet_pe.csv create mode 100644 assets/samplesheet_se.csv create mode 100755 bin/check_samplesheet_old.py create mode 100755 bin/deseq2_qc.r delete mode 100755 bin/featurecounts_deseq2.r delete mode 100755 bin/markdown_to_html.py mode change 100755 => 100644 conf/test_full.config delete mode 100755 lib/Completion.groovy delete mode 100755 lib/Headers.groovy delete mode 100755 lib/Schema.groovy diff --git a/README.md b/README.md index bd992cd2b..5ab753299 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,9 @@ **nfcore/chipseq** is a bioinformatics analysis pipeline used for Chromatin ImmunopreciPitation sequencing (ChIP-seq) data. -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! +On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/chipseq#full-test-dataset-origin) obtained from the SRA on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from running the full-sized tests can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). - -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! ## Pipeline summary @@ -74,7 +73,10 @@ On release, automated continuous integration tests run the pipeline on a full-si 4. Start running your own analysis! ```bash - nextflow run nf-core/chipseq -profile --input design.csv --genome GRCh37 + nextflow run nf-core/chipseq \ + --input samplsheet.csv \ + --genome GRCh37 \ + -profile ``` See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. @@ -85,7 +87,7 @@ The nf-core/chipseq pipeline comes with documentation about the pipeline: [usage ## Credits -These scripts were originally written by Chuan Wang ([@chuan-wang](https://github.com/chuan-wang)) and Phil Ewels ([@ewels](https://github.com/ewels)) for use at the [National Genomics Infrastructure](https://portal.scilifelab.se/genomics/) at [SciLifeLab](http://www.scilifelab.se/) in Stockholm, Sweden. The pipeline has since been re-implemented by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) at [The Francis Crick Institute](https://www.crick.ac.uk/), London. +These scripts were originally written by Chuan Wang ([@chuan-wang](https://github.com/chuan-wang)) and Phil Ewels ([@ewels](https://github.com/ewels)) for use at the [National Genomics Infrastructure](https://portal.scilifelab.se/genomics/) at [SciLifeLab](http://www.scilifelab.se/) in Stockholm, Sweden. The pipeline was re-implemented by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and converted to Nextflow DSL2 by Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Many thanks to others who have helped out and contributed along the way too, including (but not limited to): [@apeltzer](https://github.com/apeltzer), [@bc2zb](https://github.com/bc2zb), [@crickbabs](https://github.com/crickbabs), [@drejom](https://github.com/drejom), [@houghtos](https://github.com/houghtos), [@KevinMenden](https://github.com/KevinMenden), [@mashehu](https://github.com/mashehu), [@pditommaso](https://github.com/pditommaso), [@Rotholandus](https://github.com/Rotholandus), [@sofiahaglund](https://github.com/sofiahaglund), [@tiagochst](https://github.com/tiagochst) and [@winni2k](https://github.com/winni2k). @@ -99,13 +101,10 @@ For further information or help, don't hesitate to get in touch on the [Slack `# If you use nf-core/chipseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3240506](https://doi.org/10.5281/zenodo.3240506) - An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: -An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. - > **The nf-core framework for community-curated bioinformatics pipelines.** > > Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen. diff --git a/assets/design_pe.csv b/assets/design_pe.csv deleted file mode 100644 index 6e6eae735..000000000 --- a/assets/design_pe.csv +++ /dev/null @@ -1,21 +0,0 @@ -group,replicate,fastq_1,fastq_2,antibody,control -WT_BCATENIN_IP,1,BLA203A1_S27_L006_R1_001.fastq.gz,BLA203A1_S27_L006_R2_001.fastq.gz,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L001_R1_001.fastq.gz,BLA203A25_S16_L001_R2_001.fastq.gz,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L002_R1_001.fastq.gz,BLA203A25_S16_L002_R2_001.fastq.gz,BCATENIN,WT_INPUT -WT_BCATENIN_IP,3,BLA203A49_S40_L001_R1_001.fastq.gz,BLA203A49_S40_L001_R2_001.fastq.gz,BCATENIN,WT_INPUT -NAIVE_BCATENIN_IP,1,BLA203A7_S60_L001_R1_001.fastq.gz,BLA203A7_S60_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L001_R1_001.fastq.gz,BLA203A43_S34_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L002_R1_001.fastq.gz,BLA203A43_S34_L002_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,3,BLA203A64_S55_L001_R1_001.fastq.gz,BLA203A64_S55_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT -WT_TCF4_IP,1,BLA203A3_S29_L006_R1_001.fastq.gz,BLA203A3_S29_L006_R2_001.fastq.gz,TCF4,WT_INPUT -WT_TCF4_IP,2,BLA203A27_S18_L001_R1_001.fastq.gz,BLA203A27_S18_L001_R2_001.fastq.gz,TCF4,WT_INPUT -WT_TCF4_IP,3,BLA203A51_S42_L001_R1_001.fastq.gz,BLA203A51_S42_L001_R2_001.fastq.gz,TCF4,WT_INPUT -NAIVE_TCF4_IP,1,BLA203A9_S62_L001_R1_001.fastq.gz,BLA203A9_S62_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,2,BLA203A45_S36_L001_R1_001.fastq.gz,BLA203A45_S36_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,3,BLA203A66_S57_L001_R1_001.fastq.gz,BLA203A66_S57_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT -WT_INPUT,1,BLA203A6_S32_L006_R1_001.fastq.gz,BLA203A6_S32_L006_R2_001.fastq.gz,, -WT_INPUT,2,BLA203A30_S21_L001_R1_001.fastq.gz,BLA203A30_S21_L001_R2_001.fastq.gz,, -WT_INPUT,3,BLA203A31_S21_L003_R1_001.fastq.gz,BLA203A31_S21_L003_R2_001.fastq.gz,, -NAIVE_INPUT,1,BLA203A12_S3_L001_R1_001.fastq.gz,BLA203A12_S3_L001_R2_001.fastq.gz,, -NAIVE_INPUT,2,BLA203A48_S39_L001_R1_001.fastq.gz,BLA203A48_S39_L001_R2_001.fastq.gz,, -NAIVE_INPUT,3,BLA203A49_S1_L006_R1_001.fastq.gz,BLA203A49_S1_L006_R2_001.fastq.gz,, diff --git a/assets/design_se.csv b/assets/design_se.csv deleted file mode 100644 index 069a5c943..000000000 --- a/assets/design_se.csv +++ /dev/null @@ -1,21 +0,0 @@ -group,replicate,fastq_1,fastq_2,antibody,control -WT_BCATENIN_IP,1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -NAIVE_BCATENIN_IP,1,BLA203A7_S60_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L002_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,3,BLA203A64_S55_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -WT_TCF4_IP,1,BLA203A3_S29_L006_R1_001.fastq.gz,,TCF4,WT_INPUT -WT_TCF4_IP,2,BLA203A27_S18_L001_R1_001.fastq.gz,,TCF4,WT_INPUT -WT_TCF4_IP,3,BLA203A51_S42_L001_R1_001.fastq.gz,,TCF4,WT_INPUT -NAIVE_TCF4_IP,1,BLA203A9_S62_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,2,BLA203A45_S36_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,3,BLA203A66_S57_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -WT_INPUT,1,BLA203A6_S32_L006_R1_001.fastq.gz,,, -WT_INPUT,2,BLA203A30_S21_L001_R1_001.fastq.gz,,, -WT_INPUT,3,BLA203A31_S21_L003_R1_001.fastq.gz,,, -NAIVE_INPUT,1,BLA203A12_S3_L001_R1_001.fastq.gz,,, -NAIVE_INPUT,2,BLA203A48_S39_L001_R1_001.fastq.gz,,, -NAIVE_INPUT,3,BLA203A49_S1_L006_R1_001.fastq.gz,,, diff --git a/assets/multiqc/deseq2_clustering_header.txt b/assets/multiqc/deseq2_clustering_header.txt index a5edcb79d..a8e8adb96 100644 --- a/assets/multiqc/deseq2_clustering_header.txt +++ b/assets/multiqc/deseq2_clustering_header.txt @@ -1,9 +1,9 @@ #id: 'deseq2_clustering' #section_name: 'MERGED LIB: DESeq2 sample similarity' -#description: " matrix is generated from clustering by Euclidean distances between -# DESeq2 +#description: "is generated from clustering the Euclidean distances between +# DESeq2 # rlog values for each sample -# (see featurecounts_deseq2.r script)." +# in the deseq2_qc.r script." #plot_type: 'heatmap' #anchor: 'deseq2_clustering' #pconfig: diff --git a/assets/multiqc/deseq2_pca_header.txt b/assets/multiqc/deseq2_pca_header.txt index a086d306c..da7660b02 100644 --- a/assets/multiqc/deseq2_pca_header.txt +++ b/assets/multiqc/deseq2_pca_header.txt @@ -1,8 +1,8 @@ #id: 'deseq2_pca' #section_name: 'MERGED LIB: DESeq2 PCA plot' -#description: "between samples in the experiment. +#description: "PCA plot between samples in the experiment. # These values are calculated using DESeq2 -# in the featurecounts_deseq2.r script." +# in the deseq2_qc.r script." #plot_type: 'scatter' #anchor: 'deseq2_pca' #pconfig: diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv deleted file mode 100644 index 5f653ab7b..000000000 --- a/assets/samplesheet.csv +++ /dev/null @@ -1,3 +0,0 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, diff --git a/assets/samplesheet_pe.csv b/assets/samplesheet_pe.csv new file mode 100644 index 000000000..3a304f121 --- /dev/null +++ b/assets/samplesheet_pe.csv @@ -0,0 +1,21 @@ +sample,fastq_1,fastq_2,antibody,control +WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,BLA203A1_S27_L006_R2_001.fastq.gz,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,BLA203A25_S16_L001_R2_001.fastq.gz,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L002_R1_001.fastq.gz,BLA203A25_S16_L002_R2_001.fastq.gz,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP3,BLA203A49_S40_L001_R1_001.fastq.gz,BLA203A49_S40_L001_R2_001.fastq.gz,BCATENIN,WT_INPUT +NAIVE_BCATENIN_IP_REP1,BLA203A7_S60_L001_R1_001.fastq.gz,BLA203A7_S60_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L001_R1_001.fastq.gz,BLA203A43_S34_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L002_R1_001.fastq.gz,BLA203A43_S34_L002_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP3,BLA203A64_S55_L001_R1_001.fastq.gz,BLA203A64_S55_L001_R2_001.fastq.gz,BCATENIN,NAIVE_INPUT +WT_TCF4_IP_REP1,BLA203A3_S29_L006_R1_001.fastq.gz,BLA203A3_S29_L006_R2_001.fastq.gz,TCF4,WT_INPUT +WT_TCF4_IP_REP2,BLA203A27_S18_L001_R1_001.fastq.gz,BLA203A27_S18_L001_R2_001.fastq.gz,TCF4,WT_INPUT +WT_TCF4_IP_REP2,BLA203A51_S42_L001_R1_001.fastq.gz,BLA203A51_S42_L001_R2_001.fastq.gz,TCF4,WT_INPUT +NAIVE_TCF4_IP_REP1,BLA203A9_S62_L001_R1_001.fastq.gz,BLA203A9_S62_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP2,BLA203A45_S36_L001_R1_001.fastq.gz,BLA203A45_S36_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP3,BLA203A66_S57_L001_R1_001.fastq.gz,BLA203A66_S57_L001_R2_001.fastq.gz,TCF4,NAIVE_INPUT +WT_INPUT_REP1,BLA203A6_S32_L006_R1_001.fastq.gz,BLA203A6_S32_L006_R2_001.fastq.gz,, +WT_INPUT_REP2,BLA203A30_S21_L001_R1_001.fastq.gz,BLA203A30_S21_L001_R2_001.fastq.gz,, +WT_INPUT_REP3,BLA203A31_S21_L003_R1_001.fastq.gz,BLA203A31_S21_L003_R2_001.fastq.gz,, +NAIVE_INPUT_REP1,BLA203A12_S3_L001_R1_001.fastq.gz,BLA203A12_S3_L001_R2_001.fastq.gz,, +NAIVE_INPUT_REP2,BLA203A48_S39_L001_R1_001.fastq.gz,BLA203A48_S39_L001_R2_001.fastq.gz,, +NAIVE_INPUT_REP3,BLA203A49_S1_L006_R1_001.fastq.gz,BLA203A49_S1_L006_R2_001.fastq.gz,, diff --git a/assets/samplesheet_se.csv b/assets/samplesheet_se.csv new file mode 100644 index 000000000..a9581d6e0 --- /dev/null +++ b/assets/samplesheet_se.csv @@ -0,0 +1,21 @@ +sample,fastq_1,fastq_2,antibody,control +WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +NAIVE_BCATENIN_IP_REP1,BLA203A7_S60_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L002_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP3,BLA203A64_S55_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +WT_TCF4_IP_REP1,BLA203A3_S29_L006_R1_001.fastq.gz,,TCF4,WT_INPUT +WT_TCF4_IP_REP2,BLA203A27_S18_L001_R1_001.fastq.gz,,TCF4,WT_INPUT +WT_TCF4_IP_REP3,BLA203A51_S42_L001_R1_001.fastq.gz,,TCF4,WT_INPUT +NAIVE_TCF4_IP_REP1,BLA203A9_S62_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP2,BLA203A45_S36_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP3,BLA203A66_S57_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +WT_INPUT_REP1,BLA203A6_S32_L006_R1_001.fastq.gz,,, +WT_INPUT_REP2,BLA203A30_S21_L001_R1_001.fastq.gz,,, +WT_INPUT_REP3,BLA203A31_S21_L003_R1_001.fastq.gz,,, +NAIVE_INPUT_REP1,BLA203A12_S3_L001_R1_001.fastq.gz,,, +NAIVE_INPUT_REP2,BLA203A48_S39_L001_R1_001.fastq.gz,,, +NAIVE_INPUT_REP3,BLA203A49_S1_L006_R1_001.fastq.gz,,, diff --git a/assets/schema_input.json b/assets/schema_input.json index a024fd708..00d941b41 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -29,6 +29,16 @@ "maxLength": 0 } ] + }, + "antibody": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Antibody entry cannot contain spaces" + }, + "control": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Control entry cannot contain spaces" } }, "required": [ diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index fdbee3889..91327e5c6 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -7,7 +7,7 @@ def parse_args(args=None): - Description = "Reformat nf-core/chipseq samplesheet file and check its contents." + Description = "Reformat nf-core/rnaseq samplesheet file and check its contents." Epilog = "Example usage: python check_samplesheet.py " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) @@ -25,10 +25,10 @@ def make_dir(path): raise exception -def print_error(error, context='Line', context_str=''): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != '' and context_str != '': - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format(error, context.strip(), context_str.strip()) +def print_error(error, context="Line", context_str=""): + error_str = f"ERROR: Please check samplesheet -> {error}" + if context != "" and context_str != "": + error_str = f"ERROR: Please check samplesheet -> {error}\n{context.strip()}: '{context_str.strip()}'" print(error_str) sys.exit(1) @@ -37,131 +37,141 @@ def check_samplesheet(file_in, file_out): """ This function checks that the samplesheet follows the following structure: - group,replicate,fastq_1,fastq_2,antibody,control - CTCF_IP,1,CTCF_IP_1.fastq.gz,CTCF_IP_2.fastq.gz,CTCF,INPUT - INPUT,1,INPUT_1.fastq.gz,INPUT_IP_2.fastq.gz,, + sample,fastq_1,fastq_2,strandedness + SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz,forward + SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz,forward + SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz,,forward + + For an example see: + https://github.com/nf-core/test-datasets/blob/rnaseq/samplesheet/v3.1/samplesheet_test.csv """ - sample_run_dict = {} - antibody_dict = {} - with open(file_in, "r") as fin: + sample_mapping_dict = {} + with open(file_in, "r", encoding='utf-8-sig') as fin: ## Check header - HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] - header = fin.readline().strip().split(",") - if header != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) + MIN_COLS = 3 + HEADER = ["sample", "fastq_1", "fastq_2", "strandedness"] + header = [x.strip('"') for x in fin.readline().strip().split(",")] + if header[: len(HEADER)] != HEADER: + print( + f"ERROR: Please check samplesheet header -> {','.join(header)} != {','.join(HEADER)}" + ) sys.exit(1) ## Check sample entries for line in fin: - lspl = [x.strip() for x in line.strip().split(",")] - sample, replicate, fastq_1, fastq_2, antibody, control = lspl + lspl = [x.strip().strip('"') for x in line.strip().split(",")] ## Check valid number of columns per row - if len(lspl) != len(header): - print_error("Invalid number of columns (minimum = {})!".format(len(header)), 'Line', line) + if len(lspl) < len(HEADER): + print_error( + f"Invalid number of columns (minimum = {len(HEADER)})!", + "Line", + line, + ) num_cols = len([x for x in lspl if x]) - if num_cols < 3: - print_error("Invalid number of populated columns (minimum = 3)!", 'Line', line) + if num_cols < MIN_COLS: + print_error( + f"Invalid number of populated columns (minimum = {MIN_COLS})!", + "Line", + line, + ) ## Check sample name entries - if sample: - if sample.find(" ") != -1: - print_error("Group entry contains spaces!", 'Line', line) - else: - print_error("Group entry has not been specified!", 'Line', line) - - ## Check replicate entry is integer - if not replicate.isdigit(): - print_error("Replicate id not an integer!", 'Line', line) - replicate = int(replicate) + sample, fastq_1, fastq_2, strandedness = lspl[: len(HEADER)] + if sample.find(" ") != -1: + print( + f"WARNING: Spaces have been replaced by underscores for sample: {sample}" + ) + sample = sample.replace(" ", "_") + if not sample: + print_error("Sample entry has not been specified!", "Line", line) ## Check FastQ file extension for fastq in [fastq_1, fastq_2]: if fastq: if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", 'Line', line) + print_error("FastQ file contains spaces!", "Line", line) if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error("FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", 'Line', line) - - ## Check antibody and control columns have valid values - if antibody: - if antibody.find(' ') != -1: - print_error("Antibody id contains spaces!", line) - if not control: - print_error("Both antibody and control columns must be specified!", 'Line', line) - if control: - if control.find(' ') != -1: - print_error("Control id contains spaces!", line) - if not antibody: - print_error("Both antibody and control columns must be specified!", 'Line', line) - if antibody and control: - antibody_dict[sample] = (antibody,control) + print_error( + "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", + "Line", + line, + ) + + ## Check strandedness + strandednesses = ["unstranded", "forward", "reverse"] + if strandedness: + if strandedness not in strandednesses: + print_error( + f"Strandedness must be one of '{', '.join(strandednesses)}'!", + "Line", + line, + ) + else: + print_error( + f"Strandedness has not been specified! Must be one of {', '.join(strandednesses)}.", + "Line", + line, + ) ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] + sample_info = [] ## [single_end, fastq_1, fastq_2, strandedness] if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] + sample_info = ["0", fastq_1, fastq_2, strandedness] elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] + sample_info = ["1", fastq_1, fastq_2, strandedness] else: - print_error("Invalid combination of columns provided!", 'Line', line) + print_error("Invalid combination of columns provided!", "Line", line) - ## Create sample mapping dictionary = {sample: {replicate : [ single_end, fastq_1, fastq_2 ]}} - if sample not in sample_run_dict: - sample_run_dict[sample] = {} - if replicate not in sample_run_dict[sample]: - sample_run_dict[sample][replicate] = [sample_info] + ## Create sample mapping dictionary = {sample: [[ single_end, fastq_1, fastq_2, strandedness ]]} + if sample not in sample_mapping_dict: + sample_mapping_dict[sample] = [sample_info] else: - if sample_info in sample_run_dict[sample][replicate]: - print_error("Samplesheet contains duplicate rows!", 'Line', line) + if sample_info in sample_mapping_dict[sample]: + print_error("Samplesheet contains duplicate rows!", "Line", line) else: - sample_run_dict[sample][replicate].append(sample_info) - - ## Check if antibody and control columns have been specified at least once - if len(antibody_dict) == 0: - print_error("Antibody and control must be specified at least once!", '', '') + sample_mapping_dict[sample].append(sample_info) ## Write validated samplesheet with appropriate columns - antibody_group_dict = {} - if len(sample_run_dict) > 0: + if len(sample_mapping_dict) > 0: out_dir = os.path.dirname(file_out) make_dir(out_dir) with open(file_out, "w") as fout: - - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2", "antibody", "control"]) + "\n") - for sample in sorted(sample_run_dict.keys()): - - ## Check that replicate ids are in format 1.. - uniq_rep_ids = set(sample_run_dict[sample].keys()) - if len(uniq_rep_ids) != max(uniq_rep_ids): - print_error("Replicate IDs must start with 1..!", 'Group', sample) - - for replicate in sorted(sample_run_dict[sample].keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_run_dict[sample][replicate][0][0] for x in sample_run_dict[sample][replicate]): - print_error("Multiple runs of a sample must be of the same datatype!", 'Group', sample) - - for idx, sample_info in enumerate(sample_run_dict[sample][replicate]): - sample_id = "{}_R{}_T{}".format(sample,replicate,idx+1) - oList = [sample_id] + sample_info - - ## Extrapolate group column - if sample in antibody_dict: - antibody,control = antibody_dict[sample] - if control in sample_run_dict.keys(): - control_id = "{}_R1".format(control) - if replicate in sample_run_dict[control]: - control_id = "{}_R{}".format(control,replicate) - oList += [antibody, control_id] - else: - print_error("Control id not a valid group: {}!".format(control), 'Valid Groups', sorted(sample_run_dict.keys())) - else: - oList += 2 * [''] - fout.write(','.join(oList) + '\n') + fout.write( + ",".join(["sample", "single_end", "fastq_1", "fastq_2", "strandedness"]) + + "\n" + ) + for sample in sorted(sample_mapping_dict.keys()): + + ## Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end + if not all( + x[0] == sample_mapping_dict[sample][0][0] + for x in sample_mapping_dict[sample] + ): + print_error( + f"Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end!", + "Sample", + sample, + ) + + ## Check that multiple runs of the same sample are of the same strandedness + if not all( + x[-1] == sample_mapping_dict[sample][0][-1] + for x in sample_mapping_dict[sample] + ): + print_error( + f"Multiple runs of a sample must have the same strandedness!", + "Sample", + sample, + ) + + for idx, val in enumerate(sample_mapping_dict[sample]): + fout.write(",".join([f"{sample}_T{idx+1}"] + val) + "\n") + else: + print_error(f"No entries to process!", "Samplesheet: {file_in}") def main(args=None): diff --git a/bin/check_samplesheet_old.py b/bin/check_samplesheet_old.py new file mode 100755 index 000000000..fdbee3889 --- /dev/null +++ b/bin/check_samplesheet_old.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 + +import os +import sys +import errno +import argparse + + +def parse_args(args=None): + Description = "Reformat nf-core/chipseq samplesheet file and check its contents." + Epilog = "Example usage: python check_samplesheet.py " + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument("FILE_IN", help="Input samplesheet file.") + parser.add_argument("FILE_OUT", help="Output file.") + return parser.parse_args(args) + + +def make_dir(path): + if len(path) > 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise exception + + +def print_error(error, context='Line', context_str=''): + error_str = "ERROR: Please check samplesheet -> {}".format(error) + if context != '' and context_str != '': + error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format(error, context.strip(), context_str.strip()) + print(error_str) + sys.exit(1) + + +def check_samplesheet(file_in, file_out): + """ + This function checks that the samplesheet follows the following structure: + + group,replicate,fastq_1,fastq_2,antibody,control + CTCF_IP,1,CTCF_IP_1.fastq.gz,CTCF_IP_2.fastq.gz,CTCF,INPUT + INPUT,1,INPUT_1.fastq.gz,INPUT_IP_2.fastq.gz,, + """ + + sample_run_dict = {} + antibody_dict = {} + with open(file_in, "r") as fin: + + ## Check header + HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] + header = fin.readline().strip().split(",") + if header != HEADER: + print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) + sys.exit(1) + + ## Check sample entries + for line in fin: + lspl = [x.strip() for x in line.strip().split(",")] + sample, replicate, fastq_1, fastq_2, antibody, control = lspl + + ## Check valid number of columns per row + if len(lspl) != len(header): + print_error("Invalid number of columns (minimum = {})!".format(len(header)), 'Line', line) + + num_cols = len([x for x in lspl if x]) + if num_cols < 3: + print_error("Invalid number of populated columns (minimum = 3)!", 'Line', line) + + ## Check sample name entries + if sample: + if sample.find(" ") != -1: + print_error("Group entry contains spaces!", 'Line', line) + else: + print_error("Group entry has not been specified!", 'Line', line) + + ## Check replicate entry is integer + if not replicate.isdigit(): + print_error("Replicate id not an integer!", 'Line', line) + replicate = int(replicate) + + ## Check FastQ file extension + for fastq in [fastq_1, fastq_2]: + if fastq: + if fastq.find(" ") != -1: + print_error("FastQ file contains spaces!", 'Line', line) + if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): + print_error("FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", 'Line', line) + + ## Check antibody and control columns have valid values + if antibody: + if antibody.find(' ') != -1: + print_error("Antibody id contains spaces!", line) + if not control: + print_error("Both antibody and control columns must be specified!", 'Line', line) + if control: + if control.find(' ') != -1: + print_error("Control id contains spaces!", line) + if not antibody: + print_error("Both antibody and control columns must be specified!", 'Line', line) + if antibody and control: + antibody_dict[sample] = (antibody,control) + + ## Auto-detect paired-end/single-end + sample_info = [] ## [single_end, fastq_1, fastq_2] + if sample and fastq_1 and fastq_2: ## Paired-end short reads + sample_info = ["0", fastq_1, fastq_2] + elif sample and fastq_1 and not fastq_2: ## Single-end short reads + sample_info = ["1", fastq_1, fastq_2] + else: + print_error("Invalid combination of columns provided!", 'Line', line) + + ## Create sample mapping dictionary = {sample: {replicate : [ single_end, fastq_1, fastq_2 ]}} + if sample not in sample_run_dict: + sample_run_dict[sample] = {} + if replicate not in sample_run_dict[sample]: + sample_run_dict[sample][replicate] = [sample_info] + else: + if sample_info in sample_run_dict[sample][replicate]: + print_error("Samplesheet contains duplicate rows!", 'Line', line) + else: + sample_run_dict[sample][replicate].append(sample_info) + + ## Check if antibody and control columns have been specified at least once + if len(antibody_dict) == 0: + print_error("Antibody and control must be specified at least once!", '', '') + + ## Write validated samplesheet with appropriate columns + antibody_group_dict = {} + if len(sample_run_dict) > 0: + out_dir = os.path.dirname(file_out) + make_dir(out_dir) + with open(file_out, "w") as fout: + + fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2", "antibody", "control"]) + "\n") + for sample in sorted(sample_run_dict.keys()): + + ## Check that replicate ids are in format 1.. + uniq_rep_ids = set(sample_run_dict[sample].keys()) + if len(uniq_rep_ids) != max(uniq_rep_ids): + print_error("Replicate IDs must start with 1..!", 'Group', sample) + + for replicate in sorted(sample_run_dict[sample].keys()): + + ## Check that multiple runs of the same sample are of the same datatype + if not all(x[0] == sample_run_dict[sample][replicate][0][0] for x in sample_run_dict[sample][replicate]): + print_error("Multiple runs of a sample must be of the same datatype!", 'Group', sample) + + for idx, sample_info in enumerate(sample_run_dict[sample][replicate]): + sample_id = "{}_R{}_T{}".format(sample,replicate,idx+1) + oList = [sample_id] + sample_info + + ## Extrapolate group column + if sample in antibody_dict: + antibody,control = antibody_dict[sample] + if control in sample_run_dict.keys(): + control_id = "{}_R1".format(control) + if replicate in sample_run_dict[control]: + control_id = "{}_R{}".format(control,replicate) + oList += [antibody, control_id] + else: + print_error("Control id not a valid group: {}!".format(control), 'Valid Groups', sorted(sample_run_dict.keys())) + else: + oList += 2 * [''] + fout.write(','.join(oList) + '\n') + + +def main(args=None): + args = parse_args(args) + check_samplesheet(args.FILE_IN, args.FILE_OUT) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/deseq2_qc.r b/bin/deseq2_qc.r new file mode 100755 index 000000000..edb487143 --- /dev/null +++ b/bin/deseq2_qc.r @@ -0,0 +1,247 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## REQUIREMENTS ## +################################################ +################################################ + +## PCA, HEATMAP AND SCATTERPLOTS FOR SAMPLES IN COUNTS FILE +## - SAMPLE NAMES HAVE TO END IN e.g. "_R1" REPRESENTING REPLICATE ID. LAST 3 CHARACTERS OF SAMPLE NAME WILL BE TRIMMED TO OBTAIN GROUP ID FOR DESEQ2 COMPARISONS. +## - PACKAGES BELOW NEED TO BE AVAILABLE TO LOAD WHEN RUNNING R + +################################################ +################################################ +## LOAD LIBRARIES ## +################################################ +################################################ + +library(optparse) +library(DESeq2) +library(ggplot2) +library(RColorBrewer) +library(pheatmap) + +################################################ +################################################ +## PARSE COMMAND-LINE PARAMETERS ## +################################################ +################################################ + +option_list <- list( + make_option(c("-i", "--count_file" ), type="character", default=NULL , metavar="path" , help="Count file matrix where rows are genes and columns are samples." ), + make_option(c("-f", "--count_col" ), type="integer" , default=2 , metavar="integer", help="First column containing sample count data." ), + make_option(c("-d", "--id_col" ), type="integer" , default=1 , metavar="integer", help="Column containing identifiers to be used." ), + make_option(c("-r", "--sample_suffix" ), type="character", default='' , metavar="string" , help="Suffix to remove after sample name in columns e.g. '.rmDup.bam' if 'DRUG_R1.rmDup.bam'."), + make_option(c("-o", "--outdir" ), type="character", default='./' , metavar="path" , help="Output directory." ), + make_option(c("-p", "--outprefix" ), type="character", default='deseq2', metavar="string" , help="Output prefix." ), + make_option(c("-v", "--vst" ), type="logical" , default=FALSE , metavar="boolean", help="Run vst transform instead of rlog." ), + make_option(c("-c", "--cores" ), type="integer" , default=1 , metavar="integer", help="Number of cores." ) +) + +opt_parser <- OptionParser(option_list=option_list) +opt <- parse_args(opt_parser) + +if (is.null(opt$count_file)){ + print_help(opt_parser) + stop("Please provide a counts file.", call.=FALSE) +} + +################################################ +################################################ +## READ IN COUNTS FILE ## +################################################ +################################################ + +count.table <- read.delim(file=opt$count_file,header=TRUE, row.names=NULL) +rownames(count.table) <- count.table[,opt$id_col] +count.table <- count.table[,opt$count_col:ncol(count.table),drop=FALSE] +colnames(count.table) <- gsub(opt$sample_suffix,"",colnames(count.table)) +colnames(count.table) <- gsub(pattern='\\.$', replacement='', colnames(count.table)) + +################################################ +################################################ +## RUN DESEQ2 ## +################################################ +################################################ + +if (file.exists(opt$outdir) == FALSE) { + dir.create(opt$outdir, recursive=TRUE) +} +setwd(opt$outdir) + +samples.vec <- colnames(count.table) +name_components <- strsplit(samples.vec, "_") +n_components <- length(name_components[[1]]) +decompose <- n_components!=1 && all(sapply(name_components, length)==n_components) +coldata <- data.frame(samples.vec, sample=samples.vec, row.names=1) +if (decompose) { + groupings <- as.data.frame(lapply(1:n_components, function(i) sapply(name_components, "[[", i))) + names(groupings) <- paste0("Group", 1:n_components) + n_distinct <- sapply(groupings, function(grp) length(unique(grp))) + groupings <- groupings[n_distinct!=1 & n_distinct!=length(samples.vec)] + if (ncol(groupings)!=0) { + coldata <- cbind(coldata, groupings) + } else { + decompose <- FALSE + } +} + +DDSFile <- paste(opt$outprefix,".dds.RData",sep="") + +counts <- count.table[,samples.vec,drop=FALSE] +dds <- DESeqDataSetFromMatrix(countData=round(counts), colData=coldata, design=~ 1) +dds <- estimateSizeFactors(dds) +if (min(dim(count.table))<=1) { # No point if only one sample, or one gene + save(dds,file=DDSFile) + saveRDS(dds, file=sub("\\.dds\\.RData$", ".rds", DDSFile)) + warning("Not enough samples or genes in counts file for PCA.", call.=FALSE) + quit(save = "no", status = 0, runLast = FALSE) +} +if (!opt$vst) { + vst_name <- "rlog" + rld <- rlog(dds) +} else { + vst_name <- "vst" + rld <- varianceStabilizingTransformation(dds) +} + +assay(dds, vst_name) <- assay(rld) +save(dds,file=DDSFile) +saveRDS(dds, file=sub("\\.dds\\.RData$", ".rds", DDSFile)) + +################################################ +################################################ +## PLOT QC ## +################################################ +################################################ + +##' PCA pre-processeor +##' +##' Generate all the necessary information to plot PCA from a DESeq2 object +##' in which an assay containing a variance-stabilised matrix of counts is +##' stored. Copied from DESeq2::plotPCA, but with additional ability to +##' say which assay to run the PCA on. +##' +##' @param object The DESeq2DataSet object. +##' @param ntop number of top genes to use for principla components, selected by highest row variance. +##' @param assay the name or index of the assay that stores the variance-stabilised data. +##' @return A data.frame containing the projected data alongside the grouping columns. +##' A 'percentVar' attribute is set which includes the percentage of variation each PC explains, +##' and additionally how much the variation within that PC is explained by the grouping variable. +##' @author Gavin Kelly +plotPCA_vst <- function (object, ntop = 500, assay=length(assays(object))) { + rv <- rowVars(assay(object, assay)) + select <- order(rv, decreasing = TRUE)[seq_len(min(ntop, length(rv)))] + pca <- prcomp(t(assay(object, assay)[select, ]), center=TRUE, scale=FALSE) + percentVar <- pca$sdev^2/sum(pca$sdev^2) + df <- cbind( as.data.frame(colData(object)), pca$x) + #Order points so extreme samples are more likely to get label + ord <- order(abs(rank(df$PC1)-median(df$PC1)), abs(rank(df$PC2)-median(df$PC2))) + df <- df[ord,] + attr(df, "percentVar") <- data.frame(PC=seq(along=percentVar), percentVar=100*percentVar) + return(df) +} + +PlotFile <- paste(opt$outprefix,".plots.pdf",sep="") + +pdf(file=PlotFile, onefile=TRUE, width=7, height=7) +## PCA +ntop <- c(500, Inf) +for (n_top_var in ntop) { + pca.data <- plotPCA_vst(dds, assay=vst_name, ntop=n_top_var) + percentVar <- round(attr(pca.data, "percentVar")$percentVar) + plot_subtitle <- ifelse(n_top_var==Inf, "All genes", paste("Top", n_top_var, "genes")) + pl <- ggplot(pca.data, aes(PC1, PC2, label=paste0(" ", sample, " "))) + + geom_point() + + geom_text(check_overlap=TRUE, vjust=0.5, hjust="inward") + + xlab(paste0("PC1: ",percentVar[1],"% variance")) + + ylab(paste0("PC2: ",percentVar[2],"% variance")) + + labs(title = paste0("First PCs on ", vst_name, "-transformed data"), subtitle = plot_subtitle) + + theme(legend.position="top", + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.background = element_blank(), + panel.border = element_rect(colour = "black", fill=NA, size=1)) + print(pl) + + if (decompose) { + pc_names <- paste0("PC", attr(pca.data, "percentVar")$PC) + long_pc <- reshape(pca.data, varying=pc_names, direction="long", sep="", timevar="component", idvar="pcrow") + long_pc <- subset(long_pc, component<=5) + long_pc_grp <- reshape(long_pc, varying=names(groupings), direction="long", sep="", timevar="grouper") + long_pc_grp <- subset(long_pc_grp, grouper<=5) + long_pc_grp$component <- paste("PC", long_pc_grp$component) + long_pc_grp$grouper <- paste0(long_pc_grp$grouper, c("st","nd","rd","th","th")[long_pc_grp$grouper], " prefix") + pl <- ggplot(long_pc_grp, aes(x=Group, y=PC)) + + geom_point() + + stat_summary(fun=mean, geom="line", aes(group = 1)) + + labs(x=NULL, y=NULL, subtitle = plot_subtitle, title="PCs split by sample-name prefixes") + + facet_grid(component~grouper, scales="free_x") + + scale_x_discrete(guide = guide_axis(n.dodge = 3)) + print(pl) + } +} # at end of loop, we'll be using the user-defined ntop if any, else all genes + +## WRITE PC1 vs PC2 VALUES TO FILE +pca.vals <- pca.data[,c("PC1","PC2")] +colnames(pca.vals) <- paste0(colnames(pca.vals), ": ", percentVar[1:2], '% variance') +pca.vals <- cbind(sample = rownames(pca.vals), pca.vals) +write.table(pca.vals, file = paste(opt$outprefix, ".pca.vals.txt", sep=""), + row.names = FALSE, col.names = TRUE, sep = "\t", quote = TRUE) + +## SAMPLE CORRELATION HEATMAP +sampleDists <- dist(t(assay(dds, vst_name))) +sampleDistMatrix <- as.matrix(sampleDists) +colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255) +pheatmap( + sampleDistMatrix, + clustering_distance_rows=sampleDists, + clustering_distance_cols=sampleDists, + col=colors, + main=paste("Euclidean distance between", vst_name, "of samples") +) + +## WRITE SAMPLE DISTANCES TO FILE +write.table(cbind(sample = rownames(sampleDistMatrix), sampleDistMatrix),file=paste(opt$outprefix, ".sample.dists.txt", sep=""), + row.names=FALSE, col.names=TRUE, sep="\t", quote=FALSE) +dev.off() + +################################################ +################################################ +## SAVE SIZE FACTORS ## +################################################ +################################################ + +SizeFactorsDir <- "size_factors/" +if (file.exists(SizeFactorsDir) == FALSE) { + dir.create(SizeFactorsDir, recursive=TRUE) +} + +NormFactorsFile <- paste(SizeFactorsDir,opt$outprefix, ".size_factors.RData", sep="") + +normFactors <- sizeFactors(dds) +save(normFactors, file=NormFactorsFile) + +for (name in names(sizeFactors(dds))) { + sizeFactorFile <- paste(SizeFactorsDir,name, ".txt", sep="") + write(as.numeric(sizeFactors(dds)[name]), file=sizeFactorFile) +} + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +RLogFile <- "R_sessionInfo.log" + +sink(RLogFile) +a <- sessionInfo() +print(a) +sink() + +################################################ +################################################ +################################################ +################################################ diff --git a/bin/featurecounts_deseq2.r b/bin/featurecounts_deseq2.r deleted file mode 100755 index 32ba77dc7..000000000 --- a/bin/featurecounts_deseq2.r +++ /dev/null @@ -1,301 +0,0 @@ -#!/usr/bin/env Rscript - -################################################ -################################################ -## REQUIREMENTS ## -################################################ -################################################ - -## DIFFERENTIAL ANALYSIS, SCATTERPLOTS AND PCA FOR SAMPLES IN FEATURECOUNTS FILE - ## - FIRST SIX COLUMNS OF FEATURECOUNTS_FILE SHOULD BE INTERVAL INFO. REMAINDER OF COLUMNS SHOULD BE SAMPLES-SPECIFIC COUNTS. - ## - SAMPLE NAMES HAVE TO END IN "_R1" REPRESENTING REPLICATE ID. LAST 3 CHARACTERS OF SAMPLE NAME WILL BE TRIMMED TO OBTAIN GROUP ID FOR DESEQ2 COMPARISONS. - ## - BAM_SUFFIX IS PORTION OF FILENAME AFTER SAMPLE NAME IN FEATURECOUNTS COLUMN SAMPLE NAMES E.G. ".rmDup.bam" if "DRUG_R1.rmDup.bam" - ## - PACKAGES BELOW NEED TO BE AVAILABLE TO LOAD WHEN RUNNING R - -################################################ -################################################ -## LOAD LIBRARIES ## -################################################ -################################################ - -library(optparse) -library(DESeq2) -library(vsn) -library(ggplot2) -library(RColorBrewer) -library(pheatmap) -library(lattice) -library(BiocParallel) - -################################################ -################################################ -## PARSE COMMAND-LINE PARAMETERS ## -################################################ -################################################ - -option_list <- list(make_option(c("-i", "--featurecount_file"), type="character", default=NULL, help="Feature count file generated by the SubRead featureCounts command.", metavar="path"), - make_option(c("-b", "--bam_suffix"), type="character", default=NULL, help="Portion of filename after sample name in featurecount file header e.g. '.rmDup.bam' if 'DRUG_R1.rmDup.bam'", metavar="string"), - make_option(c("-o", "--outdir"), type="character", default='./', help="Output directory", metavar="path"), - make_option(c("-p", "--outprefix"), type="character", default='differential', help="Output prefix", metavar="string"), - make_option(c("-s", "--outsuffix"), type="character", default='', help="Output suffix for comparison-level results", metavar="string"), - make_option(c("-v", "--vst"), type="logical", default=FALSE, help="Run vst transform instead of rlog", metavar="boolean"), - make_option(c("-c", "--cores"), type="integer", default=1, help="Number of cores", metavar="integer")) - -opt_parser <- OptionParser(option_list=option_list) -opt <- parse_args(opt_parser) - -if (is.null(opt$featurecount_file)){ - print_help(opt_parser) - stop("Please provide featurecount file.", call.=FALSE) -} -if (is.null(opt$bam_suffix)){ - print_help(opt_parser) - stop("Please provide bam suffix in header of featurecount file.", call.=FALSE) -} - -################################################ -################################################ -## READ IN COUNTS FILE ## -################################################ -################################################ - -count.table <- read.delim(file=opt$featurecount_file,header=TRUE,skip=1) -colnames(count.table) <- gsub(opt$bam_suffix,"",colnames(count.table)) -colnames(count.table) <- as.character(lapply(colnames(count.table), function (x) tail(strsplit(x,'.',fixed=TRUE)[[1]],1))) -rownames(count.table) <- count.table$Geneid -interval.table <- count.table[,1:6] -count.table <- count.table[,7:ncol(count.table),drop=FALSE] - -################################################ -################################################ -## RUN DESEQ2 ## -################################################ -################################################ - -if (file.exists(opt$outdir) == FALSE) { - dir.create(opt$outdir,recursive=TRUE) -} -setwd(opt$outdir) - -samples.vec <- sort(colnames(count.table)) -groups <- sub("_[^_]+$", "", samples.vec) -print(unique(groups)) -if (length(unique(groups)) == 1) { - quit(save = "no", status = 0, runLast = FALSE) -} - -DDSFile <- paste(opt$outprefix,".dds.rld.RData",sep="") -if (file.exists(DDSFile) == FALSE) { - counts <- count.table[,samples.vec,drop=FALSE] - coldata <- data.frame(row.names=colnames(counts),condition=groups) - dds <- DESeqDataSetFromMatrix(countData = round(counts), colData = coldata, design = ~ condition) - dds <- DESeq(dds, parallel=TRUE, BPPARAM=MulticoreParam(opt$cores)) - if (!opt$vst) { - rld <- rlog(dds) - } else { - rld <- vst(dds) - } - save(dds,rld,file=DDSFile) -} - -################################################ -################################################ -## PLOT QC ## -################################################ -################################################ - -PlotFile <- paste(opt$outprefix,".plots.pdf",sep="") -if (file.exists(PlotFile) == FALSE) { - pdf(file=PlotFile,onefile=TRUE,width=7,height=7) - - ## PCA - pca.data <- DESeq2::plotPCA(rld,intgroup=c("condition"),returnData=TRUE) - percentVar <- round(100 * attr(pca.data, "percentVar")) - plot <- ggplot(pca.data, aes(PC1, PC2, color=condition)) + - geom_point(size=3) + - xlab(paste0("PC1: ",percentVar[1],"% variance")) + - ylab(paste0("PC2: ",percentVar[2],"% variance")) + - theme(panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - panel.background = element_blank(), - panel.border = element_rect(colour = "black", fill=NA, size=1)) - print(plot) - - ## WRITE PC1 vs PC2 VALUES TO FILE - pca.vals <- pca.data[,1:2] - colnames(pca.vals) <- paste(colnames(pca.vals),paste(percentVar,'% variance',sep=""), sep=": ") - pca.vals <- cbind(sample = rownames(pca.vals), pca.vals) - write.table(pca.vals,file=paste(opt$outprefix,".pca.vals.txt",sep=""),row.names=FALSE,col.names=TRUE,sep="\t",quote=TRUE) - - ## SAMPLE CORRELATION HEATMAP - sampleDists <- dist(t(assay(rld))) - sampleDistMatrix <- as.matrix(sampleDists) - colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255) - pheatmap(sampleDistMatrix,clustering_distance_rows=sampleDists,clustering_distance_cols=sampleDists,col=colors) - - ## WRITE SAMPLE DISTANCES TO FILE - write.table(cbind(sample = rownames(sampleDistMatrix), sampleDistMatrix),file=paste(opt$outprefix,".sample.dists.txt",sep=""),row.names=FALSE,col.names=TRUE,sep="\t",quote=FALSE) - - dev.off() -} - -################################################ -################################################ -## SAVE SIZE FACTORS ## -################################################ -################################################ - -SizeFactorsDir <- "sizeFactors/" -if (file.exists(SizeFactorsDir) == FALSE) { - dir.create(SizeFactorsDir,recursive=TRUE) -} - -NormFactorsFile <- paste(SizeFactorsDir,opt$outprefix,".sizeFactors.RData",sep="") -if (file.exists(NormFactorsFile) == FALSE) { - normFactors <- sizeFactors(dds) - save(normFactors,file=NormFactorsFile) - - for (name in names(sizeFactors(dds))) { - sizeFactorFile <- paste(SizeFactorsDir,name,opt$outsuffix,".sizeFactor.txt",sep="") - if (file.exists(sizeFactorFile) == FALSE) { - write(as.numeric(sizeFactors(dds)[name]),file=sizeFactorFile) - } - } -} - -################################################ -################################################ -## WRITE LOG FILE ## -################################################ -################################################ - -LogFile <- paste(opt$outprefix,".log",sep="") -if (file.exists(LogFile) == FALSE) { - cat("\nSamples =",samples.vec,"\n\n",file=LogFile,append=TRUE,sep=', ') - cat("Groups =",groups,"\n\n",file=LogFile,append=TRUE,sep=', ') - cat("Dimensions of count matrix =",dim(counts),"\n\n",file=LogFile,append=FALSE,sep=' ') - cat("\n",file=LogFile,append=TRUE,sep='') -} - -################################################ -################################################ -## LOOP THROUGH COMPARISONS ## -################################################ -################################################ - -ResultsFile <- paste(opt$outprefix,".results.txt",sep="") -if (file.exists(ResultsFile) == FALSE) { - - raw.counts <- counts(dds,normalized=FALSE) - colnames(raw.counts) <- paste(colnames(raw.counts),'raw',sep='.') - pseudo.counts <- counts(dds,normalized=TRUE) - colnames(pseudo.counts) <- paste(colnames(pseudo.counts),'pseudo',sep='.') - - deseq2_results_list <- list() - comparisons <- combn(unique(groups),2) - for (idx in 1:ncol(comparisons)) { - - control.group <- comparisons[1,idx] - treat.group <- comparisons[2,idx] - CompPrefix <- paste(control.group,treat.group,sep="vs") - cat("Saving results for ",CompPrefix," ...\n",sep="") - - CompOutDir <- paste(CompPrefix,'/',sep="") - if (file.exists(CompOutDir) == FALSE) { - dir.create(CompOutDir,recursive=TRUE) - } - - control.samples <- samples.vec[which(groups == control.group)] - treat.samples <- samples.vec[which(groups == treat.group)] - comp.samples <- c(control.samples,treat.samples) - - comp.results <- results(dds,contrast=c("condition",c(control.group,treat.group))) - comp.df <- as.data.frame(comp.results) - comp.table <- cbind(interval.table, as.data.frame(comp.df), raw.counts[,paste(comp.samples,'raw',sep='.')], pseudo.counts[,paste(comp.samples,'pseudo',sep='.')]) - - ## WRITE RESULTS FILE - CompResultsFile <- paste(CompOutDir,CompPrefix,opt$outsuffix,".deseq2.results.txt",sep="") - write.table(comp.table, file=CompResultsFile, col.names=TRUE, row.names=FALSE, sep='\t', quote=FALSE) - - ## FILTER RESULTS BY FDR & LOGFC AND WRITE RESULTS FILE - pdf(file=paste(CompOutDir,CompPrefix,opt$outsuffix,".deseq2.plots.pdf",sep=""),width=10,height=8) - if (length(comp.samples) > 2) { - for (MIN_FDR in c(0.01,0.05)) { - - ## SUBSET RESULTS BY FDR - pass.fdr.table <- subset(comp.table, padj < MIN_FDR) - pass.fdr.up.table <- subset(comp.table, padj < MIN_FDR & log2FoldChange > 0) - pass.fdr.down.table <- subset(comp.table, padj < MIN_FDR & log2FoldChange < 0) - - ## SUBSET RESULTS BY FDR AND LOGFC - pass.fdr.logFC.table <- subset(comp.table, padj < MIN_FDR & abs(log2FoldChange) >= 1) - pass.fdr.logFC.up.table <- subset(comp.table, padj < MIN_FDR & abs(log2FoldChange) >= 1 & log2FoldChange > 0) - pass.fdr.logFC.down.table <- subset(comp.table, padj < MIN_FDR & abs(log2FoldChange) >= 1 & log2FoldChange < 0) - - ## WRITE RESULTS FILE - CompResultsFile <- paste(CompOutDir,CompPrefix,opt$outsuffix,".deseq2.FDR",MIN_FDR,".results.txt",sep="") - CompBEDFile <- paste(CompOutDir,CompPrefix,opt$outsuffix,".deseq2.FDR",MIN_FDR,".results.bed",sep="") - write.table(pass.fdr.table, file=CompResultsFile, col.names=TRUE, row.names=FALSE, sep='\t', quote=FALSE) - write.table(pass.fdr.table[,c("Chr","Start","End","Geneid","log2FoldChange","Strand")], file=CompBEDFile, col.names=FALSE, row.names=FALSE, sep='\t', quote=FALSE) - - ## MA PLOT & VOLCANO PLOT - DESeq2::plotMA(comp.results, main=paste("MA plot FDR <= ",MIN_FDR,sep=""), ylim=c(-2,2),alpha=MIN_FDR) - plot(comp.table$log2FoldChange, -1*log10(comp.table$padj), col=ifelse(comp.table$padj<=MIN_FDR, "red", "black"), xlab="logFC", ylab="-1*log10(FDR)", main=paste("Volcano plot FDR <=",MIN_FDR,sep=" "), pch=20) - - ## ADD COUNTS TO LOGFILE - cat(CompPrefix," genes with FDR <= ",MIN_FDR,": ",nrow(pass.fdr.table)," (up=",nrow(pass.fdr.up.table),", down=",nrow(pass.fdr.down.table),")","\n",file=LogFile,append=TRUE,sep="") - cat(CompPrefix," genes with FDR <= ",MIN_FDR," & FC > 2: ",nrow(pass.fdr.logFC.table)," (up=",nrow(pass.fdr.logFC.up.table),", down=",nrow(pass.fdr.logFC.down.table),")","\n",file=LogFile,append=TRUE,sep="") - - } - cat("\n",file=LogFile,append=TRUE,sep="") - } - - ## SAMPLE CORRELATION HEATMAP - rld.subset <- assay(rld)[,comp.samples] - sampleDists <- dist(t(rld.subset)) - sampleDistMatrix <- as.matrix(sampleDists) - colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255) - pheatmap(sampleDistMatrix,clustering_distance_rows=sampleDists,clustering_distance_cols=sampleDists,col=colors) - - ## SCATTER PLOT FOR RLOG COUNTS - combs <- combn(comp.samples,2,simplify=FALSE) - clabels <- sapply(combs,function(x){paste(x,collapse=' & ')}) - plotdat <- data.frame(x=unlist(lapply(combs, function(x){rld.subset[, x[1] ]})),y=unlist(lapply(combs, function(y){rld.subset[, y[2] ]})),comp=rep(clabels, each=nrow(rld.subset))) - plot <- xyplot(y~x|comp,plotdat, - panel=function(...){ - panel.xyplot(...) - panel.abline(0,1,col="red") - }, - par.strip.text=list(cex=0.5)) - print(plot) - dev.off() - - colnames(comp.df) <- paste(CompPrefix,".",colnames(comp.df),sep="") - deseq2_results_list[[idx]] <- comp.df - - } - - ## WRITE RESULTS FROM ALL COMPARISONS TO FILE - deseq2_results_table <- cbind(interval.table,do.call(cbind, deseq2_results_list),raw.counts,pseudo.counts) - write.table(deseq2_results_table, file=ResultsFile, col.names=TRUE, row.names=FALSE, sep='\t', quote=FALSE) - -} - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -RLogFile <- "R_sessionInfo.log" -if (file.exists(RLogFile) == FALSE) { - sink(RLogFile) - a <- sessionInfo() - print(a) - sink() -} - -################################################ -################################################ -################################################ -################################################ diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py deleted file mode 100755 index 13350d440..000000000 --- a/bin/markdown_to_html.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import print_function -import argparse -import markdown -import os -import sys -import io - - -def convert_markdown(in_fn): - input_md = io.open(in_fn, mode="r", encoding="utf-8").read() - html = markdown.markdown( - "[TOC]\n" + input_md, - extensions=["pymdownx.extra", "pymdownx.b64", "pymdownx.highlight", "pymdownx.emoji", "pymdownx.tilde", "toc"], - extension_configs={ - "pymdownx.b64": {"base_path": os.path.dirname(in_fn)}, - "pymdownx.highlight": {"noclasses": True}, - "toc": {"title": "Table of Contents"}, - }, - ) - return html - - -def wrap_html(contents): - header = """ - - - - - -
- """ - footer = """ -
- - - """ - return header + contents + footer - - -def parse_args(args=None): - parser = argparse.ArgumentParser() - parser.add_argument("mdfile", type=argparse.FileType("r"), nargs="?", help="File to convert. Defaults to stdin.") - parser.add_argument( - "-o", "--out", type=argparse.FileType("w"), default=sys.stdout, help="Output file name. Defaults to stdout." - ) - return parser.parse_args(args) - - -def main(args=None): - args = parse_args(args) - converted_md = convert_markdown(args.mdfile.name) - html = wrap_html(converted_md) - args.out.write(html) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/conf/modules.config b/conf/modules.config index b514aeb0d..ae0f6c356 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -153,13 +153,9 @@ params { args = "-F SAF -O --fracOverlap 0.2" publish_dir = "bwa/mergedLibrary/macs2" } - 'deseq2_featurecounts' { - publish_dir = "bwa/mergedLibrary/macs2" - } - 'get_software_versions' { - publish_dir = "pipeline_info" - publish_files = ['csv':''] - } + //'deseq2_featurecounts' { + // publish_dir = "bwa/mergedLibrary/macs2" + //} 'multiqc' { args = '' publish_dir = "multiqc" diff --git a/conf/test_full.config b/conf/test_full.config old mode 100755 new mode 100644 diff --git a/docs/usage.md b/docs/usage.md index 68caa1da7..be0b64545 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -4,124 +4,64 @@ > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ -## Introduction -You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row as shown in the examples below. - -```bash ---input '[path to design file]' -``` - -### Multiple replicates - -The `group` identifier should be identical when you have multiple replicates from the same experimental group, just increment the `replicate` identifier appropriately. The first replicate value for any given experimental group must be 1. - -The `antibody` column is required to separate the downstream consensus peak merging and differential analysis for different antibodies. Its not advisable to generate a consensus peak set across different antibodies especially if their binding patterns are inherently different e.g. narrow transcription factors and broad histone marks. - -The `control` column should be the `group` identifier for the controls for any given IP. The pipeline will automatically pair the inputs based on replicate identifier (i.e. where you have an equal number of replicates for your IP's and controls), alternatively, the first control sample in that group will be selected. +## Samplesheet input -In the single-end design below there are triplicate samples for the `WT_BCATENIN_IP` group along with triplicate samples for their corresponding `WT_INPUT` samples. +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 5 columns, and a header row as shown in the examples below. -```bash -group,replicate,fastq_1,fastq_2,antibody,control -WT_BCATENIN_IP,1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_INPUT,1,BLA203A6_S32_L006_R1_001.fastq.gz,,, -WT_INPUT,2,BLA203A30_S21_L002_R1_001.fastq.gz,,, -WT_INPUT,3,BLA203A31_S21_L003_R1_001.fastq.gz,,, +```console +--input '[path to samplesheet file]' ``` ### Multiple runs of the same library -Both the `group` and `replicate` identifiers should be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will perform the alignments in parallel, and subsequently merge them before further analysis. Below is an example where the second replicate of the `WT_BCATENIN_IP` and `WT_INPUT` groups has been re-sequenced multiple times: +The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will perform the alignments in parallel, and subsequently merge them before further analysis. Below is an example where the samples called `WT_BCATENIN_IP_REP2` and `WT_INPUT_REP2` have been re-sequenced multiple times: ```bash -group,replicate,fastq_1,fastq_2,antibody,control -WT_BCATENIN_IP,1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L003_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_INPUT,1,BLA203A6_S32_L006_R1_001.fastq.gz,,, -WT_INPUT,2,BLA203A30_S21_L001_R1_001.fastq.gz,,, -WT_INPUT,2,BLA203A30_S21_L002_R1_001.fastq.gz,,, -WT_INPUT,3,BLA203A31_S21_L003_R1_001.fastq.gz,,, +sample,fastq_1,fastq_2,antibody,control +WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L003_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_INPUT_REP1,BLA203A6_S32_L006_R1_001.fastq.gz,,, +WT_INPUT_REP2,BLA203A30_S21_L001_R1_001.fastq.gz,,, +WT_INPUT_REP2,BLA203A30_S21_L002_R1_001.fastq.gz,,, +WT_INPUT_REP3,BLA203A31_S21_L003_R1_001.fastq.gz,,, ``` ### Full design -A final design file may look something like the one below. This is for two antibodies and associated controls in triplicate, where the second replicate of the `WT_BCATENIN_IP` and `NAIVE_BCATENIN_IP` group has been sequenced twice: - -```bash -group,replicate,fastq_1,fastq_2,antibody,control -WT_BCATENIN_IP,1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT -WT_BCATENIN_IP,3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT -NAIVE_BCATENIN_IP,1,BLA203A7_S60_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,2,BLA203A43_S34_L002_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -NAIVE_BCATENIN_IP,3,BLA203A64_S55_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT -WT_TCF4_IP,1,BLA203A3_S29_L006_R1_001.fastq.gz,,TCF4,WT_INPUT -WT_TCF4_IP,2,BLA203A27_S18_L001_R1_001.fastq.gz,,TCF4,WT_INPUT -WT_TCF4_IP,3,BLA203A51_S42_L001_R1_001.fastq.gz,,TCF4,WT_INPUT -NAIVE_TCF4_IP,1,BLA203A9_S62_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,2,BLA203A45_S36_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -NAIVE_TCF4_IP,3,BLA203A66_S57_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT -WT_INPUT,1,BLA203A6_S32_L006_R1_001.fastq.gz,,, -WT_INPUT,2,BLA203A30_S21_L001_R1_001.fastq.gz,,, -WT_INPUT,3,BLA203A31_S21_L003_R1_001.fastq.gz,,, -NAIVE_INPUT,1,BLA203A12_S3_L001_R1_001.fastq.gz,,, -NAIVE_INPUT,2,BLA203A48_S39_L001_R1_001.fastq.gz,,, -NAIVE_INPUT,3,BLA203A49_S1_L006_R1_001.fastq.gz,,, -``` - -| Column | Description | -|-------------|--------------------------------------------------------------------------------------------------------------------------------------------------| -| `group` | Group/condition identifier for sample. This will be identical for re-sequenced libraries and replicate samples from the same experimental group. | -| `replicate` | Integer representing replicate number. This will be identical for re-sequenced libraries. Must start from `1..`. | -| `fastq_1` | Full path to FastQ file for read 1. File has to be zipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for read 2. File has to be zipped and have the extension ".fastq.gz" or ".fq.gz". | -| `antibody` | Antibody name. This is required to segregate downstream analysis for different antibodies. Required when `control` is specified. | -| `control` | Group identifier for control sample. The pipeline will automatically select the control sample with the same replicate identifier as the IP. | - -Example design files have been provided with the pipeline for [paired-end](../assets/design_pe.csv) and [single-end](../assets/design_se.csv) data. - -## Samplesheet input +The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 5 columns to match those defined in the table below. -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. - -```console ---input '[path to samplesheet file]' -``` - -### Multiple runs of the same sample - -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: - -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz -``` - -### Full samplesheet +The `antibody` column is required to separate the downstream consensus peak merging and differential analysis for different antibodies. Its not advisable to generate a consensus peak set across different antibodies especially if their binding patterns are inherently different e.g. narrow transcription factors and broad histone marks. -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. +The `control` column should be the `sample` identifier for the controls for any given IP. -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. +A final design file may look something like the one below. This is for two antibodies and associated controls, where the `WT_BCATENIN_IP_REP2` and `NAIVE_BCATENIN_IP_REP2` samples have been sequenced twice: -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +```bash +sample,fastq_1,fastq_2,antibody,control +WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP2,BLA203A25_S16_L002_R1_001.fastq.gz,,BCATENIN,WT_INPUT +WT_BCATENIN_IP_REP3,BLA203A49_S40_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT +NAIVE_BCATENIN_IP_REP1,BLA203A7_S60_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP2,BLA203A43_S34_L002_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +NAIVE_BCATENIN_IP_REP3,BLA203A64_S55_L001_R1_001.fastq.gz,,BCATENIN,NAIVE_INPUT +WT_TCF4_IP_REP1,BLA203A3_S29_L006_R1_001.fastq.gz,,TCF4,WT_INPUT +WT_TCF4_IP_REP2,BLA203A27_S18_L001_R1_001.fastq.gz,,TCF4,WT_INPUT +WT_TCF4_IP_REP3,BLA203A51_S42_L001_R1_001.fastq.gz,,TCF4,WT_INPUT +NAIVE_TCF4_IP_REP1,BLA203A9_S62_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP2,BLA203A45_S36_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +NAIVE_TCF4_IP_REP3,BLA203A66_S57_L001_R1_001.fastq.gz,,TCF4,NAIVE_INPUT +WT_INPUT_REP1,BLA203A6_S32_L006_R1_001.fastq.gz,,, +WT_INPUT_REP2,BLA203A30_S21_L001_R1_001.fastq.gz,,, +WT_INPUT_REP3,BLA203A31_S21_L003_R1_001.fastq.gz,,, +NAIVE_INPUT_REP1,BLA203A12_S3_L001_R1_001.fastq.gz,,, +NAIVE_INPUT_REP2,BLA203A48_S39_L001_R1_001.fastq.gz,,, +NAIVE_INPUT_REP3,BLA203A49_S1_L006_R1_001.fastq.gz,,, ``` | Column | Description | @@ -129,15 +69,28 @@ TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, | `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | | `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `antibody` | Antibody name. This is required to segregate downstream analysis for different antibodies. Required when `control` is specified. | +| `control` | Sample name for control sample. | + +Example design files have been provided with the pipeline for [paired-end](../assets/samplesheet_pe.csv) and [single-end](../assets/samplesheet_se.csv) data. + +> **NB:** The `group` and `replicate` columns were replaced with a single `sample` column as of v2.0 of the pipeline. The `sample` column is essentially a concatenation of the `group` and `replicate` columns. If all values of `sample` have the same number of underscores, fields defined by these underscore-separated names may be used in the PCA plots produced by the pipeline, to regain the ability to represent different groupings. + +## Reference genome files + +The minimum reference genome requirements are a FASTA and GTF file, all other files required to run the pipeline can be generated from these files. However, it is more storage and compute friendly if you are able to re-use reference genome files as efficiently as possible. It is recommended to use the `--save_reference` parameter if you are using the pipeline to build new indices (e.g. those unavailable on [AWS iGenomes](https://nf-co.re/usage/reference_genomes)) so that you can save them somewhere locally. The index building step can be quite a time-consuming process and it permits their reuse for future runs of the pipeline to save disk space. You can then either provide the appropriate reference genome files on the command-line via the appropriate parameters (e.g. `--bwa_index '/path/to/bwa/index/'`) or via a custom config file. + +* If `--genome` is provided then the FASTA and GTF files (and existing indices) will be automatically obtained from AWS-iGenomes unless these have already been downloaded locally in the path specified by `--igenomes_base`. +* If `--gene_bed` is not provided then it will be generated from the GTF file. -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +> **NB:** Compressed reference files are also supported by the pipeline i.e. standard files with the `.gz` extension and indices folders with the `tar.gz` extension. ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/chipseq --input design.csv --genome GRCh37 -profile docker +nextflow run nf-core/chipseq --input samplesheet.csv --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. diff --git a/lib/Completion.groovy b/lib/Completion.groovy deleted file mode 100755 index 67e8322c1..000000000 --- a/lib/Completion.groovy +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Functions to be run on completion of pipeline - */ - -class Completion { - static void email(workflow, params, summary, run_name, projectDir, multiqc_report, log) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def email_fields = [:] - email_fields['version'] = workflow.manifest.version - email_fields['runName'] = run_name ?: workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary - email_fields['summary']['Date Started'] = workflow.start - email_fields['summary']['Date Completed'] = workflow.complete - email_fields['summary']['Pipeline script file path'] = workflow.scriptFile - email_fields['summary']['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) email_fields['summary']['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) email_fields['summary']['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) email_fields['summary']['Pipeline Git branch/tag'] = workflow.revision - email_fields['summary']['Nextflow Version'] = workflow.nextflow.version - email_fields['summary']['Nextflow Build'] = workflow.nextflow.build - email_fields['summary']['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList) { - log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" - mqc_report = mqc_report[0] - } - } - } catch (all) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" - } - - // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: params.max_multiqc_email_size.toBytes() ] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "[$workflow.manifest.name] Sent summary e-mail to $email_address (sendmail)" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= params.max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } - mail_cmd.execute() << email_html - log.info "[$workflow.manifest.name] Sent summary e-mail to $email_address (mail)" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - } - - static void summary(workflow, params, log) { - Map colors = Headers.log_colours(params.monochrome_logs) - if (workflow.stats.ignoredCount > 0 && workflow.success) { - log.info "-${colors.purple}Warning, pipeline completed, but with errored process(es) ${colors.reset}-" - log.info "-${colors.red}Number of ignored errored process(es) : ${workflow.stats.ignoredCount} ${colors.reset}-" - log.info "-${colors.green}Number of successfully ran process(es) : ${workflow.stats.succeedCount} ${colors.reset}-" - } - if (workflow.success) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - Checks.hostname(workflow, params, log) - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } - } -} diff --git a/lib/Headers.groovy b/lib/Headers.groovy deleted file mode 100755 index 8fd9c8c6f..000000000 --- a/lib/Headers.groovy +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file holds several functions used to render the nf-core ANSI header. - */ - -class Headers { - - private static Map log_colours(Boolean monochrome_logs) { - Map colorcodes = [:] - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['yellow_bold'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - colorcodes['red'] = monochrome_logs ? '' : "\033[1;91m" - return colorcodes - } - - static String nf_core(workflow, monochrome_logs) { - Map colors = log_colours(monochrome_logs) - String.format( - """\n - -${colors.dim}----------------------------------------------------${colors.reset}- - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} - -${colors.dim}----------------------------------------------------${colors.reset}- - """.stripIndent() - ) - } -} - diff --git a/lib/Schema.groovy b/lib/Schema.groovy deleted file mode 100755 index 3f69b2c52..000000000 --- a/lib/Schema.groovy +++ /dev/null @@ -1,184 +0,0 @@ -/* - * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. - */ - -import groovy.json.JsonSlurper - -class Schema { - /* - * This method tries to read a JSON params file - */ - private static LinkedHashMap params_get(String path) { - def params_map = new LinkedHashMap() - try { - params_map = params_try(path) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - /* - Method to actually read in JSON file using Groovy. - Group (as Key), values are all parameters - - Parameter1 as Key, Description as Value - - Parameter2 as Key, Description as Value - .... - Group - - - */ - private static LinkedHashMap params_try(String path) throws Exception { - - def json = new File(path).text - def Map json_params = (Map) new JsonSlurper().parseText(json).get('properties') - - /* Tree looks like this in nf-core schema - * properties <- this is what the first get('properties') gets us - group 1 - properties - description - group 2 - properties - description - group 3 - properties - description - */ - def params_map = new LinkedHashMap() - json_params.each { key, val -> - def Map group = json_params."$key".properties // Gets the property object of the group - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put("$innerkey", [ "$value.type", "$value.description" ]) - } - params_map.put("$key", sub_params) - } - return params_map - } - - private static Integer params_max_chars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def params = params_map.get(group) // This gets the parameters of that particular group - for (par in params.keySet()) { - if (par.size() > max_chars) { - max_chars = par.size() - } - } - } - return max_chars - } - - private static String params_beautify(params_map) { - String output = "" - def max_chars = params_max_chars(params_map) + 1 - for (group in params_map.keySet()) { - output += group + "\n" - def params = params_map.get(group) // This gets the parameters of that particular group - for (par in params.keySet()) { - def type = "[" + params.get(par)[0] + "]" - def description = params.get(par)[1] - output+= " \u001B[1m" + par.padRight(max_chars) + "\u001B[1m" + type.padRight(10) + description + "\n" - } - output += "\n" - } - return output - } - - private static String params_help(path, command) { - String output = "Typical pipeline command:\n\n" - output += " ${command}\n\n" - output += params_beautify(params_get(path)) - } - - private static LinkedHashMap params_summary(workflow, params, run_name) { - def Map summary = [:] - if (workflow.revision) summary['Pipeline Release'] = workflow.revision - summary['Run Name'] = run_name ?: workflow.runName - summary['Design File'] = params.input - summary['Genome'] = params.genome ?: 'Not supplied' - summary['Fasta File'] = params.fasta - summary['GTF File'] = params.gtf - if (params.gene_bed) summary['Gene BED File'] = params.gene_bed - if (params.bwa_index) summary['BWA Index'] = params.bwa_index - if (params.blacklist) summary['Blacklist BED'] = params.blacklist - if (params.bwa_min_score) summary['BWA Min Score'] = params.bwa_min_score - summary['MACS2 Genome Size'] = params.macs_gsize ?: 'Not supplied' - summary['Min Consensus Reps'] = params.min_reps_consensus - if (params.macs_gsize) summary['MACS2 Narrow Peaks'] = params.narrow_peak ? 'Yes' : 'No' - if (!params.narrow_peak) summary['MACS2 Broad Cutoff'] = params.broad_cutoff - if (params.macs_fdr) summary['MACS2 FDR'] = params.macs_fdr - if (params.macs_pvalue) summary['MACS2 P-value'] = params.macs_pvalue - if (params.skip_trimming) { - summary['Trimming Step'] = 'Skipped' - } else { - summary['Trim R1'] = "$params.clip_r1 bp" - summary['Trim R2'] = "$params.clip_r2 bp" - summary["Trim 3' R1"] = "$params.three_prime_clip_r1 bp" - summary["Trim 3' R2"] = "$params.three_prime_clip_r2 bp" - summary['NextSeq Trim'] = "$params.trim_nextseq bp" - } - if (params.seq_center) summary['Sequencing Center'] = params.seq_center - summary['Fragment Size'] = "$params.fragment_size bp" - summary['Fingerprint Bins'] = params.fingerprint_bins - if (params.keep_dups) summary['Keep Duplicates'] = 'Yes' - if (params.keep_multi_map) summary['Keep Multi-mapped'] = 'Yes' - summary['Save Genome Index'] = params.save_reference ? 'Yes' : 'No' - if (params.save_trimmed) summary['Save Trimmed'] = 'Yes' - if (params.save_align_intermeds) summary['Save Intermeds'] = 'Yes' - if (params.save_macs_pileup) summary['Save MACS2 Pileup'] = 'Yes' - if (params.skip_peak_qc) summary['Skip MACS2 Peak QC'] = 'Yes' - if (params.skip_peak_annotation) summary['Skip Peak Annotation'] = 'Yes' - if (params.skip_consensus_peaks) summary['Skip Consensus Peaks'] = 'Yes' - if (params.deseq2_vst) summary['Use DESeq2 vst Transform'] = 'Yes' - if (params.skip_diff_analysis) summary['Skip Differential Analysis'] = 'Yes' - if (params.skip_fastqc) summary['Skip FastQC'] = 'Yes' - if (params.skip_picard_metrics) summary['Skip Picard Metrics'] = 'Yes' - if (params.skip_preseq) summary['Skip Preseq'] = 'Yes' - if (params.skip_plot_profile) summary['Skip plotProfile'] = 'Yes' - if (params.skip_plot_fingerprint) summary['Skip plotFingerprint'] = 'Yes' - if (params.skip_spp) summary['Skip spp'] = 'Yes' - if (params.skip_igv) summary['Skip IGV'] = 'Yes' - if (params.skip_multiqc) summary['Skip MultiQC'] = 'Yes' - summary['Max Resources'] = "$params.max_memory memory, $params.max_cpus cpus, $params.max_time time per job" - if (workflow.containerEngine) summary['Container'] = "$workflow.containerEngine - $workflow.container" - summary['Output dir'] = params.outdir - summary['Launch dir'] = workflow.launchDir - summary['Working dir'] = workflow.workDir - summary['Script dir'] = workflow.projectDir - summary['User'] = workflow.userName - if (workflow.profile.contains('awsbatch')) { - summary['AWS Region'] = params.awsregion - summary['AWS Queue'] = params.awsqueue - summary['AWS CLI'] = params.awscli - } - summary['Config Profile'] = workflow.profile - if (params.config_profile_description) summary['Config Profile Descr'] = params.config_profile_description - if (params.config_profile_contact) summary['Config Profile Contact'] = params.config_profile_contact - if (params.config_profile_url) summary['Config Profile URL'] = params.config_profile_url - summary['Config Files'] = workflow.configFiles.join(', ') - if (params.email || params.email_on_fail) { - summary['E-mail Address'] = params.email - summary['E-mail on failure'] = params.email_on_fail - summary['MultiQC maxsize'] = params.max_multiqc_email_size - } - return summary - } - - static String params_mqc_summary(summary) { - String yaml_file_text = """ - id: 'nf-core-chipseq-summary' - description: " - this information is collected when the pipeline is started." - section_name: 'nf-core/chipseq Workflow Summary' - section_href: 'https://github.com/nf-core/chipseq' - plot_type: 'html' - data: | -
- ${summary.collect { k,v -> "
$k
${v ?: 'N/A'}
" }.join("\n")} -
- """.stripIndent() - - return yaml_file_text - } -} diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 165ec9206..ac77a8869 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -8,13 +8,27 @@ class WorkflowChipseq { // Check and validate parameters // public static void initialise(params, log) { - genomeExistsError(params, log) - macs2_warn(params, log) + if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { + genomeExistsError(log) + } if (!params.fasta) { log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." System.exit(1) } + + if (!params.gtf && !params.gff) { + log.error "No GTF or GFF3 annotation specified! The pipeline requires at least one of these files." + System.exit(1) + } + + if (params.gtf && params.gff) { + gtfGffWarn(log) + } + + if (!params.macs_gsize) { + macsGsizeWarn(log) + } } // @@ -47,28 +61,34 @@ class WorkflowChipseq { // // Exit pipeline if incorrect --genome key provided // - private static void genomeExistsError(params, log) { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" - System.exit(1) - } + private static void genomeExistsError(log) { + log.error "=============================================================================\n" + + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + + " Currently, the available genome keys are:\n" + + " ${params.genomes.keySet().join(", ")}\n" + + "===================================================================================" + System.exit(1) + } + + // + // Print a warning if both GTF and GFF have been provided + // + private static void gtfGffWarn(log) { + log.warn "=============================================================================\n" + + " Both '--gtf' and '--gff' parameters have been provided.\n" + + " Using GTF file as priority.\n" + + "===================================================================================" } // // Show a big warning message if we're not running MACS // - private static void macs2_warn(params, log) { - if (!params.macs_gsize) { - def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' - log.warn "=================================================================\n" + - " WARNING! MACS genome size parameter not $warnstring.\n" + - " Peak calling, annotation and differential analysis will be skipped.\n" + - " Please specify value for '--macs_gsize' to run these steps.\n" + - "=======================================================================" - } + private static void macsGsizeWarn(log) { + def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' + log.warn "=================================================================\n" + + " WARNING! MACS genome size parameter not $warnstring.\n" + + " Peak calling, annotation and differential analysis will be skipped.\n" + + " Please specify value for '--macs_gsize' to run these steps.\n" + + "=======================================================================" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index bc960fcc8..b4a6e4ccc 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -9,9 +9,8 @@ class WorkflowMain { // public static String citation(workflow) { return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - // TODO nf-core: Add Zenodo DOI for pipeline after first release - //"* The pipeline\n" + - //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + + "* The pipeline\n" + + " https://doi.org/10.5281/zenodo.3240506\n\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + diff --git a/main.nf b/main.nf index b7ca23496..f2fe7440c 100755 --- a/main.nf +++ b/main.nf @@ -20,6 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') +params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') params.macs_gsize = WorkflowMain.getGenomeAttribute(params, 'macs_gsize') params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') diff --git a/nextflow.config b/nextflow.config index 327002c23..de649c6ee 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,25 +10,25 @@ params { // Input options input = null - seq_center = '' + seq_center = null fragment_size = 200 fingerprint_bins = 500000 // References - genome = false + genome = null save_reference = false // Options: Trimming - clip_r1 = 0 - clip_r2 = 0 - three_prime_clip_r1 = 0 - three_prime_clip_r2 = 0 - trim_nextseq = 0 + clip_r1 = null + clip_r2 = null + three_prime_clip_r1 = null + three_prime_clip_r2 = null + trim_nextseq = null skip_trimming = false save_trimmed = false // Options: Alignments - bwa_min_score = false + bwa_min_score = null keep_dups = false keep_multi_map = false save_align_intermeds = false @@ -36,8 +36,8 @@ params { // Options: Peaks narrow_peak = false broad_cutoff = 0.1 - macs_fdr = false - macs_pvalue = false + macs_fdr = null + macs_pvalue = null min_reps_consensus = 1 save_macs_pileup = false skip_peak_qc = false @@ -59,42 +59,29 @@ params { skip_multiqc = false // Options: Config - multiqc_config = false bamtools_filter_pe_config = "$projectDir/assets/bamtools_filter_pe.json" bamtools_filter_se_config = "$projectDir/assets/bamtools_filter_se.json" - // Options: Custom config - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_description = false - config_profile_contact = false - config_profile_url = false - // Boilerplate options - help = false outdir = './results' publish_dir_mode = 'copy' - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - max_multiqc_email_size = 25.MB - tracedir = "${params.outdir}/pipeline_info" - email = false - email_on_fail = false + multiqc_config = null + multiqc_title = null + email = null + email_on_fail = null + max_multiqc_email_size = '25.MB' plaintext_email = false monochrome_logs = false - // name = false // TODO remove parameter - hostnames = false + help = false + igenomes_base = 's3://ngi-igenomes/igenomes' + tracedir = "${params.outdir}/pipeline_info" + igenomes_ignore = false validate_params = true show_hidden_params = false schema_ignore_params = 'genomes,modules' enable_conda = false singularity_pull_docker_container = false - - // MultiQC options - multiqc_config = null - multiqc_title = null - max_multiqc_email_size = '25.MB' - + // name = false // TODO remove parameter // Config options custom_config_version = 'master' diff --git a/nextflow_schema.json b/nextflow_schema.json index 1024fcdce..7067f0d60 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -21,7 +21,7 @@ "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 6 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#introduction).", + "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 5 columns, and a header row. See [usage docs](https://nf-co.re/chipseq/docs/usage#introduction).", "fa_icon": "fas fa-file-csv" }, "fragment_size": { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 05d242c0f..c29dad052 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -13,32 +13,15 @@ WorkflowChipseq.initialise(params, log) def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, - params.gtf, params.gene_bed, + params.gtf, params.gff, params.gene_bed, params.bwa_index, params.blacklist, params.bamtools_filter_pe_config, params.bamtools_filter_se_config ] - 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!' } - -// Check fasta reference file -if (params.fasta) { ch_fasta = file(params.fasta, checkIfExists: true) } else { exit 1, 'Fasta file not specified!' } - -// Check gtf annotation file -if (params.gtf) { ch_gtf = file(params.gtf, checkIfExists: true) } else { exit 1, 'GTF annotation file not specified!' } - -// Check bed annotation file -if (params.gene_bed) { ch_gene_bed = file(params.gene_bed, checkIfExists: true) } - -// Check bed blacklist file -if (params.blacklist) { - ch_blacklist = Channel.fromPath(params.blacklist, checkIfExists: true) -} else { - ch_blacklist = Channel.empty() -} +// Check blacklist file +ch_blacklist = params.blacklist ? file(params.blacklist) : Channel.empty() // Save AWS IGenomes file containing annotation version def anno_readme = params.genomes[ params.genome ]?.readme @@ -68,21 +51,19 @@ def peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() -ch_output_docs = file("$projectDir/docs/output.md", checkIfExists: true) -ch_output_docs_images = file("$projectDir/docs/images/", checkIfExists: true) // JSON files required by BAMTools for alignment filtering ch_bamtools_filter_se_config = file(params.bamtools_filter_se_config, checkIfExists: true) ch_bamtools_filter_pe_config = file(params.bamtools_filter_pe_config, checkIfExists: true) // Header files for MultiQC -ch_spp_nsc_header = file("$projectDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) -ch_spp_rsc_header = file("$projectDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) -ch_spp_correlation_header = file("$projectDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) -ch_peak_count_header = file("$projectDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) -ch_frip_score_header = file("$projectDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) -ch_peak_annotation_header = file("$projectDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) -ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) +ch_spp_nsc_header = file("$projectDir/assets/multiqc/spp_nsc_header.txt", checkIfExists: true) +ch_spp_rsc_header = file("$projectDir/assets/multiqc/spp_rsc_header.txt", checkIfExists: true) +ch_spp_correlation_header = file("$projectDir/assets/multiqc/spp_correlation_header.txt", checkIfExists: true) +ch_peak_count_header = file("$projectDir/assets/multiqc/peak_count_header.txt", checkIfExists: true) +ch_frip_score_header = file("$projectDir/assets/multiqc/frip_score_header.txt", checkIfExists: true) +ch_peak_annotation_header = file("$projectDir/assets/multiqc/peak_annotation_header.txt", checkIfExists: true) +ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) /* @@ -115,12 +96,9 @@ include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_home include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) -//include { DESEQ2_FEATURECOUNTS } from '../modules/local/deseq2_featurecounts' addParams( options: [:] ) +//include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) include { IGV } from '../modules/local/igv' addParams( options: [:] ) include { OUTPUT_DOCUMENTATION } from '../modules/local/output_documentation' addParams( options: [:] ) -// include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: modules['get_software_versions'] ) -// TODO template version below to be removed when checked -// include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) @@ -205,7 +183,7 @@ workflow CHIPSEQ { // SUBWORKFLOW: Read in samplesheet, validate and stage input files // INPUT_CHECK ( - ch_input, + file(params.input), params.seq_center, [:] ) From 960b60b3504e7168a350d9482e5e3e0cfdf180df Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 09:34:46 +0100 Subject: [PATCH 207/538] Update samplesheet path in test-datasets --- conf/test.config | 2 +- conf/test_full.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 948346acc..c5c232d96 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = 6.h // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' diff --git a/conf/test_full.config b/conf/test_full.config index ae90a3c6a..452900719 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/design_full.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_full.csv' // Genome references genome = 'hg19' From 608fe2aa2e7dbf0637e7bad1ceaf1b2b2b5e2e13 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 10:32:15 +0100 Subject: [PATCH 208/538] Get tests workfing with new samplesheet format --- bin/check_samplesheet.py | 91 ++-- bin/check_samplesheet_old.py | 173 ------- lib/WorkflowChipseq.groovy | 8 +- modules/local/samplesheet_check.nf | 21 +- subworkflows/local/input_check.nf | 44 +- workflows/chipseq.nf | 784 ++++++++++++++--------------- 6 files changed, 486 insertions(+), 635 deletions(-) delete mode 100755 bin/check_samplesheet_old.py diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 91327e5c6..cab38cff6 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -7,7 +7,7 @@ def parse_args(args=None): - Description = "Reformat nf-core/rnaseq samplesheet file and check its contents." + Description = "Reformat nf-core/chipseq samplesheet file and check its contents." Epilog = "Example usage: python check_samplesheet.py " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) @@ -37,21 +37,22 @@ def check_samplesheet(file_in, file_out): """ This function checks that the samplesheet follows the following structure: - sample,fastq_1,fastq_2,strandedness - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz,forward - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz,forward - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz,,forward + sample,fastq_1,fastq_2,antibody,control + SPT5_T0_REP1,SRR1822153_1.fastq.gz,SRR1822153_2.fastq.gz,SPT5,SPT5_INPUT_REP1 + SPT5_T0_REP2,SRR1822154_1.fastq.gz,SRR1822154_2.fastq.gz,SPT5,SPT5_INPUT_REP2 + SPT5_INPUT_REP1,SRR5204809_Spt5-ChIP_Input1_SacCer_ChIP-Seq_ss100k_R1.fastq.gz,SRR5204809_Spt5-ChIP_Input1_SacCer_ChIP-Seq_ss100k_R2.fastq.gz,, + SPT5_INPUT_REP2,SRR5204810_Spt5-ChIP_Input2_SacCer_ChIP-Seq_ss100k_R1.fastq.gz,SRR5204810_Spt5-ChIP_Input2_SacCer_ChIP-Seq_ss100k_R2.fastq.gz,, For an example see: - https://github.com/nf-core/test-datasets/blob/rnaseq/samplesheet/v3.1/samplesheet_test.csv + https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv """ sample_mapping_dict = {} - with open(file_in, "r", encoding='utf-8-sig') as fin: + with open(file_in, "r", encoding="utf-8-sig") as fin: ## Check header - MIN_COLS = 3 - HEADER = ["sample", "fastq_1", "fastq_2", "strandedness"] + MIN_COLS = 2 + HEADER = ["sample", "fastq_1", "fastq_2", "antibody", "control"] header = [x.strip('"') for x in fin.readline().strip().split(",")] if header[: len(HEADER)] != HEADER: print( @@ -80,7 +81,7 @@ def check_samplesheet(file_in, file_out): ) ## Check sample name entries - sample, fastq_1, fastq_2, strandedness = lspl[: len(HEADER)] + sample, fastq_1, fastq_2, antibody, control = lspl[: len(HEADER)] if sample.find(" ") != -1: print( f"WARNING: Spaces have been replaced by underscores for sample: {sample}" @@ -101,32 +102,42 @@ def check_samplesheet(file_in, file_out): line, ) - ## Check strandedness - strandednesses = ["unstranded", "forward", "reverse"] - if strandedness: - if strandedness not in strandednesses: + ## Check antibody and control columns have valid values + if antibody: + if antibody.find(" ") != -1: + print( + f"WARNING: Spaces have been replaced by underscores for antibody: {antibody}" + ) + antibody = antibody.replace(" ", "_") + if not control: print_error( - f"Strandedness must be one of '{', '.join(strandednesses)}'!", + "Both antibody and control columns must be specified!", + "Line", + line, + ) + if control: + if control.find(" ") != -1: + print( + f"WARNING: Spaces have been replaced by underscores for control: {control}" + ) + control = control.replace(" ", "_") + if not antibody: + print_error( + "Both antibody and control columns must be specified!", "Line", line, ) - else: - print_error( - f"Strandedness has not been specified! Must be one of {', '.join(strandednesses)}.", - "Line", - line, - ) ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2, strandedness] + sample_info = [] ## [single_end, fastq_1, fastq_2, antibody, control] if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2, strandedness] + sample_info = ["0", fastq_1, fastq_2, antibody, control] elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2, strandedness] + sample_info = ["1", fastq_1, fastq_2, antibody, control] else: print_error("Invalid combination of columns provided!", "Line", line) - ## Create sample mapping dictionary = {sample: [[ single_end, fastq_1, fastq_2, strandedness ]]} + ## Create sample mapping dictionary = {sample: [[ single_end, fastq_1, fastq_2, antibody, control ]]} if sample not in sample_mapping_dict: sample_mapping_dict[sample] = [sample_info] else: @@ -141,7 +152,16 @@ def check_samplesheet(file_in, file_out): make_dir(out_dir) with open(file_out, "w") as fout: fout.write( - ",".join(["sample", "single_end", "fastq_1", "fastq_2", "strandedness"]) + ",".join( + [ + "sample", + "single_end", + "fastq_1", + "fastq_2", + "antibody", + "control", + ] + ) + "\n" ) for sample in sorted(sample_mapping_dict.keys()): @@ -157,18 +177,15 @@ def check_samplesheet(file_in, file_out): sample, ) - ## Check that multiple runs of the same sample are of the same strandedness - if not all( - x[-1] == sample_mapping_dict[sample][0][-1] - for x in sample_mapping_dict[sample] - ): - print_error( - f"Multiple runs of a sample must have the same strandedness!", - "Sample", - sample, - ) - for idx, val in enumerate(sample_mapping_dict[sample]): + control = val[-1] + if control and control not in sample_mapping_dict.keys(): + print_error( + f"Control identifier has to match does a provided sample identifier!", + "Control", + control, + ) + fout.write(",".join([f"{sample}_T{idx+1}"] + val) + "\n") else: print_error(f"No entries to process!", "Samplesheet: {file_in}") diff --git a/bin/check_samplesheet_old.py b/bin/check_samplesheet_old.py deleted file mode 100755 index fdbee3889..000000000 --- a/bin/check_samplesheet_old.py +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -import errno -import argparse - - -def parse_args(args=None): - Description = "Reformat nf-core/chipseq samplesheet file and check its contents." - Epilog = "Example usage: python check_samplesheet.py " - - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("FILE_IN", help="Input samplesheet file.") - parser.add_argument("FILE_OUT", help="Output file.") - return parser.parse_args(args) - - -def make_dir(path): - if len(path) > 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise exception - - -def print_error(error, context='Line', context_str=''): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != '' and context_str != '': - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format(error, context.strip(), context_str.strip()) - print(error_str) - sys.exit(1) - - -def check_samplesheet(file_in, file_out): - """ - This function checks that the samplesheet follows the following structure: - - group,replicate,fastq_1,fastq_2,antibody,control - CTCF_IP,1,CTCF_IP_1.fastq.gz,CTCF_IP_2.fastq.gz,CTCF,INPUT - INPUT,1,INPUT_1.fastq.gz,INPUT_IP_2.fastq.gz,, - """ - - sample_run_dict = {} - antibody_dict = {} - with open(file_in, "r") as fin: - - ## Check header - HEADER = ['group', 'replicate', 'fastq_1', 'fastq_2', 'antibody', 'control'] - header = fin.readline().strip().split(",") - if header != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) - sys.exit(1) - - ## Check sample entries - for line in fin: - lspl = [x.strip() for x in line.strip().split(",")] - sample, replicate, fastq_1, fastq_2, antibody, control = lspl - - ## Check valid number of columns per row - if len(lspl) != len(header): - print_error("Invalid number of columns (minimum = {})!".format(len(header)), 'Line', line) - - num_cols = len([x for x in lspl if x]) - if num_cols < 3: - print_error("Invalid number of populated columns (minimum = 3)!", 'Line', line) - - ## Check sample name entries - if sample: - if sample.find(" ") != -1: - print_error("Group entry contains spaces!", 'Line', line) - else: - print_error("Group entry has not been specified!", 'Line', line) - - ## Check replicate entry is integer - if not replicate.isdigit(): - print_error("Replicate id not an integer!", 'Line', line) - replicate = int(replicate) - - ## Check FastQ file extension - for fastq in [fastq_1, fastq_2]: - if fastq: - if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", 'Line', line) - if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error("FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", 'Line', line) - - ## Check antibody and control columns have valid values - if antibody: - if antibody.find(' ') != -1: - print_error("Antibody id contains spaces!", line) - if not control: - print_error("Both antibody and control columns must be specified!", 'Line', line) - if control: - if control.find(' ') != -1: - print_error("Control id contains spaces!", line) - if not antibody: - print_error("Both antibody and control columns must be specified!", 'Line', line) - if antibody and control: - antibody_dict[sample] = (antibody,control) - - ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] - if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] - elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] - else: - print_error("Invalid combination of columns provided!", 'Line', line) - - ## Create sample mapping dictionary = {sample: {replicate : [ single_end, fastq_1, fastq_2 ]}} - if sample not in sample_run_dict: - sample_run_dict[sample] = {} - if replicate not in sample_run_dict[sample]: - sample_run_dict[sample][replicate] = [sample_info] - else: - if sample_info in sample_run_dict[sample][replicate]: - print_error("Samplesheet contains duplicate rows!", 'Line', line) - else: - sample_run_dict[sample][replicate].append(sample_info) - - ## Check if antibody and control columns have been specified at least once - if len(antibody_dict) == 0: - print_error("Antibody and control must be specified at least once!", '', '') - - ## Write validated samplesheet with appropriate columns - antibody_group_dict = {} - if len(sample_run_dict) > 0: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2", "antibody", "control"]) + "\n") - for sample in sorted(sample_run_dict.keys()): - - ## Check that replicate ids are in format 1.. - uniq_rep_ids = set(sample_run_dict[sample].keys()) - if len(uniq_rep_ids) != max(uniq_rep_ids): - print_error("Replicate IDs must start with 1..!", 'Group', sample) - - for replicate in sorted(sample_run_dict[sample].keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_run_dict[sample][replicate][0][0] for x in sample_run_dict[sample][replicate]): - print_error("Multiple runs of a sample must be of the same datatype!", 'Group', sample) - - for idx, sample_info in enumerate(sample_run_dict[sample][replicate]): - sample_id = "{}_R{}_T{}".format(sample,replicate,idx+1) - oList = [sample_id] + sample_info - - ## Extrapolate group column - if sample in antibody_dict: - antibody,control = antibody_dict[sample] - if control in sample_run_dict.keys(): - control_id = "{}_R1".format(control) - if replicate in sample_run_dict[control]: - control_id = "{}_R{}".format(control,replicate) - oList += [antibody, control_id] - else: - print_error("Control id not a valid group: {}!".format(control), 'Valid Groups', sorted(sample_run_dict.keys())) - else: - oList += 2 * [''] - fout.write(','.join(oList) + '\n') - - -def main(args=None): - args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index ac77a8869..7c89baf76 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -9,7 +9,7 @@ class WorkflowChipseq { // public static void initialise(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - genomeExistsError(log) + genomeExistsError(params, log) } if (!params.fasta) { @@ -27,7 +27,7 @@ class WorkflowChipseq { } if (!params.macs_gsize) { - macsGsizeWarn(log) + macsGsizeWarn(params, log) } } @@ -61,7 +61,7 @@ class WorkflowChipseq { // // Exit pipeline if incorrect --genome key provided // - private static void genomeExistsError(log) { + private static void genomeExistsError(params, log) { log.error "=============================================================================\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + @@ -83,7 +83,7 @@ class WorkflowChipseq { // // Show a big warning message if we're not running MACS // - private static void macsGsizeWarn(log) { + private static void macsGsizeWarn(params, log) { def warnstring = params.genome ? "supported for '${params.genome}'" : 'supplied' log.warn "=================================================================\n" + " WARNING! MACS genome size parameter not $warnstring.\n" + diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 5d0ead4dc..533d149e5 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,26 +1,29 @@ -//TODO Update with rnaseq 3.3 version // Import generic module functions include { saveFiles; getProcessName } from './functions' -/* - * Reformat design file, check validitiy and create IP vs control mappings - */ +params.options = [:] + process SAMPLESHEET_CHECK { tag "$samplesheet" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:options, publish_dir:"pipeline_info", publish_id:'') } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } input: path samplesheet - val options output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ check_samplesheet.py \\ $samplesheet \\ diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index fca645273..a20214b73 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -6,44 +6,48 @@ params.options = [:] include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) -/* - * Check input samplesheet and get read channels - */ workflow INPUT_CHECK { take: - ch_input // file: /path/to/samplesheet.csv - seq_center // string: sequencing center for read group - samplesheet_check_options // map: options for check_samplesheet module + samplesheet // file: /path/to/samplesheet.csv + seq_center // string: sequencing center for read group main: - SAMPLESHEET_CHECK (ch_input, samplesheet_check_options) - .splitCsv(header:true, sep:',') - .map { get_samplesheet_paths(it, seq_center) } - .set { ch_reads } + SAMPLESHEET_CHECK ( samplesheet ) + .csv + .splitCsv ( header:true, sep:',' ) + .map { create_fastq_channel(it, seq_center) } + .set { reads } emit: - reads = ch_reads // channel: [ val(meta), [ reads ] ] + reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def get_samplesheet_paths(LinkedHashMap row, String seq_center) { +def create_fastq_channel(LinkedHashMap row, String seq_center) { def meta = [:] - meta.id = row.sample + meta.id = row.sample meta.single_end = row.single_end.toBoolean() - meta.antibody = row.antibody - meta.control = row.control + meta.antibody = row.antibody + meta.control = row.control - def rg = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" + def read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\'" if (seq_center) { - rg = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\\tCN:${seq_center}\'" + read_group = "\'@RG\\tID:${meta.id}\\tSM:${meta.id.split('_')[0..-2].join('_')}\\tPL:ILLUMINA\\tLB:${meta.id}\\tPU:1\\tCN:${seq_center}\'" } - meta.read_group = rg + meta.read_group = read_group def array = [] + if (!file(row.fastq_1).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" + } if (meta.single_end) { - array = [ meta, [ file(row.fastq_1, checkIfExists: true) ] ] + array = [ meta, [ file(row.fastq_1) ] ] } else { - array = [ meta, [ file(row.fastq_1, checkIfExists: true), file(row.fastq_2, checkIfExists: true) ] ] + if (!file(row.fastq_2).exists()) { + exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" + } + array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } return array } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index c29dad052..43186bbd6 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -156,15 +156,15 @@ include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2 include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) // // SUBWORKFLOW: Consisting entirely of nf-core/modules // -include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: modules['trimgalore'] ) -include { MAP_BWA_MEM } from '../subworkflows/nf-core/map_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) -include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) +include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: modules['trimgalore'] ) +include { MAP_BWA_MEM } from '../subworkflows/nf-core/map_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) +include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) /* ======================================================================================== @@ -184,410 +184,410 @@ workflow CHIPSEQ { // INPUT_CHECK ( file(params.input), - params.seq_center, - [:] + params.seq_center ) - - // - // MODULE: Run FastQC - // - // TODO check if this fastqc process from nf-core is needed Don't think so done in FASTQC_TRIMGALORE - // FASTQC ( - // INPUT_CHECK.out.reads + ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) + + // // + // // MODULE: Run FastQC + // // + // // TODO check if this fastqc process from nf-core is needed Don't think so done in FASTQC_TRIMGALORE + // // FASTQC ( + // // INPUT_CHECK.out.reads + // // ) + // // ch_software_versions = ch_software_versions.mix(FASTQC.out.versions.first().ifEmpty(null)) + + // // + // // SUBWORKFLOW: Prepare genome files + // // + // ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta ).index + + // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf ) } + + // MAKE_GENOME_FILTER ( + // GET_CHROM_SIZES ( ch_fasta ).sizes, + // ch_blacklist.ifEmpty([]) + // ) + // // ch_software_versions = Channel.empty() + // // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(MAKE_GENOME_FILTER.out.versions) + + // // + // // SUBWORKFLOW: Read QC & trimming + // // + // nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' + // params.modules['trimgalore'].args += nextseq + // FASTQC_TRIMGALORE ( + // INPUT_CHECK.out.reads, + // params.skip_fastqc, + // params.skip_trimming + // ) + // // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) + + // // + // // SUBWORKFLOW: Map reads & BAM QC + // // + // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + // params.modules['bwa_mem'].args += score + // MAP_BWA_MEM ( + // FASTQC_TRIMGALORE.out.reads, + // ch_index + // ) + // // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_versions.first()) + // // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(MAP_BWA_MEM.out.versions) + + // // + // // SUBWORKFLOW: Merge resequenced BAM files + // // + // MAP_BWA_MEM + // .out + // .bam + // .map { + // meta, bam -> + // fmeta = meta.findAll { it.key != 'read_group' } + // fmeta.id = fmeta.id.split('_')[0..-2].join('_') + // [ fmeta, bam ] } + // .groupTuple(by: [0]) + // .map { it -> [ it[0], it[1].flatten() ] } + // .set { ch_sort_bam } + + // PICARD_MERGESAMFILES ( + // ch_sort_bam + // ) + // // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions) + + // // + // // SUBWORKFLOW: Mark duplicates & filter BAM files + // // + // MARK_DUPLICATES_PICARD ( + // PICARD_MERGESAMFILES.out.bam // ) - // ch_software_versions = ch_software_versions.mix(FASTQC.out.versions.first().ifEmpty(null)) - - // - // SUBWORKFLOW: Prepare genome files - // - ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta ).index - - if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf ) } - - MAKE_GENOME_FILTER ( - GET_CHROM_SIZES ( ch_fasta ).sizes, - ch_blacklist.ifEmpty([]) - ) - // ch_software_versions = Channel.empty() - // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(MAKE_GENOME_FILTER.out.versions) - - // - // SUBWORKFLOW: Read QC & trimming - // - nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - params.modules['trimgalore'].args += nextseq - FASTQC_TRIMGALORE ( - INPUT_CHECK.out.reads, - params.skip_fastqc, - params.skip_trimming - ) - // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) - - // - // SUBWORKFLOW: Map reads & BAM QC - // - score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - params.modules['bwa_mem'].args += score - MAP_BWA_MEM ( - FASTQC_TRIMGALORE.out.reads, - ch_index - ) - // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_versions.first()) - // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(MAP_BWA_MEM.out.versions) - - // - // SUBWORKFLOW: Merge resequenced BAM files - // - MAP_BWA_MEM - .out - .bam - .map { - meta, bam -> - fmeta = meta.findAll { it.key != 'read_group' } - fmeta.id = fmeta.id.split('_')[0..-2].join('_') - [ fmeta, bam ] } - .groupTuple(by: [0]) - .map { it -> [ it[0], it[1].flatten() ] } - .set { ch_sort_bam } - - PICARD_MERGESAMFILES ( - ch_sort_bam - ) - // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions) - - // - // SUBWORKFLOW: Mark duplicates & filter BAM files - // - MARK_DUPLICATES_PICARD ( - PICARD_MERGESAMFILES.out.bam - ) - - // - // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE - // - BAM_CLEAN ( - MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - MAKE_GENOME_FILTER.out.bed.collect(), - ch_bamtools_filter_se_config, - ch_bamtools_filter_pe_config - ) - // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(BAM_CLEAN.out.versions) - - // - // MODULE: Post alignment QC - // - PICARD_COLLECTMULTIPLEMETRICS ( - BAM_CLEAN.out.bam, - ch_fasta - ) - - // TODO Add versions to picard collectmultiplemetrics - - // - // MODULE: Library coverage - // - PRESEQ_LCEXTRAP ( - BAM_CLEAN.out.bam - ) - // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions) - - // - // MODULE: Strand cross-correlation - // - PHANTOMPEAKQUALTOOLS ( - BAM_CLEAN.out.bam - ) - // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions) - - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( - PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), - ch_spp_nsc_header, - ch_spp_rsc_header, - ch_spp_correlation_header - ) - - // - // MODULE: Coverage tracks - // - BEDTOOLS_GENOMECOV ( - BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]) - ) - // - // MODULE: Coverage tracks - // - UCSC_BEDGRAPHTOBIGWIG ( - BEDTOOLS_GENOMECOV.out.bedgraph, - GET_CHROM_SIZES.out.sizes - ) - // ch_software_versions = ch_software_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) + // // + // // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE + // // + // BAM_CLEAN ( + // MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), + // MAKE_GENOME_FILTER.out.bed.collect(), + // ch_bamtools_filter_se_config, + // ch_bamtools_filter_pe_config + // ) + // // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(BAM_CLEAN.out.versions) + + // // + // // MODULE: Post alignment QC + // // + // PICARD_COLLECTMULTIPLEMETRICS ( + // BAM_CLEAN.out.bam, + // ch_fasta + // ) - // - // MODULE: Coverage plots - // - DEEPTOOLS_COMPUTEMATRIX ( - UCSC_BEDGRAPHTOBIGWIG.out.bigwig, - ch_gene_bed - ) - // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions) + // // TODO Add versions to picard collectmultiplemetrics - DEEPTOOLS_PLOTPROFILE ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix - ) + // // + // // MODULE: Library coverage + // // + // PRESEQ_LCEXTRAP ( + // BAM_CLEAN.out.bam + // ) + // // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions) + + // // + // // MODULE: Strand cross-correlation + // // + // PHANTOMPEAKQUALTOOLS ( + // BAM_CLEAN.out.bam + // ) + // // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions) + + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + // PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + // ch_spp_nsc_header, + // ch_spp_rsc_header, + // ch_spp_correlation_header + // ) - DEEPTOOLS_PLOTHEATMAP ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix - ) + // // + // // MODULE: Coverage tracks + // // + // BEDTOOLS_GENOMECOV ( + // BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]) + // ) - // - // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] - // - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - .set { ch_control_bam_bai } - - BAM_CLEAN - .out - .bam - .join ( BAM_CLEAN.out.bai, by: [0] ) - .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - .combine(ch_control_bam_bai, by: 0) - .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - .set { ch_ip_control_bam_bai } + // // + // // MODULE: Coverage tracks + // // + // UCSC_BEDGRAPHTOBIGWIG ( + // BEDTOOLS_GENOMECOV.out.bedgraph, + // GET_CHROM_SIZES.out.sizes + // ) + // // ch_software_versions = ch_software_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) + + // // + // // MODULE: Coverage plots + // // + // DEEPTOOLS_COMPUTEMATRIX ( + // UCSC_BEDGRAPHTOBIGWIG.out.bigwig, + // ch_gene_bed + // ) + // // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions) - // - // plotFingerprint for IP and control together - // - DEEPTOOLS_PLOTFINGERPRINT ( - ch_ip_control_bam_bai - ) + // DEEPTOOLS_PLOTPROFILE ( + // DEEPTOOLS_COMPUTEMATRIX.out.matrix + // ) - if (params.macs_gsize) { - - // - // Call peaks - // - - // Create channel: [ val(meta), ip_bam, control_bam ] - ch_ip_control_bam_bai - .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - .set { ch_ip_control_bam } - - MACS2_CALLPEAK ( - ch_ip_control_bam, - params.macs_gsize - ) - // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions) - - ch_ip_control_bam - .join(MACS2_CALLPEAK.out.peak, by: [0]) - .map { it -> [ it[0], it[1], it[3] ] } - .set { ch_ip_peak } - FRIP_SCORE ( - ch_ip_peak - ) - - ch_ip_peak - .join(FRIP_SCORE.out.txt, by: [0]) - .map { it -> [ it[0], it[2], it[3] ] } - .set { ch_ip_peak_frip } - MULTIQC_CUSTOM_PEAKS ( - ch_ip_peak_frip, - ch_peak_count_header, - ch_frip_score_header - ) - - PLOT_MACS2_QC ( - MACS2_CALLPEAK.out.peak.collect{it[1]} - ) - - HOMER_ANNOTATEPEAKS_MACS2 ( - MACS2_CALLPEAK.out.peak, - ch_fasta, - ch_gtf - ) - // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions) - - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt" - ) - - // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - MACS2_CALLPEAK - .out - .peak - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - .groupTuple() - .map { - antibody, groups, peaks -> - [ - antibody, - groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - peaks - ] } - .map { - antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } - .set { ch_antibody_peaks } - - MACS2_CONSENSUS ( - ch_antibody_peaks - ) - - HOMER_ANNOTATEPEAKS_CONSENSUS ( - MACS2_CONSENSUS.out.bed, - ch_fasta, - ch_gtf - ) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - - // Create channel: [ val(meta), ip_bam ] - MACS2_CONSENSUS - .out - .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .combine(ch_ip_saf) - .map { - it -> - fmeta = it[1] - fmeta['replicates_exist'] = it[4]['replicates_exist'] - fmeta['multiple_groups'] = it[4]['multiple_groups'] - [ fmeta, it[2], it[5] ] } - .set { ch_ip_bam } - - SUBREAD_FEATURECOUNTS ( - ch_ip_bam - ) - // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first().ifEmpty(null)) - ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions) - - // - // DESEQ2_FEATURECOUNTS ( - // params.modules['deseq2_featurecounts'] - // ) - // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + // DEEPTOOLS_PLOTHEATMAP ( + // DEEPTOOLS_COMPUTEMATRIX.out.matrix + // ) - } + // // + // // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // // + // BAM_CLEAN + // .out + // .bam + // .join ( BAM_CLEAN.out.bai, by: [0] ) + // .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } + // .set { ch_control_bam_bai } + + // BAM_CLEAN + // .out + // .bam + // .join ( BAM_CLEAN.out.bai, by: [0] ) + // .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } + // .combine(ch_control_bam_bai, by: 0) + // .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + // .set { ch_ip_control_bam_bai } + + // // + // // plotFingerprint for IP and control together + // // + // DEEPTOOLS_PLOTFINGERPRINT ( + // ch_ip_control_bam_bai + // ) - // - // Create IGV session - // - IGV ( - ch_fasta, - UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - params.modules['ucsc_bedgraphtobigwig'], - params.modules['macs2_callpeak'], - params.modules['macs2_consensus'] - ) + // if (params.macs_gsize) { + + // // + // // Call peaks + // // + + // // Create channel: [ val(meta), ip_bam, control_bam ] + // ch_ip_control_bam_bai + // .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + // .set { ch_ip_control_bam } + + // MACS2_CALLPEAK ( + // ch_ip_control_bam, + // params.macs_gsize + // ) + // // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions) + + // ch_ip_control_bam + // .join(MACS2_CALLPEAK.out.peak, by: [0]) + // .map { it -> [ it[0], it[1], it[3] ] } + // .set { ch_ip_peak } + // FRIP_SCORE ( + // ch_ip_peak + // ) + + // ch_ip_peak + // .join(FRIP_SCORE.out.txt, by: [0]) + // .map { it -> [ it[0], it[2], it[3] ] } + // .set { ch_ip_peak_frip } + // MULTIQC_CUSTOM_PEAKS ( + // ch_ip_peak_frip, + // ch_peak_count_header, + // ch_frip_score_header + // ) + + // PLOT_MACS2_QC ( + // MACS2_CALLPEAK.out.peak.collect{it[1]} + // ) + + // HOMER_ANNOTATEPEAKS_MACS2 ( + // MACS2_CALLPEAK.out.peak, + // ch_fasta, + // ch_gtf + // ) + // // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions) + + // PLOT_HOMER_ANNOTATEPEAKS ( + // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + // ch_peak_annotation_header, + // "_peaks.annotatePeaks.txt" + // ) + + // // Create channel: [ meta , [ peaks ] ] + // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + // MACS2_CALLPEAK + // .out + // .peak + // .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + // .groupTuple() + // .map { + // antibody, groups, peaks -> + // [ + // antibody, + // groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + // peaks + // ] } + // .map { + // antibody, groups, peaks -> + // def meta = [:] + // meta.id = antibody + // meta.multiple_groups = groups.size() > 1 + // meta.replicates_exist = groups.max { groups.value }.value > 1 + // [ meta, peaks ] } + // .set { ch_antibody_peaks } + + // MACS2_CONSENSUS ( + // ch_antibody_peaks + // ) + + // HOMER_ANNOTATEPEAKS_CONSENSUS ( + // MACS2_CONSENSUS.out.bed, + // ch_fasta, + // ch_gtf + // ) + // // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + // // Create channel: [ val(meta), ip_bam ] + // MACS2_CONSENSUS + // .out + // .saf + // .map { meta, saf -> [ meta.id, meta, saf ] } + // .set { ch_ip_saf } + + // ch_ip_control_bam + // .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + // .combine(ch_ip_saf) + // .map { + // it -> + // fmeta = it[1] + // fmeta['replicates_exist'] = it[4]['replicates_exist'] + // fmeta['multiple_groups'] = it[4]['multiple_groups'] + // [ fmeta, it[2], it[5] ] } + // .set { ch_ip_bam } + + // SUBREAD_FEATURECOUNTS ( + // ch_ip_bam + // ) + // // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first().ifEmpty(null)) + // ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions) + + // // + // // DESEQ2_FEATURECOUNTS ( + // // params.modules['deseq2_featurecounts'] + // // ) + // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + + // } + + // // + // // Create IGV session + // // + // IGV ( + // ch_fasta, + // UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + // params.modules['ucsc_bedgraphtobigwig'], + // params.modules['macs2_callpeak'], + // params.modules['macs2_consensus'] + // ) - // - // MODULE: Pipeline reporting - // - // ch_software_versions - // .map { it -> if (it) [ it.baseName, it ] } - // .groupTuple() - // .map { it[1][0] } - // .flatten() - // .collect() - // .set { ch_software_versions } - - // GET_SOFTWARE_VERSIONS ( - // ch_software_versions.map { it }.collect() //, - // // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick + // // + // // MODULE: Pipeline reporting + // // + // // ch_software_versions + // // .map { it -> if (it) [ it.baseName, it ] } + // // .groupTuple() + // // .map { it[1][0] } + // // .flatten() + // // .collect() + // // .set { ch_software_versions } + + // // GET_SOFTWARE_VERSIONS ( + // // ch_software_versions.map { it }.collect() //, + // // // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick + // // ) + // CUSTOM_DUMPSOFTWAREVERSIONS ( + // ch_versions.unique().collectFile() // ) - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile() - ) - OUTPUT_DOCUMENTATION ( - ch_output_docs, - ch_output_docs_images - ) + // OUTPUT_DOCUMENTATION ( + // ch_output_docs, + // ch_output_docs_images + // ) - // - // MODULE: MultiQC - // - // ch_multiqc_files = Channel.empty() - // ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) - // ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - - if (!params.skip_multiqc) { - workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) - - MULTIQC ( - ch_multiqc_config, - ch_multiqc_custom_config.collect().ifEmpty([]), - CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - - FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - - MAP_BWA_MEM.out.stats.collect{it[1]}, - MAP_BWA_MEM.out.flagstat.collect{it[1]}, - MAP_BWA_MEM.out.idxstats.collect{it[1]}, - - MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), - - BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), - BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), - PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), - - PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - - MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), - // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - ) - multiqc_report = MULTIQC.out.report.toList() - } + // // + // // MODULE: MultiQC + // // + // // ch_multiqc_files = Channel.empty() + // // ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + // // ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + + // if (!params.skip_multiqc) { + // workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) + // ch_workflow_summary = Channel.value(workflow_summary) + + // MULTIQC ( + // ch_multiqc_config, + // ch_multiqc_custom_config.collect().ifEmpty([]), + // CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), + // ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + + // FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + // FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + // FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + + // MAP_BWA_MEM.out.stats.collect{it[1]}, + // MAP_BWA_MEM.out.flagstat.collect{it[1]}, + // MAP_BWA_MEM.out.idxstats.collect{it[1]}, + + // MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + // MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + + // BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), + // BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), + // BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), + // PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + + // PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + // DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + // DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + // PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), + + // MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + // MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), + // PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + // SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + // ) + // multiqc_report = MULTIQC.out.report.toList() + // } } /* From 5463b5a661cd75708c20a19915d88ea43ac48687 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 10:47:24 +0100 Subject: [PATCH 209/538] Make linters happy --- README.md | 2 +- docs/usage.md | 1 - nextflow_schema.json | 23 +++++++++++++++++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5ab753299..5af5d8b22 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ **nfcore/chipseq** is a bioinformatics analysis pipeline used for Chromatin ImmunopreciPitation sequencing (ChIP-seq) data. -On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/chipseq#full-test-dataset-origin) obtained from the SRA on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from running the full-sized tests can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). +On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/chipseq#full-test-dataset-origin) on the AWS cloud infrastructure. The dataset consists of FoxA1 (transcription factor) and EZH2 (histone,mark) IP experiments from _Franco et al. 2015_ ([GEO: GSE59530](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE59530), [PMID: 25752574](https://pubmed.ncbi.nlm.nih.gov/25752574/)) and _Popovic et al. 2014_ ([GEO: GSE57632](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE57632), [PMID: 25188243](https://pubmed.ncbi.nlm.nih.gov/25188243/)), respectively. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from running the full-sized tests can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! diff --git a/docs/usage.md b/docs/usage.md index be0b64545..29975a438 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -4,7 +4,6 @@ > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ - ## Samplesheet input You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 5 columns, and a header row as shown in the examples below. diff --git a/nextflow_schema.json b/nextflow_schema.json index 7067f0d60..ad9c90f75 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -73,15 +73,27 @@ "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", + "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have the appropriate alignment index available this will be generated for you automatically. Combine with `--save_reference` to save alignment index for future runs.", "fa_icon": "far fa-file-code" }, "gtf": { "type": "string", + "format": "file-path", + "mimetype": "text/plain", + "pattern": "^\\S+\\.gtf(\\.gz)?$", "description": "Path to GTF annotation file.", - "fa_icon": "fas fa-file-invoice", + "fa_icon": "fas fa-code-branch", "help_text": "This parameter is *mandatory* if `--genome` is not specified." }, + "gff": { + "type": "string", + "format": "file-path", + "mimetype": "text/plain", + "pattern": "^\\S+\\.gff(\\.gz)?$", + "fa_icon": "fas fa-code-branch", + "description": "Path to GFF3 annotation file.", + "help_text": "This parameter must be specified if `--genome` or `--gtf` are not specified." + }, "bwa_index": { "type": "string", "description": "Full path to directory containing BWA index including base name. i.e. `/path/to/index/genome.fa`.", @@ -89,8 +101,11 @@ }, "gene_bed": { "type": "string", - "description": "Path to BED file containing gene intervals. This will be created from the GTF file if not specified.", - "fa_icon": "fas fa-procedures" + "format": "file-path", + "mimetype": "text/plain", + "pattern": "^\\S+\\.bed(\\.gz)?$", + "fa_icon": "fas fa-procedures", + "description": "Path to BED file containing gene intervals. This will be created from the GTF file if not specified." }, "macs_gsize": { "type": "number", From 14120742649607dfb7635615fd22b7d6dd8db0c1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 11:01:39 +0100 Subject: [PATCH 210/538] Fix tyop --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5af5d8b22..0a637910a 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ```bash nextflow run nf-core/chipseq \ - --input samplsheet.csv \ + --input samplesheet.csv \ --genome GRCh37 \ -profile ``` From 12aeea76cf64d5096d975948f7b40470cf17be45 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 13:59:51 +0100 Subject: [PATCH 211/538] Update nf-core modules --- modules/nf-core/modules/bwa/index/meta.yml | 1 + modules/nf-core/modules/bwa/mem/meta.yml | 1 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/fastqc/meta.yml | 1 + modules/nf-core/modules/gffread/functions.nf | 78 +++++++++++++++++++ modules/nf-core/modules/gffread/main.nf | 40 ++++++++++ modules/nf-core/modules/gffread/meta.yml | 33 ++++++++ modules/nf-core/modules/gunzip/functions.nf | 78 +++++++++++++++++++ modules/nf-core/modules/gunzip/main.nf | 41 ++++++++++ modules/nf-core/modules/gunzip/meta.yml | 28 +++++++ .../modules/homer/annotatepeaks/meta.yml | 1 + modules/nf-core/modules/multiqc/meta.yml | 1 + .../picard/collectmultiplemetrics/meta.yml | 1 + .../modules/picard/markduplicates/meta.yml | 1 + .../modules/picard/mergesamfiles/meta.yml | 1 + .../modules/samtools/flagstat/meta.yml | 1 + .../modules/samtools/idxstats/meta.yml | 1 + .../nf-core/modules/samtools/index/meta.yml | 1 + .../nf-core/modules/samtools/sort/meta.yml | 1 + .../nf-core/modules/samtools/stats/meta.yml | 1 + modules/nf-core/modules/trimgalore/meta.yml | 1 + modules/nf-core/modules/untar/functions.nf | 78 +++++++++++++++++++ modules/nf-core/modules/untar/main.nf | 41 ++++++++++ modules/nf-core/modules/untar/meta.yml | 28 +++++++ 24 files changed, 460 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/gffread/functions.nf create mode 100644 modules/nf-core/modules/gffread/main.nf create mode 100644 modules/nf-core/modules/gffread/meta.yml create mode 100644 modules/nf-core/modules/gunzip/functions.nf create mode 100644 modules/nf-core/modules/gunzip/main.nf create mode 100644 modules/nf-core/modules/gunzip/meta.yml create mode 100644 modules/nf-core/modules/untar/functions.nf create mode 100644 modules/nf-core/modules/untar/main.nf create mode 100644 modules/nf-core/modules/untar/meta.yml diff --git a/modules/nf-core/modules/bwa/index/meta.yml b/modules/nf-core/modules/bwa/index/meta.yml index c3c0a8d8a..11d62df37 100644 --- a/modules/nf-core/modules/bwa/index/meta.yml +++ b/modules/nf-core/modules/bwa/index/meta.yml @@ -13,6 +13,7 @@ tools: homepage: http://bio-bwa.sourceforge.net/ documentation: http://www.htslib.org/doc/samtools.html arxiv: arXiv:1303.3997 + licence: ['GPL-3.0-or-later'] input: - fasta: type: file diff --git a/modules/nf-core/modules/bwa/mem/meta.yml b/modules/nf-core/modules/bwa/mem/meta.yml index 662385073..61eaddef6 100644 --- a/modules/nf-core/modules/bwa/mem/meta.yml +++ b/modules/nf-core/modules/bwa/mem/meta.yml @@ -16,6 +16,7 @@ tools: homepage: http://bio-bwa.sourceforge.net/ documentation: http://www.htslib.org/doc/samtools.html arxiv: arXiv:1303.3997 + licence: ['GPL-3.0-or-later'] input: - meta: type: map diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 8d4a6ed42..c8310e356 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - + licence: ['MIT'] input: - versions: type: file diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 0ae08aee5..b09553a3c 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map diff --git a/modules/nf-core/modules/gffread/functions.nf b/modules/nf-core/modules/gffread/functions.nf new file mode 100644 index 000000000..85628ee0e --- /dev/null +++ b/modules/nf-core/modules/gffread/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/gffread/main.nf b/modules/nf-core/modules/gffread/main.nf new file mode 100644 index 000000000..4133ee087 --- /dev/null +++ b/modules/nf-core/modules/gffread/main.nf @@ -0,0 +1,40 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process GFFREAD { + tag "$gff" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::gffread=0.12.1" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/gffread:0.12.1--h8b12597_0" + } else { + container "quay.io/biocontainers/gffread:0.12.1--h8b12597_0" + } + + input: + path gff + + output: + path "*.gtf" , emit: gtf + path "versions.yml" , emit: versions + + script: + def prefix = options.suffix ? "${gff.baseName}${options.suffix}" : "${gff.baseName}" + """ + gffread \\ + $gff \\ + $options.args \\ + -o ${prefix}.gtf + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(gffread --version 2>&1) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gffread/meta.yml b/modules/nf-core/modules/gffread/meta.yml new file mode 100644 index 000000000..bf1a15cba --- /dev/null +++ b/modules/nf-core/modules/gffread/meta.yml @@ -0,0 +1,33 @@ +name: gffread +description: Validate, filter, convert and perform various other operations on GFF files +keywords: + - gff + - conversion + - validation +tools: + - gffread: + description: GFF/GTF utility providing format conversions, region filtering, FASTA sequence extraction and more. + homepage: http://ccb.jhu.edu/software/stringtie/gff.shtml#gffread + documentation: http://ccb.jhu.edu/software/stringtie/gff.shtml#gffread + tool_dev_url: https://github.com/gpertea/gffread + doi: 10.12688/f1000research.23297.1 + licence: ['MIT'] + +input: + - gff: + type: file + description: A reference file in either the GFF3, GFF2 or GTF format. + pattern: "*.{gff, gtf}" + +output: + - gtf: + type: file + description: GTF file resulting from the conversion of the GFF input file + pattern: "*.{gtf}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@emiller88" diff --git a/modules/nf-core/modules/gunzip/functions.nf b/modules/nf-core/modules/gunzip/functions.nf new file mode 100644 index 000000000..85628ee0e --- /dev/null +++ b/modules/nf-core/modules/gunzip/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/gunzip/main.nf b/modules/nf-core/modules/gunzip/main.nf new file mode 100644 index 000000000..aec4569fa --- /dev/null +++ b/modules/nf-core/modules/gunzip/main.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process GUNZIP { + tag "$archive" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + } else { + container "biocontainers/biocontainers:v1.2.0_cv1" + } + + input: + path archive + + output: + path "$gunzip", emit: gunzip + path "versions.yml" , emit: versions + + script: + gunzip = archive.toString() - '.gz' + """ + gunzip \\ + -f \\ + $options.args \\ + $archive + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/gunzip/meta.yml b/modules/nf-core/modules/gunzip/meta.yml new file mode 100644 index 000000000..3482f0d28 --- /dev/null +++ b/modules/nf-core/modules/gunzip/meta.yml @@ -0,0 +1,28 @@ +name: gunzip +description: Compresses and decompresses files. +keywords: + - gunzip + - compression +tools: + - gunzip: + description: | + gzip is a file format and a software application used for file compression and decompression. + documentation: https://www.gnu.org/software/gzip/manual/gzip.html + licence: ['GPL-3.0-or-later'] +input: + - archive: + type: file + description: File to be compressed/uncompressed + pattern: "*.*" +output: + - gunzip: + type: file + description: Compressed/uncompressed file + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/modules/homer/annotatepeaks/meta.yml b/modules/nf-core/modules/homer/annotatepeaks/meta.yml index 39fe4197e..c3ab9460e 100644 --- a/modules/nf-core/modules/homer/annotatepeaks/meta.yml +++ b/modules/nf-core/modules/homer/annotatepeaks/meta.yml @@ -10,6 +10,7 @@ tools: HOMER (Hypergeometric Optimization of Motif EnRichment) is a suite of tools for Motif Discovery and next-gen sequencing analysis. documentation: http://homer.ucsd.edu/homer/ doi: 10.1016/j.molcel.2010.05.004. + licence: ['GPL-3.0-or-later'] input: - meta: type: map diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index a54f95aca..63c75a450 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 587983a19..613afc622 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -14,6 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index 13f2d3502..c9a08b36f 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -14,6 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/picard/mergesamfiles/meta.yml b/modules/nf-core/modules/picard/mergesamfiles/meta.yml index f732daf4c..3d010c3ce 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/meta.yml +++ b/modules/nf-core/modules/picard/mergesamfiles/meta.yml @@ -12,6 +12,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/flagstat/meta.yml b/modules/nf-core/modules/samtools/flagstat/meta.yml index d408cb764..9bd9ff891 100644 --- a/modules/nf-core/modules/samtools/flagstat/meta.yml +++ b/modules/nf-core/modules/samtools/flagstat/meta.yml @@ -16,6 +16,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/idxstats/meta.yml b/modules/nf-core/modules/samtools/idxstats/meta.yml index f4cb613f2..ec542f34b 100644 --- a/modules/nf-core/modules/samtools/idxstats/meta.yml +++ b/modules/nf-core/modules/samtools/idxstats/meta.yml @@ -17,6 +17,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 5f4dd3fbc..988e8f53b 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -14,6 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index cd47c86d1..3402a0680 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -14,6 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index d75d73e25..ae41498a2 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -15,6 +15,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] input: - meta: type: map diff --git a/modules/nf-core/modules/trimgalore/meta.yml b/modules/nf-core/modules/trimgalore/meta.yml index 7c46bea92..c7e1df1de 100644 --- a/modules/nf-core/modules/trimgalore/meta.yml +++ b/modules/nf-core/modules/trimgalore/meta.yml @@ -13,6 +13,7 @@ tools: MspI-digested RRBS-type (Reduced Representation Bisufite-Seq) libraries. homepage: https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/ documentation: https://github.com/FelixKrueger/TrimGalore/blob/master/Docs/Trim_Galore_User_Guide.md + licence: ['GPL-3.0-or-later'] input: - meta: type: map diff --git a/modules/nf-core/modules/untar/functions.nf b/modules/nf-core/modules/untar/functions.nf new file mode 100644 index 000000000..85628ee0e --- /dev/null +++ b/modules/nf-core/modules/untar/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf new file mode 100644 index 000000000..efb9d8251 --- /dev/null +++ b/modules/nf-core/modules/untar/main.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process UNTAR { + tag "$archive" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + } else { + container "biocontainers/biocontainers:v1.2.0_cv1" + } + + input: + path archive + + output: + path "$untar" , emit: untar + path "versions.yml", emit: versions + + script: + untar = archive.toString() - '.tar.gz' + """ + tar \\ + -xzvf \\ + $options.args \\ + $archive + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml new file mode 100644 index 000000000..51f94995e --- /dev/null +++ b/modules/nf-core/modules/untar/meta.yml @@ -0,0 +1,28 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ['GPL-3.0-or-later'] +input: + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" +output: + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" From e93520f5f551c24f2b95b1e5c5ed7caa4b00841c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 14:00:08 +0100 Subject: [PATCH 212/538] Update local modules --- modules/local/genome_blacklist_regions.nf | 51 +++++++++++++++++++++++ modules/local/get_chrom_sizes.nf | 15 ++++--- modules/local/gtf2bed.nf | 6 +-- 3 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 modules/local/genome_blacklist_regions.nf diff --git a/modules/local/genome_blacklist_regions.nf b/modules/local/genome_blacklist_regions.nf new file mode 100644 index 000000000..e28a749b9 --- /dev/null +++ b/modules/local/genome_blacklist_regions.nf @@ -0,0 +1,51 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] + +/* + * Prepare genome intervals for filtering by removing regions in blacklist file + */ +process GENOME_BLACKLIST_REGIONS { + tag "$sizes" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0" + } else { + container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0" + } + + input: + path sizes + path blacklist + + output: + path '*.bed' , emit: bed + path "versions.yml", emit: versions + + script: + def file_out = "${sizes.simpleName}.include_regions.bed" + if (blacklist) { + """ + sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ + } else { + """ + awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ + } +} diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 4f23f478a..b9fa2ac92 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -3,20 +3,17 @@ include { saveFiles; getProcessName } from './functions' params.options = [:] -/* - * Get chromosome sizes from a fasta file - */ process GET_CHROM_SIZES { tag "$fasta" publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) + conda (params.enable_conda ? "bioconda::samtools=1.10" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" + container "https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" + container "quay.io/biocontainers/samtools:1.10--h9402c20_2" } input: @@ -28,9 +25,11 @@ process GET_CHROM_SIZES { path "versions.yml", emit: versions script: - def software = 'samtools' """ - samtools faidx $fasta + samtools \\ + faidx \\ + $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index 903ac65b9..ea2519c81 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -3,9 +3,6 @@ include { saveFiles; getProcessName } from './functions' params.options = [:] -/* - * Convert GTF file to BED format - */ process GTF2BED { tag "$gtf" label 'process_low' @@ -24,7 +21,8 @@ process GTF2BED { path gtf output: - path '*.bed' + path '*.bed' , emit: bed + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ From de8c21750d9b78309f2ebab2205bf1ae5691565d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 14:01:47 +0100 Subject: [PATCH 213/538] Add prepare_genome subworkflow and get running until trimming --- conf/modules.config | 158 +++++------ modules.json | 37 ++- modules/local/make_genome_filter.nf | 52 ---- modules/local/output_documentation.nf | 27 -- .../{bam_clean.nf => filter_bam_bamtools.nf} | 2 +- subworkflows/local/prepare_genome.nf | 141 ++++++++++ .../{map_bwa_mem.nf => align_bwa_mem.nf} | 2 +- subworkflows/nf-core/fastqc_trimgalore.nf | 56 ++-- workflows/chipseq.nf | 245 ++++++++---------- 9 files changed, 377 insertions(+), 343 deletions(-) delete mode 100644 modules/local/make_genome_filter.nf delete mode 100644 modules/local/output_documentation.nf rename subworkflows/local/{bam_clean.nf => filter_bam_bamtools.nf} (98%) create mode 100644 subworkflows/local/prepare_genome.nf rename subworkflows/nf-core/{map_bwa_mem.nf => align_bwa_mem.nf} (98%) diff --git a/conf/modules.config b/conf/modules.config index ae0f6c356..24c18c3a3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,143 +22,147 @@ params { modules { + 'gffread' { + args = '--keep-exon-attrs -F -T' + publish_dir = 'genome' + } + 'bwa_index' { + args = "-a bwtsw" + publish_dir = "genome/index" + } 'fastqc' { - args = "--quiet" + args = "--quiet" } 'trimgalore' { - args = "--fastqc" - } - 'bwa_index' { - args = "-a bwtsw" - publish_dir = "genome/bwa_index" + args = "--fastqc" } 'bwa_mem' { - args = "-M" - args2 = "-h -F 0x0100 -O BAM" - publish_dir = "bwa/library" - suffix = ".Lb" + args = "-M" + args2 = "-h -F 0x0100 -O BAM" + publish_dir = "bwa/library" + suffix = ".Lb" } 'samtools_sort_lib' { - publish_dir = "bwa/library" - suffix = ".Lb.sorted" + publish_dir = "bwa/library" + suffix = ".Lb.sorted" } 'picard_mergesamfiles' { - args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.sorted" + args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.sorted" } 'picard_markduplicates' { - args = "--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.mkD.sorted" + args = "--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" } 'samtools_sort_merged_lib' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.mkD.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.mkD.sorted" } 'bam_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.flT.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.flT.sorted" } 'bam_remove_orphans' { - args = "--only_fr_pairs" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN" + args = "--only_fr_pairs" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN" } 'samtools_sort_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN.sorted" + publish_dir = "bwa/mergedLibrary" + suffix = ".mLb.clN.sorted" } 'picard_collectmultiplemetrics' { - args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary/picard_metrics" - suffix = ".mLb.clN.sorted" + args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" + publish_dir = "bwa/mergedLibrary/picard_metrics" + suffix = ".mLb.clN.sorted" } 'preseq_lcextrap' { - args = "-verbose -bam -seed 1" - publish_dir = "bwa/mergedLibrary/preseq" - suffix = ".mLb.clN" + args = "-verbose -bam -seed 1" + publish_dir = "bwa/mergedLibrary/preseq" + suffix = ".mLb.clN" } 'phantompeakqualtools' { - publish_dir = "bwa/mergedLibrary/phantompeakqualtools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/phantompeakqualtools" + suffix = ".mLb.clN" } 'multiqc_custom_phantompeakqualtools' { - publish_dir = "multiqc" - publish_files = [:] + publish_dir = "multiqc" + publish_files = [:] } 'bedtools_genomecov' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" } 'ucsc_bedgraphtobigwig' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/bigwig" + suffix = ".mLb.clN" } 'deeptools_computematrix' { - args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotprofile' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotheatmap' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'deeptools_plotfingerprint' { - args = "--skipZeros" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" + args = "--skipZeros" + publish_dir = "bwa/mergedLibrary/deeptools" + suffix = ".mLb.clN" } 'macs2_callpeak' { - args = "--keep-dup all" - publish_dir = "bwa/mergedLibrary/macs2" + args = "--keep-dup all" + publish_dir = "bwa/mergedLibrary/macs2" } 'frip_score' { - args = "-bed -c -f 0.20" - publish_dir = "frip" - publish_files = [:] + args = "-bed -c -f 0.20" + publish_dir = "frip" + publish_files = [:] } 'multiqc_custom_peaks' { - publish_dir = "multiqc" - publish_files = [:] + publish_dir = "multiqc" + publish_files = [:] } 'plot_macs2_qc' { - args = "-o ./ -p macs2_peak" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-o ./ -p macs2_peak" + publish_dir = "bwa/mergedLibrary/macs2" } 'homer_annotatepeaks_macs2' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - suffix = "_peaks" + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + suffix = "_peaks" } 'plot_homer_annotatepeaks' { - args = "-o ./ -p macs2_annotatePeaks" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-o ./ -p macs2_annotatePeaks" + publish_dir = "bwa/mergedLibrary/macs2" } 'macs2_consensus' { - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true } 'homer_annotatepeaks_consensus' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true - suffix = ".consensus_peaks" + args = "-gid" + publish_dir = "bwa/mergedLibrary/macs2" + publish_by_id = true + suffix = ".consensus_peaks" } 'subread_featurecounts' { - args = "-F SAF -O --fracOverlap 0.2" - publish_dir = "bwa/mergedLibrary/macs2" + args = "-F SAF -O --fracOverlap 0.2" + publish_dir = "bwa/mergedLibrary/macs2" + } + 'deseq2_featurecounts' { + publish_dir = "bwa/mergedLibrary/macs2" } - //'deseq2_featurecounts' { - // publish_dir = "bwa/mergedLibrary/macs2" - //} 'multiqc' { args = '' - publish_dir = "multiqc" + publish_dir = "multiqc" } } } diff --git a/modules.json b/modules.json index 832103e19..1d5fdedc8 100644 --- a/modules.json +++ b/modules.json @@ -4,13 +4,13 @@ "repos": { "nf-core/modules": { "bwa/index": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "bwa/mem": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "custom/dumpsoftwareversions": { - "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "deeptools/computematrix": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" @@ -25,55 +25,64 @@ "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, "fastqc": { + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + }, + "gffread": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, + "gunzip": { + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + }, "homer/annotatepeaks": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "macs2/callpeak": { "git_sha": "7b3315591a149609e27914965f858c9a7e071564" }, "multiqc": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "phantompeakqualtools": { "git_sha": "7b3315591a149609e27914965f858c9a7e071564" }, "picard/collectmultiplemetrics": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "picard/markduplicates": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "picard/mergesamfiles": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "preseq/lcextrap": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, "samtools/flagstat": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/idxstats": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/index": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/sort": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "samtools/stats": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "subread/featurecounts": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, "trimgalore": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, "ucsc/bedgraphtobigwig": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + }, + "untar": { + "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" } } } diff --git a/modules/local/make_genome_filter.nf b/modules/local/make_genome_filter.nf deleted file mode 100644 index 1b85b3db2..000000000 --- a/modules/local/make_genome_filter.nf +++ /dev/null @@ -1,52 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] - -/* - * Prepare genome intervals for filtering by removing regions in blacklist file - */ -process MAKE_GENOME_FILTER { - tag "$sizes" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0" - } else { - container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0" - } - - input: - path sizes - path blacklist - - output: - path '*.bed' , emit: bed - path "versions.yml", emit: versions - - script: - def software = 'bedtools' - def file_out = "${sizes.simpleName}.include_regions.bed" - if (params.blacklist) { - """ - sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out - - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS - """ - } else { - """ - awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out - - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS - """ - } -} diff --git a/modules/local/output_documentation.nf b/modules/local/output_documentation.nf deleted file mode 100644 index 7a90e8b47..000000000 --- a/modules/local/output_documentation.nf +++ /dev/null @@ -1,27 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] - -/* - * Output Markdown documentation to HTML - */ -process OUTPUT_DOCUMENTATION { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) // TODO update with pointers to singularity and docker container needs markdown library - - input: - path output_docs - path images - - output: - path "results_description.html" - - script: - """ - markdown_to_html.py $output_docs -o results_description.html - """ -} diff --git a/subworkflows/local/bam_clean.nf b/subworkflows/local/filter_bam_bamtools.nf similarity index 98% rename from subworkflows/local/bam_clean.nf rename to subworkflows/local/filter_bam_bamtools.nf index d53912588..63da2f8f8 100644 --- a/subworkflows/local/bam_clean.nf +++ b/subworkflows/local/filter_bam_bamtools.nf @@ -11,7 +11,7 @@ include { BAM_FILTER } from '../../modules/local/bam_filter' add include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' addParams( options: params.bam_remove_orphans_options ) include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) -workflow BAM_CLEAN { +workflow FILTER_BAM_BAMTOOLS { take: ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] ch_bed // channel: [ bed ] diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf new file mode 100644 index 000000000..a8241dab2 --- /dev/null +++ b/subworkflows/local/prepare_genome.nf @@ -0,0 +1,141 @@ +// +// Uncompress and prepare reference genome files +// + +params.genome_options = [:] +params.index_options = [:] +params.gffread_options = [:] +params.bwa_index_options = [:] + +include { + GUNZIP as GUNZIP_FASTA + GUNZIP as GUNZIP_GTF + GUNZIP as GUNZIP_GFF + GUNZIP as GUNZIP_GENE_BED + GUNZIP as GUNZIP_BLACKLIST } from '../../modules/nf-core/modules/gunzip/main' addParams( options: params.genome_options ) +include { UNTAR } from '../../modules/nf-core/modules/untar/main' addParams( options: params.index_options ) +include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' addParams( options: params.gffread_options ) +include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' addParams( options: params.bwa_index_options ) + +include { GTF2BED } from '../../modules/local/gtf2bed' addParams( options: params.genome_options ) +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' addParams( options: params.genome_options ) +include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' addParams( options: params.genome_options ) + +workflow PREPARE_GENOME { + + main: + + ch_versions = Channel.empty() + + // + // Uncompress genome fasta file if required + // + if (params.fasta.endsWith('.gz')) { + ch_fasta = GUNZIP_FASTA ( params.fasta ).gunzip + ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) + } else { + ch_fasta = file(params.fasta) + } + + // + // Uncompress GTF annotation file or create from GFF3 if required + // + if (params.gtf) { + if (params.gtf.endsWith('.gz')) { + ch_gtf = GUNZIP_GTF ( params.gtf ).gunzip + ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) + } else { + ch_gtf = file(params.gtf) + } + } else if (params.gff) { + if (params.gff.endsWith('.gz')) { + ch_gff = GUNZIP_GFF ( params.gff ).gunzip + ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) + } else { + ch_gff = file(params.gff) + } + ch_gtf = GFFREAD ( ch_gff ).gtf + ch_versions = ch_versions.mix(GFFREAD.out.versions) + } + + // + // Uncompress blacklist file if required + // + ch_blacklist = Channel.empty() + if (params.blacklist) { + if (params.blacklist.endsWith('.gz')) { + ch_blacklist = GUNZIP_BLACKLIST ( params.blacklist ).gunzip + ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) + } else { + ch_blacklist = file(params.blacklist) + } + } + + // + // Uncompress gene BED annotation file or create from GTF if required + // + + // If --gtf is supplied along with --genome + // Make gene bed from supplied --gtf instead of using iGenomes one automatically + def make_bed = false + if (!params.gene_bed) { + make_bed = true + } else if (params.genome && params.gtf) { + if (params.genomes[ params.genome ].gtf != params.gtf) { + make_bed = true + } + } + + if (make_bed) { + ch_gene_bed = GTF2BED ( ch_gtf ).bed + ch_versions = ch_versions.mix(GTF2BED.out.versions) + } else { + if (params.gene_bed.endsWith('.gz')) { + ch_gene_bed = GUNZIP_GENE_BED ( params.gene_bed ).gunzip + ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) + } else { + ch_gene_bed = file(params.gene_bed) + } + } + + // + // Create chromosome sizes file + // + ch_chrom_sizes = GET_CHROM_SIZES ( ch_fasta ).sizes + ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + + // + // Prepare genome intervals for filtering by removing regions in blacklist file + // + GENOME_BLACKLIST_REGIONS ( + GET_CHROM_SIZES.out.sizes, + ch_blacklist.ifEmpty([]) + ) + ch_versions = ch_versions.mix(GENOME_BLACKLIST_REGIONS.out.versions) + + // + // Uncompress BWA index or generate from scratch if required + // + ch_bwa_index = Channel.empty() + if (params.bwa_index) { + if (params.bwa_index.endsWith('.tar.gz')) { + ch_bwa_index = UNTAR ( params.bwa_index ).untar + ch_versions = ch_versions.mix(UNTAR.out.versions) + } else { + ch_bwa_index = file(params.bwa_index) + } + } else { + ch_bwa_index = BWA_INDEX ( ch_fasta ).index + ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + } + + emit: + fasta = ch_fasta // path: genome.fasta + gtf = ch_gtf // path: genome.gtf + gene_bed = ch_gene_bed // path: gene.bed + chrom_sizes = ch_chrom_sizes // path: genome.sizes + blacklist = ch_blacklist // path: blaclist.bed + bwa_index = ch_bwa_index // path: bbsplit/index/ + + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/map_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf similarity index 98% rename from subworkflows/nf-core/map_bwa_mem.nf rename to subworkflows/nf-core/align_bwa_mem.nf index 8ce4cf9c1..44a9942cb 100644 --- a/subworkflows/nf-core/map_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -10,7 +10,7 @@ params.samtools_stats_options = [:] include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' addParams( options: params.bwa_mem_options ) include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) -workflow MAP_BWA_MEM { +workflow ALIGN_BWA_MEM { take: ch_reads // channel: [ val(meta), [ reads ] ] ch_index // path: /path/to/index diff --git a/subworkflows/nf-core/fastqc_trimgalore.nf b/subworkflows/nf-core/fastqc_trimgalore.nf index f0638abcb..acaab9fd5 100644 --- a/subworkflows/nf-core/fastqc_trimgalore.nf +++ b/subworkflows/nf-core/fastqc_trimgalore.nf @@ -1,51 +1,51 @@ -/* - * Read QC and trimming - */ - +// +// Read QC and trimming +// params.fastqc_options = [:] params.trimgalore_options = [:] -include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' addParams( options: params.fastqc_options ) +include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' addParams( options: params.fastqc_options ) include { TRIMGALORE } from '../../modules/nf-core/modules/trimgalore/main' addParams( options: params.trimgalore_options ) workflow FASTQC_TRIMGALORE { take: - ch_reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false + reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false main: - ch_versions = Channel.empty() - fastqc_html = Channel.empty() - fastqc_zip = Channel.empty() + ch_versions = Channel.empty() + fastqc_html = Channel.empty() + fastqc_zip = Channel.empty() if (!skip_fastqc) { - FASTQC(ch_reads).html.set { fastqc_html } - fastqc_zip = FASTQC.out.zip + FASTQC ( reads ).html.set { fastqc_html } + fastqc_zip = FASTQC.out.zip ch_versions = ch_versions.mix(FASTQC.out.versions.first()) } - ch_trim_reads = ch_reads - trim_html = Channel.empty() - trim_zip = Channel.empty() - trim_log = Channel.empty() + trim_reads = reads + trim_html = Channel.empty() + trim_zip = Channel.empty() + trim_log = Channel.empty() if (!skip_trimming) { - TRIMGALORE(ch_reads).reads.set { ch_trim_reads } - trim_html = TRIMGALORE.out.html - trim_zip = TRIMGALORE.out.zip - trim_log = TRIMGALORE.out.log + TRIMGALORE ( reads ).reads.set { trim_reads } + trim_html = TRIMGALORE.out.html + trim_zip = TRIMGALORE.out.zip + trim_log = TRIMGALORE.out.log ch_versions = ch_versions.mix(TRIMGALORE.out.versions.first()) } emit: - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] + reads = trim_reads // channel: [ val(meta), [ reads ] ] + + fastqc_html // channel: [ val(meta), [ html ] ] + fastqc_zip // channel: [ val(meta), [ zip ] ] - reads = ch_trim_reads // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] - versions = ch_versions // path: versions.yml + versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 43186bbd6..4e7d4aa09 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -20,9 +20,6 @@ def checkPathParamList = [ ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } -// Check blacklist file -ch_blacklist = params.blacklist ? file(params.blacklist) : Channel.empty() - // Save AWS IGenomes file containing annotation version def anno_readme = params.genomes[ params.genome ]?.readme if (anno_readme && file(anno_readme).exists()) { @@ -30,17 +27,6 @@ if (anno_readme && file(anno_readme).exists()) { file(anno_readme).copyTo("${params.outdir}/genome/") } -// If --gtf is supplied along with --genome -// Make gene bed from supplied --gtf instead of using iGenomes one automatically -def makeBED = false -if (!params.gene_bed) { - makeBED = true -} else if (params.genome && params.gtf) { - if (params.genomes[ params.genome ].gtf != params.gtf) { - makeBED = true - } -} - def peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' /* @@ -75,39 +61,51 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() -def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] -plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" - -def plot_macs2_qc_options = modules['plot_macs2_qc'] -plot_macs2_qc_options.publish_dir += "/$peakType/qc" - -def macs2_consensus_options = modules['macs2_consensus'] -macs2_consensus_options.publish_dir += "/$peakType/qc" - -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' -multiqc_options.publish_dir += "/$peakType" - -include { GTF2BED } from '../modules/local/gtf2bed' addParams( options: [:] ) -include { GET_CHROM_SIZES } from '../modules/local/get_chrom_sizes' addParams( options: [:] ) -include { MAKE_GENOME_FILTER } from '../modules/local/make_genome_filter' addParams( options: [:] ) -include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) -include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) -include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) -include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) -include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) -//include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) -include { IGV } from '../modules/local/igv' addParams( options: [:] ) -include { OUTPUT_DOCUMENTATION } from '../modules/local/output_documentation' addParams( options: [:] ) -include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) -include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) -include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) +// def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] +// plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" + +// def plot_macs2_qc_options = modules['plot_macs2_qc'] +// plot_macs2_qc_options.publish_dir += "/$peakType/qc" + +// def macs2_consensus_options = modules['macs2_consensus'] +// macs2_consensus_options.publish_dir += "/$peakType/qc" + +// def multiqc_options = modules['multiqc'] +// multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' +// multiqc_options.publish_dir += "/$peakType" + +// include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) +// include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) +// include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) +// include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) +// include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) +// //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) +// include { IGV } from '../modules/local/igv' addParams( options: [:] ) +// include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review +// include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) +// include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) -include { BAM_CLEAN } from '../subworkflows/local/bam_clean' addParams( bam_filter_options: modules['bam_filter'], bam_remove_orphans_options: modules['bam_remove_orphans'], samtools_sort_options: modules['samtools_sort_filter'], samtools_index_options: modules['samtools_sort_filter'], samtools_stats_options: modules['samtools_sort_filter'] ) + +def publish_genome_options = params.save_reference ? [publish_dir: 'genome'] : [publish_files: false] +def publish_index_options = params.save_reference ? [publish_dir: 'genome/index'] : [publish_files: false] + +def gffread_options = modules['gffread'] +if (!params.save_reference) { gffread_options['publish_files'] = false } + +def bwa_index_options = modules['bwa_index'] +if (!params.save_reference) { bwa_index_options['publish_files'] = false } + +include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( + genome_options : publish_genome_options, + index_options : publish_index_options, + gffread_options : gffread_options, + bwa_index_options : bwa_index_options +) +// include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' addParams( bam_filter_options: modules['bam_filter'], bam_remove_orphans_options: modules['bam_remove_orphans'], samtools_sort_options: modules['samtools_sort_filter'], samtools_index_options: modules['samtools_sort_filter'], samtools_stats_options: modules['samtools_sort_filter'] ) /* ======================================================================================== @@ -118,53 +116,53 @@ include { BAM_CLEAN } from '../subworkflows/local/bam_clean' addParams( bam_ // // MODULE: Installed directly from nf-core/modules // -def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] -deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" -def macs2_callpeak_options = modules['macs2_callpeak'] -macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) -macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' -macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' -macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' -macs2_callpeak_options['publish_dir'] += "/$peakType" - -def subread_featurecounts_options = modules['subread_featurecounts'] -subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" - -def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] -homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" - -def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] -homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" - -// -// MODULE: Installed directly from nf-core/modules -// -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -// include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) // TODO review -include { BWA_INDEX } from '../modules/nf-core/modules/bwa/index/main' addParams( options: modules['bwa_index'] ) -include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) -include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) -include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) -include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) -include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) -include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) -include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) -include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) -include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) -include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) -include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) +// def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] +// deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" + +// def macs2_callpeak_options = modules['macs2_callpeak'] +// macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) +// macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' +// macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' +// macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' +// macs2_callpeak_options['publish_dir'] += "/$peakType" + +// def subread_featurecounts_options = modules['subread_featurecounts'] +// subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" + +// def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] +// homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" + +// def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] +// homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" + +// include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) +// include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) +// include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) +// include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) +// include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) +// include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) +// include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) +// include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) +// include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) +// include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) +// include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) +// include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) +// include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) // // SUBWORKFLOW: Consisting entirely of nf-core/modules // -include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: modules['trimgalore'] ) -include { MAP_BWA_MEM } from '../subworkflows/nf-core/map_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) -include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) + +def trimgalore_options = modules['trimgalore'] +trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--nextseq ${params.trim_nextseq}"]) : '' +if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } + +include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) +// include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) +// include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) /* ======================================================================================== @@ -179,6 +177,12 @@ workflow CHIPSEQ { ch_versions = Channel.empty() + // + // SUBWORKFLOW: Uncompress and prepare reference genome files + // + PREPARE_GENOME () + ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) + // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // @@ -188,42 +192,15 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) - // // - // // MODULE: Run FastQC - // // - // // TODO check if this fastqc process from nf-core is needed Don't think so done in FASTQC_TRIMGALORE - // // FASTQC ( - // // INPUT_CHECK.out.reads - // // ) - // // ch_software_versions = ch_software_versions.mix(FASTQC.out.versions.first().ifEmpty(null)) - - // // - // // SUBWORKFLOW: Prepare genome files - // // - // ch_index = params.bwa_index ? Channel.value(file(params.bwa_index)) : BWA_INDEX ( ch_fasta ).index - - // if (makeBED) { ch_gene_bed = GTF2BED ( ch_gtf ) } - - // MAKE_GENOME_FILTER ( - // GET_CHROM_SIZES ( ch_fasta ).sizes, - // ch_blacklist.ifEmpty([]) - // ) - // // ch_software_versions = Channel.empty() - // // ch_software_versions = ch_software_versions.mix(MAKE_GENOME_FILTER.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(MAKE_GENOME_FILTER.out.versions) - - // // - // // SUBWORKFLOW: Read QC & trimming - // // - // nextseq = params.trim_nextseq > 0 ? " --nextseq ${params.trim_nextseq}" : '' - // params.modules['trimgalore'].args += nextseq - // FASTQC_TRIMGALORE ( - // INPUT_CHECK.out.reads, - // params.skip_fastqc, - // params.skip_trimming - // ) - // // ch_software_versions = ch_software_versions.mix(FASTQC_TRIMGALORE.out.fastqc_versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) + // + // SUBWORKFLOW: Read QC and trim adapters + // + FASTQC_TRIMGALORE ( + INPUT_CHECK.out.reads, + params.skip_fastqc || params.skip_qc, + params.skip_trimming + ) + ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) // // // // SUBWORKFLOW: Map reads & BAM QC @@ -509,30 +486,12 @@ workflow CHIPSEQ { // params.modules['macs2_consensus'] // ) - // // - // // MODULE: Pipeline reporting - // // - // // ch_software_versions - // // .map { it -> if (it) [ it.baseName, it ] } - // // .groupTuple() - // // .map { it[1][0] } - // // .flatten() - // // .collect() - // // .set { ch_software_versions } - - // // GET_SOFTWARE_VERSIONS ( - // // ch_software_versions.map { it }.collect() //, - // // // params.modules['get_software_versions'] // TODO check if its needed, I think that addParams does the trick - // // ) - // CUSTOM_DUMPSOFTWAREVERSIONS ( - // ch_versions.unique().collectFile() - // ) - - - // OUTPUT_DOCUMENTATION ( - // ch_output_docs, - // ch_output_docs_images - // ) + // + // MODULE: Pipeline reporting + // + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') + ) // // // // MODULE: MultiQC From d78c44b621d72e0fe1e100ef6b60804b033e2953 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Oct 2021 12:33:12 +0200 Subject: [PATCH 214/538] Add default for skip_qc and in json schema --- CHANGELOG.md | 1 + nextflow.config | 1 + nextflow_schema.json | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c97a823ce..06cee4a48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `--clusterOptions` | | | `--conda` | `--enable_conda` | | `--single_end` | | +| | `--skip_qc` | > **NB:** Parameter has been __updated__ if both old and new parameter information is present. > **NB:** Parameter has been __added__ if just the new parameter information is present. diff --git a/nextflow.config b/nextflow.config index de649c6ee..86f36760b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -49,6 +49,7 @@ params { skip_diff_analysis = false // Options: QC + skip_qc = false skip_fastqc = false skip_picard_metrics = false skip_preseq = false diff --git a/nextflow_schema.json b/nextflow_schema.json index ad9c90f75..f7198db55 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -352,6 +352,11 @@ "type": "boolean", "description": "Skip MultiQC.", "fa_icon": "fas fa-fast-forward" + }, + "skip_qc": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip all QC steps except for MultiQC." } } }, From eaa75efce6a096565809eba6161ae838405be60a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Oct 2021 12:44:00 +0200 Subject: [PATCH 215/538] Get rid of functions not used --- modules/local/genome_blacklist_regions.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/genome_blacklist_regions.nf b/modules/local/genome_blacklist_regions.nf index e28a749b9..35d0610ae 100644 --- a/modules/local/genome_blacklist_regions.nf +++ b/modules/local/genome_blacklist_regions.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { saveFiles; getProcessName } from './functions' params.options = [:] From 409c27508acf9a0d3aaa48af0433f4085113e5cb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Oct 2021 14:33:02 +0200 Subject: [PATCH 216/538] Plug back align_bwa_mem subworkflow --- subworkflows/nf-core/align_bwa_mem.nf | 6 +++--- workflows/chipseq.nf | 24 +++++++++++------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/subworkflows/nf-core/align_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf index 44a9942cb..98c73149e 100644 --- a/subworkflows/nf-core/align_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -12,14 +12,14 @@ include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow ALIGN_BWA_MEM { take: - ch_reads // channel: [ val(meta), [ reads ] ] - ch_index // path: /path/to/index + reads // channel: [ val(meta), [ reads ] ] + index // path: /path/to/index main: ch_versions = Channel.empty() - BWA_MEM(ch_reads, ch_index) + BWA_MEM(reads, index) BAM_SORT_SAMTOOLS(BWA_MEM.out.bam) ch_versions = ch_versions.mix(BWA_MEM.out.versions.first(), diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 4e7d4aa09..310877e49 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -161,7 +161,7 @@ trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--n if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) -// include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) +include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) // include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) /* @@ -202,18 +202,16 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) - // // - // // SUBWORKFLOW: Map reads & BAM QC - // // - // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - // params.modules['bwa_mem'].args += score - // MAP_BWA_MEM ( - // FASTQC_TRIMGALORE.out.reads, - // ch_index - // ) - // // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.bwa_versions.first()) - // // ch_software_versions = ch_software_versions.mix(MAP_BWA_MEM.out.samtools_versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(MAP_BWA_MEM.out.versions) + // + // SUBWORKFLOW: Map reads & BAM QC + // + score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + params.modules['bwa_mem'].args += score + ALIGN_BWA_MEM ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.bwa_index + ) + ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) // // // // SUBWORKFLOW: Merge resequenced BAM files From e180008d944bffd63691815008be542f3e24fa84 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Oct 2021 17:12:54 +0200 Subject: [PATCH 217/538] Add mark_duplicates_picard --- conf/modules.config | 6 +- .../nf-core/mark_duplicates_picard.nf | 36 +++++++----- workflows/chipseq.nf | 58 ++++++++++--------- 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 24c18c3a3..60e19e047 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -56,9 +56,11 @@ params { publish_dir = "bwa/mergedLibrary" suffix = ".mLb.mkD.sorted" } - 'samtools_sort_merged_lib' { - publish_dir = "bwa/mergedLibrary" + 'picard_markduplicates_samtools' { + args = '' suffix = ".mLb.mkD.sorted" + publish_files = ['bai':'', 'stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats'] + publish_dir = "bwa/mergedLibrary" } 'bam_filter' { publish_dir = "bwa/mergedLibrary" diff --git a/subworkflows/nf-core/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf index 9f8e53608..af2a944e5 100644 --- a/subworkflows/nf-core/mark_duplicates_picard.nf +++ b/subworkflows/nf-core/mark_duplicates_picard.nf @@ -11,27 +11,35 @@ include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow MARK_DUPLICATES_PICARD { take: - ch_bam // channel: [ val(meta), [ bam ] ] + bam // channel: [ val(meta), [ bam ] ] main: ch_versions = Channel.empty() - PICARD_MARKDUPLICATES(ch_bam) + // + // Picard MarkDuplicates + // + PICARD_MARKDUPLICATES(bam) + ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES.out.versions.first()) + + // + // Index BAM file and run samtools stats, flagstat and idxstats + // SAMTOOLS_INDEX(PICARD_MARKDUPLICATES.out.bam) - BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) - ch_versions = ch_versions.mix(PICARD_MARKDUPLICATES.out.versions.first(), - SAMTOOLS_INDEX.out.versions.first(), - BAM_STATS_SAMTOOLS.out.versions) + BAM_STATS_SAMTOOLS(PICARD_MARKDUPLICATES.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) emit: - bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] - metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] - bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - - versions = ch_versions // path: versions.yml + bam = PICARD_MARKDUPLICATES.out.bam // channel: [ val(meta), [ bam ] ] + metrics = PICARD_MARKDUPLICATES.out.metrics // channel: [ val(meta), [ metrics ] ] + + bai = SAMTOOLS_INDEX.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_STATS_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // channel: [ versions.yml ] } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 310877e49..16d976fdc 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -136,7 +136,7 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams // def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] // homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" -// include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) +include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) // include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) // include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) // include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) @@ -160,9 +160,12 @@ def trimgalore_options = modules['trimgalore'] trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--nextseq ${params.trim_nextseq}"]) : '' if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } + +def picard_markduplicates_samtools = modules['picard_markduplicates_samtools'] + include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) -// include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: modules['samtools_sort_merged_lib'] , samtools_stats_options: modules['samtools_sort_merged_lib'] ) +include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: picard_markduplicates_samtools, samtools_stats_options: picard_markduplicates_samtools ) /* ======================================================================================== @@ -213,33 +216,32 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) - // // - // // SUBWORKFLOW: Merge resequenced BAM files - // // - // MAP_BWA_MEM - // .out - // .bam - // .map { - // meta, bam -> - // fmeta = meta.findAll { it.key != 'read_group' } - // fmeta.id = fmeta.id.split('_')[0..-2].join('_') - // [ fmeta, bam ] } - // .groupTuple(by: [0]) - // .map { it -> [ it[0], it[1].flatten() ] } - // .set { ch_sort_bam } - - // PICARD_MERGESAMFILES ( - // ch_sort_bam - // ) - // // ch_software_versions = ch_software_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions) + // + // SUBWORKFLOW: Merge resequenced BAM files + // + ALIGN_BWA_MEM + .out + .bam + .map { + meta, bam -> + fmeta = meta.findAll { it.key != 'read_group' } + fmeta.id = fmeta.id.split('_')[0..-2].join('_') + [ fmeta, bam ] } + .groupTuple(by: [0]) + .map { it -> [ it[0], it[1].flatten() ] } + .set { ch_sort_bam } + + PICARD_MERGESAMFILES ( + ch_sort_bam + ) + ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) - // // - // // SUBWORKFLOW: Mark duplicates & filter BAM files - // // - // MARK_DUPLICATES_PICARD ( - // PICARD_MERGESAMFILES.out.bam - // ) + // + // SUBWORKFLOW: Mark duplicates & filter BAM files + // + MARK_DUPLICATES_PICARD ( + PICARD_MERGESAMFILES.out.bam + ) // // // // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE From dc48c21f684954c273017716586def68b463971d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 11:43:24 +0200 Subject: [PATCH 218/538] Adding filter_bam_bamtools subworkflow --- modules/local/bam_filter.nf | 4 +-- modules/local/bam_remove_orphans.nf | 4 +-- subworkflows/local/filter_bam_bamtools.nf | 10 +++---- subworkflows/local/prepare_genome.nf | 2 +- workflows/chipseq.nf | 32 ++++++++++++++--------- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/modules/local/bam_filter.nf b/modules/local/bam_filter.nf index 2d255a79d..1c7f1b807 100644 --- a/modules/local/bam_filter.nf +++ b/modules/local/bam_filter.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { initOptions; saveFiles; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -12,7 +12,7 @@ process BAM_FILTER { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bamtools=2.4.0 bioconda::samtools=1.4.1" : null) //TODO Create updated mulled container if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index a0505db93..16b90e924 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { initOptions; saveFiles; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -12,7 +12,7 @@ process BAM_REMOVE_ORPHANS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "${baseDir}/environment.yml" : null) // conda (params.enable_conda ? "conda-forge::python=3.7.6 bioconda::samtools=1.9" : null) //TODO Create updated mulled container diff --git a/subworkflows/local/filter_bam_bamtools.nf b/subworkflows/local/filter_bam_bamtools.nf index 63da2f8f8..4bcbb4f53 100644 --- a/subworkflows/local/filter_bam_bamtools.nf +++ b/subworkflows/local/filter_bam_bamtools.nf @@ -9,14 +9,14 @@ params.samtools_stats_options = [:] include { BAM_FILTER } from '../../modules/local/bam_filter' addParams( options: params.bam_filter_options ) include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' addParams( options: params.bam_remove_orphans_options ) -include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) +include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) workflow FILTER_BAM_BAMTOOLS { take: - ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] - ch_bed // channel: [ bed ] - bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data - bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data + ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_bed // channel: [ bed ] + bamtools_filter_se_config // file: BAMtools filter JSON config file for SE data + bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data main: diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a8241dab2..b07065e7b 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -67,7 +67,7 @@ workflow PREPARE_GENOME { ch_blacklist = GUNZIP_BLACKLIST ( params.blacklist ).gunzip ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) } else { - ch_blacklist = file(params.blacklist) + ch_blacklist = Channel.fromPath(file(params.blacklist)) } } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 16d976fdc..82143a087 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -105,7 +105,13 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams gffread_options : gffread_options, bwa_index_options : bwa_index_options ) -// include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' addParams( bam_filter_options: modules['bam_filter'], bam_remove_orphans_options: modules['bam_remove_orphans'], samtools_sort_options: modules['samtools_sort_filter'], samtools_index_options: modules['samtools_sort_filter'], samtools_stats_options: modules['samtools_sort_filter'] ) +include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' addParams( + bam_filter_options : modules['bam_filter'], + bam_remove_orphans_options: modules['bam_remove_orphans'], + samtools_sort_options : modules['samtools_sort_filter'], + samtools_index_options : modules['samtools_sort_filter'], + samtools_stats_options : modules['samtools_sort_filter'] +) /* ======================================================================================== @@ -237,23 +243,23 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(PICARD_MERGESAMFILES.out.versions.first().ifEmpty(null)) // - // SUBWORKFLOW: Mark duplicates & filter BAM files + // SUBWORKFLOW: Mark duplicates & filter BAM files after merging // MARK_DUPLICATES_PICARD ( PICARD_MERGESAMFILES.out.bam ) - // // - // // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE - // // - // BAM_CLEAN ( - // MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - // MAKE_GENOME_FILTER.out.bed.collect(), - // ch_bamtools_filter_se_config, - // ch_bamtools_filter_pe_config - // ) - // // ch_software_versions = ch_software_versions.mix(BAM_CLEAN.out.bamtools_versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(BAM_CLEAN.out.versions) + // + // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE + // + FILTER_BAM_BAMTOOLS ( + MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), + PREPARE_GENOME.out.blacklist.first(), + ch_bamtools_filter_se_config, + ch_bamtools_filter_pe_config + ) + ch_versions = ch_versions.mix(FILTER_BAM_BAMTOOLS.out.versions.first().ifEmpty(null)) + // // // // MODULE: Post alignment QC From 9d1ce2a251dca603a4c4696f91eb642cfb43386f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 12:16:16 +0200 Subject: [PATCH 219/538] Fix filter_bam_bamtools only executed once --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 82143a087..517f08110 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -254,7 +254,7 @@ workflow CHIPSEQ { // FILTER_BAM_BAMTOOLS ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - PREPARE_GENOME.out.blacklist.first(), + PREPARE_GENOME.out.blacklist.ifEmpty([]).first(), ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) From 8ce233dc84edaf974918aa4d5b29ccf919722e7e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 12:27:04 +0200 Subject: [PATCH 220/538] Add picard_collectmultiplemetrics module --- subworkflows/local/prepare_genome.nf | 2 +- workflows/chipseq.nf | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index b07065e7b..1e776669f 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -134,7 +134,7 @@ workflow PREPARE_GENOME { gtf = ch_gtf // path: genome.gtf gene_bed = ch_gene_bed // path: gene.bed chrom_sizes = ch_chrom_sizes // path: genome.sizes - blacklist = ch_blacklist // path: blaclist.bed + blacklist = ch_blacklist // path: blacklist.bed bwa_index = ch_bwa_index // path: bbsplit/index/ versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 517f08110..0d56d25b2 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -143,7 +143,7 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' // homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) -// include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) +include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) // include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) // include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) // include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) @@ -261,15 +261,14 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(FILTER_BAM_BAMTOOLS.out.versions.first().ifEmpty(null)) - // // - // // MODULE: Post alignment QC - // // - // PICARD_COLLECTMULTIPLEMETRICS ( - // BAM_CLEAN.out.bam, - // ch_fasta - // ) - - // // TODO Add versions to picard collectmultiplemetrics + // + // MODULE: Post alignment QC + // + PICARD_COLLECTMULTIPLEMETRICS ( + FILTER_BAM_BAMTOOLS.out.bam, + PREPARE_GENOME.out.fasta + ) + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) // // // // MODULE: Library coverage From e75a4c4201a7417c9023f3ddfc5e5b4579548f40 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 13:22:02 +0200 Subject: [PATCH 221/538] Adding preseq_lcextrap module back --- workflows/chipseq.nf | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 0d56d25b2..5d36f75a3 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -144,7 +144,7 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) -// include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) +include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) // include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) // include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) // include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) @@ -270,14 +270,13 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) - // // - // // MODULE: Library coverage - // // - // PRESEQ_LCEXTRAP ( - // BAM_CLEAN.out.bam - // ) - // // ch_software_versions = ch_software_versions.mix(PRESEQ_LCEXTRAP.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions) + // + // MODULE: Library coverage + // + PRESEQ_LCEXTRAP ( + FILTER_BAM_BAMTOOLS.out.bam + ) + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) // // // // MODULE: Strand cross-correlation From e3c6ce1b1e505435c424509b476837afee90fb4b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 14:39:55 +0200 Subject: [PATCH 222/538] Add bedtools_genomecov module back --- modules/local/bedtools_genomecov.nf | 1 - workflows/chipseq.nf | 33 +++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index f847f12c5..95b54e49d 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -27,7 +27,6 @@ process BEDTOOLS_GENOMECOV { path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" def pe = meta.single_end ? '' : '-pc' diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 5d36f75a3..ba8a5e133 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -74,7 +74,7 @@ def modules = params.modules.clone() // multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' // multiqc_options.publish_dir += "/$peakType" -// include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) +include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) // include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) // include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) // include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) @@ -145,12 +145,12 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) +include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) // include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) // include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) // include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) // include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) // include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) -// include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) // include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) // include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) @@ -278,14 +278,14 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) - // // - // // MODULE: Strand cross-correlation - // // - // PHANTOMPEAKQUALTOOLS ( - // BAM_CLEAN.out.bam - // ) - // // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions) + // + // MODULE: Strand cross-correlation + // + PHANTOMPEAKQUALTOOLS ( + FILTER_BAM_BAMTOOLS.out.bam + ) + // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) + ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first()) // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( // PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), @@ -294,12 +294,13 @@ workflow CHIPSEQ { // ch_spp_correlation_header // ) - // // - // // MODULE: Coverage tracks - // // - // BEDTOOLS_GENOMECOV ( - // BAM_CLEAN.out.bam.join(BAM_CLEAN.out.flagstat, by: [0]) - // ) + // + // MODULE: Coverage tracks + // + BEDTOOLS_GENOMECOV ( + FILTER_BAM_BAMTOOLS.out.bam.join(FILTER_BAM_BAMTOOLS.out.flagstat, by: [0]) + ) + ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV.out.versions.first()) // // // // MODULE: Coverage tracks From d66b4b1f216511576b7f29eea12a044072005a91 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 15:01:08 +0200 Subject: [PATCH 223/538] Add ucsc_bedgraphtobigwig back --- workflows/chipseq.nf | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index ba8a5e133..4f44be2c3 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -146,7 +146,7 @@ include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picar include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) -// include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) +include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) // include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) // include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) // include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) @@ -284,7 +284,6 @@ workflow CHIPSEQ { PHANTOMPEAKQUALTOOLS ( FILTER_BAM_BAMTOOLS.out.bam ) - // ch_software_versions = ch_software_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first().ifEmpty(null)) ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first()) // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( @@ -302,15 +301,14 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV.out.versions.first()) - // // - // // MODULE: Coverage tracks - // // - // UCSC_BEDGRAPHTOBIGWIG ( - // BEDTOOLS_GENOMECOV.out.bedgraph, - // GET_CHROM_SIZES.out.sizes - // ) - // // ch_software_versions = ch_software_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) + // + // MODULE: Coverage tracks + // + UCSC_BEDGRAPHTOBIGWIG ( + BEDTOOLS_GENOMECOV.out.bedgraph, + PREPARE_GENOME.out.chrom_sizes + ) + ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first()) // // // // MODULE: Coverage plots From 621bb9a2ce550d1dbfb36b1f2045c2db9255558c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 15:29:36 +0200 Subject: [PATCH 224/538] Add deeptools_computematrix module back --- workflows/chipseq.nf | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 4f44be2c3..e4cdcc614 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -147,7 +147,7 @@ include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picar include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) -// include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) +include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) // include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) // include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) // include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) @@ -310,15 +310,14 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first()) - // // - // // MODULE: Coverage plots - // // - // DEEPTOOLS_COMPUTEMATRIX ( - // UCSC_BEDGRAPHTOBIGWIG.out.bigwig, - // ch_gene_bed - // ) - // // ch_software_versions = ch_software_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions) + // + // MODULE: Coverage plots + // + DEEPTOOLS_COMPUTEMATRIX ( + UCSC_BEDGRAPHTOBIGWIG.out.bigwig, + PREPARE_GENOME.out.gene_bed + ) + ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) // DEEPTOOLS_PLOTPROFILE ( // DEEPTOOLS_COMPUTEMATRIX.out.matrix From 5530fe5f375dde5a23b35be672e3561f87128ce1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 15:34:53 +0200 Subject: [PATCH 225/538] Add deeptools_plotheatmap module back --- workflows/chipseq.nf | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index e4cdcc614..d741d4eb7 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -148,8 +148,8 @@ include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/prese include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) -// include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) -// include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) +include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) +include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) // include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) // include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) // include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) @@ -319,13 +319,15 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) - // DEEPTOOLS_PLOTPROFILE ( - // DEEPTOOLS_COMPUTEMATRIX.out.matrix - // ) + DEEPTOOLS_PLOTPROFILE ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix + ) + ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) - // DEEPTOOLS_PLOTHEATMAP ( - // DEEPTOOLS_COMPUTEMATRIX.out.matrix - // ) + DEEPTOOLS_PLOTHEATMAP ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix + ) + ch_versions = ch_versions.mix(DEEPTOOLS_PLOTHEATMAP.out.versions.first()) // // // // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] From 47d55b317e1404578c6bb1225aabe1df3b2ebc6e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 16:02:19 +0200 Subject: [PATCH 226/538] Add deeptools_plotfingerpring module back --- workflows/chipseq.nf | 61 ++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index d741d4eb7..18d48c597 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -123,8 +123,8 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' // MODULE: Installed directly from nf-core/modules // -// def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] -// deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" +def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] +deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" // def macs2_callpeak_options = modules['macs2_callpeak'] // macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) @@ -150,7 +150,7 @@ include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/ include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) -// include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) +include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) // include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) // include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) @@ -329,31 +329,38 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(DEEPTOOLS_PLOTHEATMAP.out.versions.first()) - // // - // // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] - // // - // BAM_CLEAN - // .out - // .bam - // .join ( BAM_CLEAN.out.bai, by: [0] ) - // .map { meta, bam, bai -> meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] } - // .set { ch_control_bam_bai } - - // BAM_CLEAN - // .out - // .bam - // .join ( BAM_CLEAN.out.bai, by: [0] ) - // .map { meta, bam, bai -> meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null } - // .combine(ch_control_bam_bai, by: 0) - // .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } - // .set { ch_ip_control_bam_bai } + // + // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // + FILTER_BAM_BAMTOOLS + .out + .bam + .join (FILTER_BAM_BAMTOOLS.out.bai, by: [0]) + .map { + meta, bam, bai -> + meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] + } + .set { ch_control_bam_bai } - // // - // // plotFingerprint for IP and control together - // // - // DEEPTOOLS_PLOTFINGERPRINT ( - // ch_ip_control_bam_bai - // ) + FILTER_BAM_BAMTOOLS + .out + .bam + .join (FILTER_BAM_BAMTOOLS.out.bai, by: [0]) + .map { + meta, bam, bai -> + meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null + } + .combine(ch_control_bam_bai, by: 0) + .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } + .set { ch_ip_control_bam_bai } + + // + // plotFingerprint for IP and control together + // + DEEPTOOLS_PLOTFINGERPRINT ( + ch_ip_control_bam_bai + ) + ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) // if (params.macs_gsize) { From 426aedb9494a74d3b1ff6fd5a45fb85f2f675fb7 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 16:16:04 +0200 Subject: [PATCH 227/538] Add macs2_callpeak and frip_score modules --- modules/local/frip_score.nf | 4 +- workflows/chipseq.nf | 74 +++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index 836dba71e..7294d08af 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { initOptions; saveFiles; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -9,7 +9,7 @@ process FRIP_SCORE { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.9" : null) //TODO Create updated mulled container if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 18d48c597..cea8fc1c7 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -75,10 +75,11 @@ def modules = params.modules.clone() // multiqc_options.publish_dir += "/$peakType" include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) +include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) + // include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) // include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) // include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) -// include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) // //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) // include { IGV } from '../modules/local/igv' addParams( options: [:] ) // include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review @@ -126,12 +127,12 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" -// def macs2_callpeak_options = modules['macs2_callpeak'] -// macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) -// macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' -// macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' -// macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' -// macs2_callpeak_options['publish_dir'] += "/$peakType" +def macs2_callpeak_options = modules['macs2_callpeak'] +macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) +macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' +macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' +macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' +macs2_callpeak_options['publish_dir'] += "/$peakType" // def subread_featurecounts_options = modules['subread_featurecounts'] // subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" @@ -151,7 +152,7 @@ include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deept include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) -// include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) +include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) // include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) @@ -362,36 +363,37 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) - // if (params.macs_gsize) { - - // // - // // Call peaks - // // - - // // Create channel: [ val(meta), ip_bam, control_bam ] - // ch_ip_control_bam_bai - // .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - // .set { ch_ip_control_bam } + if (params.macs_gsize) { - // MACS2_CALLPEAK ( - // ch_ip_control_bam, - // params.macs_gsize - // ) - // // ch_software_versions = ch_software_versions.mix(MACS2_CALLPEAK.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions) + // + // Call peaks + // - // ch_ip_control_bam - // .join(MACS2_CALLPEAK.out.peak, by: [0]) - // .map { it -> [ it[0], it[1], it[3] ] } - // .set { ch_ip_peak } - // FRIP_SCORE ( - // ch_ip_peak - // ) + // Create channel: [ val(meta), ip_bam, control_bam ] + ch_ip_control_bam_bai + .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + .set { ch_ip_control_bam } + + MACS2_CALLPEAK ( + ch_ip_control_bam, + params.macs_gsize + ) + ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) + + ch_ip_control_bam + .join(MACS2_CALLPEAK.out.peak, by: [0]) + .map { it -> [ it[0], it[1], it[3] ] } + .set { ch_ip_peak } + FRIP_SCORE ( + ch_ip_peak + ) + ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) + + // ch_ip_peak + // .join(FRIP_SCORE.out.txt, by: [0]) + // .map { it -> [ it[0], it[2], it[3] ] } + // .set { ch_ip_peak_frip } - // ch_ip_peak - // .join(FRIP_SCORE.out.txt, by: [0]) - // .map { it -> [ it[0], it[2], it[3] ] } - // .set { ch_ip_peak_frip } // MULTIQC_CUSTOM_PEAKS ( // ch_ip_peak_frip, // ch_peak_count_header, @@ -482,7 +484,7 @@ workflow CHIPSEQ { // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - // } + } // // // // Create IGV session From c13b3bd153cdfc82a1cdd2bf3700782bee5cb4dd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 16:32:23 +0200 Subject: [PATCH 228/538] Add plot_macs2_qc module back --- modules/local/plot_macs2_qc.nf | 9 +++++---- workflows/chipseq.nf | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf index 46327f3e6..e83a4f8a7 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { initOptions; saveFiles; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -11,7 +11,7 @@ process PLOT_MACS2_QC { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "${baseDir}/environment.yml" : null) //TODO Create updated mulled container @@ -19,8 +19,9 @@ process PLOT_MACS2_QC { path peaks output: - path '*.txt', emit: txt - path '*.pdf', emit: pdf + path '*.txt' , emit: txt + path '*.pdf' , emit: pdf + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index cea8fc1c7..7fc556706 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -61,12 +61,12 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() +def plot_macs2_qc_options = modules['plot_macs2_qc'] +plot_macs2_qc_options.publish_dir += "/$peakType/qc" + // def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] // plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" -// def plot_macs2_qc_options = modules['plot_macs2_qc'] -// plot_macs2_qc_options.publish_dir += "/$peakType/qc" - // def macs2_consensus_options = modules['macs2_consensus'] // macs2_consensus_options.publish_dir += "/$peakType/qc" @@ -76,9 +76,8 @@ def modules = params.modules.clone() include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) - +include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) // include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) -// include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) // include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) // //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) // include { IGV } from '../modules/local/igv' addParams( options: [:] ) @@ -343,7 +342,7 @@ workflow CHIPSEQ { } .set { ch_control_bam_bai } - FILTER_BAM_BAMTOOLS + FILTER_BAM_BAMTOOLS .out .bam .join (FILTER_BAM_BAMTOOLS.out.bai, by: [0]) @@ -400,16 +399,16 @@ workflow CHIPSEQ { // ch_frip_score_header // ) - // PLOT_MACS2_QC ( - // MACS2_CALLPEAK.out.peak.collect{it[1]} - // ) + PLOT_MACS2_QC ( + MACS2_CALLPEAK.out.peak.collect{it[1]} + ) + ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) // HOMER_ANNOTATEPEAKS_MACS2 ( // MACS2_CALLPEAK.out.peak, // ch_fasta, // ch_gtf // ) - // // ch_software_versions = ch_software_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first().ifEmpty(null)) // ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions) // PLOT_HOMER_ANNOTATEPEAKS ( @@ -417,6 +416,7 @@ workflow CHIPSEQ { // ch_peak_annotation_header, // "_peaks.annotatePeaks.txt" // ) + // ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) // // Create channel: [ meta , [ peaks ] ] // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] From 187631b646fe19767d959c55e0f1bc39966ad0cd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 16:37:05 +0200 Subject: [PATCH 229/538] Adding hommer_annotatepeaks_macs2 module back --- workflows/chipseq.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 7fc556706..f09d219b9 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -133,12 +133,12 @@ macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs( macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' macs2_callpeak_options['publish_dir'] += "/$peakType" +def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] +homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" + // def subread_featurecounts_options = modules['subread_featurecounts'] // subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" -// def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] -// homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" - // def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] // homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" @@ -155,7 +155,7 @@ include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2 // include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) -// include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) // include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) // @@ -404,12 +404,12 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) - // HOMER_ANNOTATEPEAKS_MACS2 ( - // MACS2_CALLPEAK.out.peak, - // ch_fasta, - // ch_gtf - // ) - // ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions) + HOMER_ANNOTATEPEAKS_MACS2 ( + MACS2_CALLPEAK.out.peak, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf + ) + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) // PLOT_HOMER_ANNOTATEPEAKS ( // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, From beb78e6cd3d3fa99e6eb709534155d27b5a18bae Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 16:45:29 +0200 Subject: [PATCH 230/538] Adding plot_homer_annotatepeaks module back --- modules/local/plot_homer_annotatepeaks.nf | 5 +++-- workflows/chipseq.nf | 18 +++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index d6eb18ce7..0a2af6b59 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { saveFiles; initOptions; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -11,7 +11,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "${baseDir}/environment.yml" : null) //TODO Create mulled biocontainer @@ -24,6 +24,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { path '*.txt', emit: txt path '*.pdf', emit: pdf path '*.tsv', emit: tsv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index f09d219b9..24d6babe2 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -64,8 +64,8 @@ def modules = params.modules.clone() def plot_macs2_qc_options = modules['plot_macs2_qc'] plot_macs2_qc_options.publish_dir += "/$peakType/qc" -// def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] -// plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" +def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] +plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" // def macs2_consensus_options = modules['macs2_consensus'] // macs2_consensus_options.publish_dir += "/$peakType/qc" @@ -77,7 +77,7 @@ plot_macs2_qc_options.publish_dir += "/$peakType/qc" include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) -// include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) +include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) // include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) // //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) // include { IGV } from '../modules/local/igv' addParams( options: [:] ) @@ -411,12 +411,12 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) - // PLOT_HOMER_ANNOTATEPEAKS ( - // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - // ch_peak_annotation_header, - // "_peaks.annotatePeaks.txt" - // ) - // ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt" + ) + ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions.first()) // // Create channel: [ meta , [ peaks ] ] // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] From 8ff4c28ebeb850913c2e551b542ec0a808d9dfab Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 18:12:24 +0200 Subject: [PATCH 231/538] Add macs2_consensus module back --- modules/local/macs2_consensus.nf | 11 +++--- workflows/chipseq.nf | 63 ++++++++++++++++---------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index da4319296..13f92ba02 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -20,15 +20,16 @@ process MACS2_CONSENSUS { tuple val(meta), path(peaks) output: - tuple val(meta), path("*.bed"), emit: bed - tuple val(meta), path("*.saf"), emit: saf - tuple val(meta), path("*.pdf"), emit: pdf - tuple val(meta), path("*.boolean.txt"), emit: boolean_txt + tuple val(meta), path("*.bed") , emit: bed + tuple val(meta), path("*.saf") , emit: saf + tuple val(meta), path("*.pdf") , emit: pdf + tuple val(meta), path("*.boolean.txt") , emit: boolean_txt tuple val(meta), path("*.intersect.txt"), emit: intersect_txt + path "versions.yml" , emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - def software = getSoftwareName(task.process) + // def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 24d6babe2..2f4d37dfb 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -67,8 +67,8 @@ plot_macs2_qc_options.publish_dir += "/$peakType/qc" def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" -// def macs2_consensus_options = modules['macs2_consensus'] -// macs2_consensus_options.publish_dir += "/$peakType/qc" +def macs2_consensus_options = modules['macs2_consensus'] +macs2_consensus_options.publish_dir += "/$peakType/qc" // def multiqc_options = modules['multiqc'] // multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' @@ -78,7 +78,7 @@ include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_ include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) -// include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) +include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) // //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) // include { IGV } from '../modules/local/igv' addParams( options: [:] ) // include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review @@ -416,34 +416,35 @@ workflow CHIPSEQ { ch_peak_annotation_header, "_peaks.annotatePeaks.txt" ) - ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions.first()) - - // // Create channel: [ meta , [ peaks ] ] - // // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - // MACS2_CALLPEAK - // .out - // .peak - // .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - // .groupTuple() - // .map { - // antibody, groups, peaks -> - // [ - // antibody, - // groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - // peaks - // ] } - // .map { - // antibody, groups, peaks -> - // def meta = [:] - // meta.id = antibody - // meta.multiple_groups = groups.size() > 1 - // meta.replicates_exist = groups.max { groups.value }.value > 1 - // [ meta, peaks ] } - // .set { ch_antibody_peaks } - - // MACS2_CONSENSUS ( - // ch_antibody_peaks - // ) + ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + MACS2_CALLPEAK + .out + .peak + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ + antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks + ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + MACS2_CONSENSUS ( + ch_antibody_peaks + ) + ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) // HOMER_ANNOTATEPEAKS_CONSENSUS ( // MACS2_CONSENSUS.out.bed, From 84dc8a1e37eaeabd4da474be13af954e8be6fd10 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 18:25:11 +0200 Subject: [PATCH 232/538] Add subread_featurecounts module back --- workflows/chipseq.nf | 75 ++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 2f4d37dfb..f78e43b02 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -136,11 +136,11 @@ macs2_callpeak_options['publish_dir'] += "/$peakType" def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" -// def subread_featurecounts_options = modules['subread_featurecounts'] -// subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" +def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] +homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" -// def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] -// homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" +def subread_featurecounts_options = modules['subread_featurecounts'] +subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) @@ -152,11 +152,11 @@ include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deept include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) -// include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) +include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) -// include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) // // SUBWORKFLOW: Consisting entirely of nf-core/modules @@ -446,39 +446,38 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) - // HOMER_ANNOTATEPEAKS_CONSENSUS ( - // MACS2_CONSENSUS.out.bed, - // ch_fasta, - // ch_gtf - // ) - // // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - - // // Create channel: [ val(meta), ip_bam ] - // MACS2_CONSENSUS - // .out - // .saf - // .map { meta, saf -> [ meta.id, meta, saf ] } - // .set { ch_ip_saf } - - // ch_ip_control_bam - // .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - // .combine(ch_ip_saf) - // .map { - // it -> - // fmeta = it[1] - // fmeta['replicates_exist'] = it[4]['replicates_exist'] - // fmeta['multiple_groups'] = it[4]['multiple_groups'] - // [ fmeta, it[2], it[5] ] } - // .set { ch_ip_bam } - - // SUBREAD_FEATURECOUNTS ( - // ch_ip_bam - // ) - // // ch_software_versions = ch_software_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first().ifEmpty(null)) - // ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions) + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf + ) + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .combine(ch_ip_saf) + .map { + it -> + fmeta = it[1] + fmeta['replicates_exist'] = it[4]['replicates_exist'] + fmeta['multiple_groups'] = it[4]['multiple_groups'] + [ fmeta, it[2], it[5] ] } + .set { ch_ip_bam } + + SUBREAD_FEATURECOUNTS ( + ch_ip_bam + ) + ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - // // // // DESEQ2_FEATURECOUNTS ( // // params.modules['deseq2_featurecounts'] // // ) From 33a7b79e4cc8a83b26ddf7ed655fb5718c259bb4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 19:09:59 +0200 Subject: [PATCH 233/538] Add igv and multiqc back --- modules/local/igv.nf | 10 +-- modules/local/multiqc.nf | 2 +- workflows/chipseq.nf | 172 +++++++++++++++++++-------------------- 3 files changed, 89 insertions(+), 95 deletions(-) diff --git a/modules/local/igv.nf b/modules/local/igv.nf index 3ba90ba9c..ab74d50af 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -1,8 +1,7 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { saveFiles; getProcessName } from './functions' params.options = [:] -options = initOptions(params.options) /* * Create IGV session file @@ -10,7 +9,7 @@ options = initOptions(params.options) process IGV { publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), publish_id:'') } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { @@ -30,8 +29,9 @@ process IGV { // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) output: - path "*files.txt", emit: txt - path "*.xml", emit: xml + path "*files.txt" , emit: txt + path "*.xml" , emit: xml + path "versions.yml", emit: versions script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ """ diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 0390d1f79..734a413bd 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -31,8 +31,8 @@ process MULTIQC { path workflow_summary path ('fastqc/*') - path ('trimgalore/*') path ('trimgalore/fastqc/*') + path ('trimgalore/*') path ('alignment/library/*') path ('alignment/library/*') diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index f78e43b02..54669ea4f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -70,20 +70,20 @@ plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" def macs2_consensus_options = modules['macs2_consensus'] macs2_consensus_options.publish_dir += "/$peakType/qc" -// def multiqc_options = modules['multiqc'] -// multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' -// multiqc_options.publish_dir += "/$peakType" +def multiqc_options = modules['multiqc'] +multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' +multiqc_options.publish_dir += "/$peakType" include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) -// //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) -// include { IGV } from '../modules/local/igv' addParams( options: [:] ) -// include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review -// include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) -// include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) +//include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) +include { IGV } from '../modules/local/igv' addParams( options: [:] ) +include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review +include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) +include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules @@ -286,12 +286,12 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first()) - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( - // PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), - // ch_spp_nsc_header, - // ch_spp_rsc_header, - // ch_spp_correlation_header - // ) + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( + PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), + ch_spp_nsc_header, + ch_spp_rsc_header, + ch_spp_correlation_header + ) // // MODULE: Coverage tracks @@ -388,16 +388,16 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) - // ch_ip_peak - // .join(FRIP_SCORE.out.txt, by: [0]) - // .map { it -> [ it[0], it[2], it[3] ] } - // .set { ch_ip_peak_frip } + ch_ip_peak + .join(FRIP_SCORE.out.txt, by: [0]) + .map { it -> [ it[0], it[2], it[3] ] } + .set { ch_ip_peak_frip } - // MULTIQC_CUSTOM_PEAKS ( - // ch_ip_peak_frip, - // ch_peak_count_header, - // ch_frip_score_header - // ) + MULTIQC_CUSTOM_PEAKS ( + ch_ip_peak_frip, + ch_peak_count_header, + ch_frip_score_header + ) PLOT_MACS2_QC ( MACS2_CALLPEAK.out.peak.collect{it[1]} @@ -486,18 +486,19 @@ workflow CHIPSEQ { } - // // - // // Create IGV session - // // - // IGV ( - // ch_fasta, - // UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - // params.modules['ucsc_bedgraphtobigwig'], - // params.modules['macs2_callpeak'], - // params.modules['macs2_consensus'] - // ) + // + // Create IGV session + // + IGV ( + PREPARE_GENOME.out.fasta, + UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + params.modules['ucsc_bedgraphtobigwig'], + params.modules['macs2_callpeak'], + params.modules['macs2_consensus'] + ) + ch_versions = ch_versions.mix(IGV.out.versions) // // MODULE: Pipeline reporting @@ -506,60 +507,53 @@ workflow CHIPSEQ { ch_versions.unique().collectFile(name: 'collated_versions.yml') ) - // // - // // MODULE: MultiQC - // // - // // ch_multiqc_files = Channel.empty() - // // ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) - // // ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - - // if (!params.skip_multiqc) { - // workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) - // ch_workflow_summary = Channel.value(workflow_summary) - - // MULTIQC ( - // ch_multiqc_config, - // ch_multiqc_custom_config.collect().ifEmpty([]), - // CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), - // ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), - - // FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), - // FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - // FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), - - // MAP_BWA_MEM.out.stats.collect{it[1]}, - // MAP_BWA_MEM.out.flagstat.collect{it[1]}, - // MAP_BWA_MEM.out.idxstats.collect{it[1]}, - - // MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), - // MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), - - // BAM_CLEAN.out.stats.collect{it[1]}.ifEmpty([]), - // BAM_CLEAN.out.flagstat.collect{it[1]}.ifEmpty([]), - // BAM_CLEAN.out.idxstats.collect{it[1]}.ifEmpty([]), - // PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), - - // PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - // DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - // DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), - // PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - - // MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - // MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - // PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - // SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), - // // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) - // ) - // multiqc_report = MULTIQC.out.report.toList() - // } + // + // MODULE: MultiQC + // + if (!params.skip_multiqc) { + workflow_summary = WorkflowChipseq.paramsSummaryMultiqc(workflow, summary_params) + ch_workflow_summary = Channel.value(workflow_summary) + + MULTIQC ( + ch_multiqc_config, + ch_multiqc_custom_config.collect().ifEmpty([]), + CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'), + + FASTQC_TRIMGALORE.out.fastqc_zip.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), + FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), + + ALIGN_BWA_MEM.out.stats.collect{it[1]}, + ALIGN_BWA_MEM.out.flagstat.collect{it[1]}, + ALIGN_BWA_MEM.out.idxstats.collect{it[1]}, + + MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.idxstats.collect{it[1]}.ifEmpty([]), + MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]), + + FILTER_BAM_BAMTOOLS.out.stats.collect{it[1]}.ifEmpty([]), + FILTER_BAM_BAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([]), + FILTER_BAM_BAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([]), + PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + + PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), + DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), + + MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), + MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), + PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), + SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + ) + multiqc_report = MULTIQC.out.report.toList() + } } /* From d59a2ba9a73cc983044c1aaaa327f50f704b8a63 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 19:13:06 +0200 Subject: [PATCH 234/538] Finish cleaning of multiqc module --- modules/local/multiqc.nf | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 734a413bd..70a141474 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -66,14 +66,10 @@ process MULTIQC { output: path "*multiqc_report.html", emit: report path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions - // TODO add the line below: - // path "*_plots" , optional:true, emit: plots script: - // def software = getSoftwareName(task.process) - // def rtitle = custom_runName ? "--title \"$custom_runName\"" : '' - // def rfilename = custom_runName ? "--filename " + custom_runName.replaceAll('\\W','_').replaceAll('_+','_') + "_multiqc_report" : '' def custom_config = params.multiqc_config ? "--config $mqc_custom_config" : '' """ multiqc \\ From 4fbafd53dde65edb0f24e1e98c7e22ea6ceaa5b3 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Oct 2021 19:14:08 +0200 Subject: [PATCH 235/538] Some cleaning --- nextflow.config | 2 +- workflows/chipseq.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 86f36760b..fdeefcc0a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -82,7 +82,6 @@ params { schema_ignore_params = 'genomes,modules' enable_conda = false singularity_pull_docker_container = false - // name = false // TODO remove parameter // Config options custom_config_version = 'master' @@ -104,6 +103,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev // TODO some process will be run by default using this image by now, the individual process container/env should be added +// when the corresponding mulled containers are created and added to the processes process.container = 'nfcore/chipseq:dev' // Load base.config by default for all pipelines diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 54669ea4f..6088a7674 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -81,7 +81,7 @@ include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_home include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) //include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) include { IGV } from '../modules/local/igv' addParams( options: [:] ) -include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) // TODO review +include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) From a781ddf464e160274e52060bf389ab2edabee244 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 26 Oct 2021 22:49:51 +0200 Subject: [PATCH 236/538] Update workflows/chipseq.nf Co-authored-by: Harshil Patel --- workflows/chipseq.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 6088a7674..1a9e4e7df 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -260,7 +260,6 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FILTER_BAM_BAMTOOLS.out.versions.first().ifEmpty(null)) - // // MODULE: Post alignment QC // From 3bdec28f4fe60b927fefe035e7e0b1b3fed1e51c Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 26 Oct 2021 22:50:19 +0200 Subject: [PATCH 237/538] Update modules/local/macs2_consensus.nf Co-authored-by: Harshil Patel --- modules/local/macs2_consensus.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 13f92ba02..5c6615d32 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -29,7 +29,6 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - // def software = getSoftwareName(task.process) def prefix = options.suffix ? "${meta.id}${options.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') From 66d7390b5bc4a5859a4824f05df6fd26dffc01d8 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 26 Oct 2021 23:32:28 +0200 Subject: [PATCH 238/538] Update modules/local/igv.nf Co-authored-by: Harshil Patel --- modules/local/igv.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/igv.nf b/modules/local/igv.nf index ab74d50af..29798880a 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -9,7 +9,7 @@ params.options = [:] process IGV { publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), publish_id:'') } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { From 69fe49ffb7ef615a4eb54d4245db7754a268e8d1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Oct 2021 15:37:41 +0200 Subject: [PATCH 239/538] Add environments for plot_hommer_annotatepeaks --- modules/local/plot_homer_annotatepeaks.nf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 0a2af6b59..2cd9b654e 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -13,7 +13,12 @@ process PLOT_HOMER_ANNOTATEPEAKS { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) //TODO Create mulled biocontainer + conda (params.enable_conda ? "conda-forge::r-base=4.0.3 conda-forge::r-reshape2=1.4.4 conda-forge::r-optparse=1.6.6 conda-forge::r-ggplot2=3.3.3 conda-forge::r-scales=1.1.1 conda-forge::r-viridis=0.5.1 conda-forge::r-tidyverse=1.3.0 bioconda::bioconductor-biostrings=2.58.0 bioconda::bioconductor-complexheatmap=2.6.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" + } else { + container "quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" + } input: path annos From 082d07e670cc6096a3f9c418adc6a78bf42c2b85 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Oct 2021 15:45:02 +0200 Subject: [PATCH 240/538] Add environments for plot_macs2_qc --- modules/local/plot_macs2_qc.nf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf index e83a4f8a7..3080a46e8 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -13,7 +13,12 @@ process PLOT_MACS2_QC { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) //TODO Create updated mulled container + conda (params.enable_conda ? "conda-forge::r-base=4.0.3 conda-forge::r-reshape2=1.4.4 conda-forge::r-optparse=1.6.6 conda-forge::r-ggplot2=3.3.3 conda-forge::r-scales=1.1.1 conda-forge::r-viridis=0.5.1 conda-forge::r-tidyverse=1.3.0 bioconda::bioconductor-biostrings=2.58.0 bioconda::bioconductor-complexheatmap=2.6.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" + } else { + container "quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" + } input: path peaks From ff78d7c571ddb3c530735787ce47ecdb0f6c99c9 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Oct 2021 17:13:03 +0200 Subject: [PATCH 241/538] Mulled container working, no version update --- modules/local/frip_score.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index 7294d08af..ad9123b72 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -11,7 +11,7 @@ process FRIP_SCORE { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.9" : null) //TODO Create updated mulled container + conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.9" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { container "https://depot.galaxyproject.org/singularity/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-0" } else { From 40b8af7d1a8842ef9b58cfa005f8f2adea61abdc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Oct 2021 17:22:57 +0200 Subject: [PATCH 242/538] Mulled container working, no version update --- modules/local/bam_filter.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/bam_filter.nf b/modules/local/bam_filter.nf index 1c7f1b807..b6a17db8e 100644 --- a/modules/local/bam_filter.nf +++ b/modules/local/bam_filter.nf @@ -14,7 +14,7 @@ process BAM_FILTER { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "bioconda::bamtools=2.4.0 bioconda::samtools=1.4.1" : null) //TODO Create updated mulled container + conda (params.enable_conda ? "bioconda::bamtools=2.4.0 bioconda::samtools=1.4.1" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { container "https://depot.galaxyproject.org/singularity/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0" } else { From 822cafee6e03121fd743793efcb4cd85e121f609 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Oct 2021 17:23:28 +0200 Subject: [PATCH 243/538] Delete multiqc comment --- modules/local/multiqc.nf | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 70a141474..319549e60 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -4,13 +4,6 @@ include { initOptions; saveFiles; getSoftwareName; getProcessName } from './func params.options = [:] options = initOptions(params.options) -// Has the run name been specified by the user? -// this has the bonus effect of catching both -name and --name -// custom_runName = params.name // TODO remove -// if (!(workflow.runName ==~ /[a-z]+_[a-z]+/)) { -// custom_runName = workflow.runName -// } - process MULTIQC { label 'process_medium' publishDir "${params.outdir}", From ef1889326b06019b0aee4f75a11652ac82d09105 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 3 Nov 2021 09:27:00 +0100 Subject: [PATCH 244/538] Add mulled container to bam_remove_orphans --- modules/local/bam_remove_orphans.nf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index 16b90e924..5c6ce5086 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -14,13 +14,12 @@ process BAM_REMOVE_ORPHANS { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) - // conda (params.enable_conda ? "conda-forge::python=3.7.6 bioconda::samtools=1.9" : null) //TODO Create updated mulled container - // if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - // container "https://depot.galaxyproject.org/singularity/mulled-v2-1a35167f7a491c7086c13835aaa74b39f1f43979:b8bbb1dc1cb75db128173603ca7a050729cdc526-0" - // } else { - // container "quay.io/biocontainers/mulled-v2-1a35167f7a491c7086c13835aaa74b39f1f43979:b8bbb1dc1cb75db128173603ca7a050729cdc526-0" - // } // TODO: Needs pysam library that is not in the mulled container + conda (params.enable_conda ? "bioconda::pysam=0.16.0.1 bioconda::samtools=1.13" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0" + } else { + container "quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0" + } input: tuple val(meta), path(bam) From 312cf6f40cc1d5f6438f502ba59e7b0ce0dfdc28 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 9 Nov 2021 22:19:20 +0100 Subject: [PATCH 245/538] Add mulled container to macs2_consensus --- modules/local/macs2_consensus.nf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 5c6615d32..dfd05d4bb 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -14,7 +14,13 @@ process MACS2_CONSENSUS { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? "${baseDir}/environment.yml" : null) + conda (params.enable_conda ? "conda-forge::biopython conda-forge::r-optparse=1.7.1 conda-forge::r-upsetr=1.4.0 bioconda::bedtools=2.30.0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" + } else { + // container "quay.io/biocontainers/mulled-v2-dc9ae2a680e9de06c4c555847fbdb8d178f465e6:5e559b41071eb9b24eb25e3a763a75e557120b69-0" + container "quay.io/biocontainers/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" + } input: tuple val(meta), path(peaks) From 511ef297be8d8d0f50ca4fde817b05632b32ca0a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 9 Nov 2021 22:20:29 +0100 Subject: [PATCH 246/538] Fix versions reporting --- modules/local/plot_macs2_qc.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf index 3080a46e8..3f5590481 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -38,7 +38,6 @@ process PLOT_MACS2_QC { cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - python: \$(python --version | sed 's/Python //g') r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') END_VERSIONS """ From 0b29cb9561d72ab09c7346298ea65c38bf9d96d5 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 9 Nov 2021 22:29:39 +0100 Subject: [PATCH 247/538] Dump version after each module execution and not at the end --- subworkflows/nf-core/align_bwa_mem.nf | 12 +++++++++--- subworkflows/nf-core/bam_sort_samtools.nf | 9 +++++---- subworkflows/nf-core/bam_stats_samtools.nf | 13 +++++++------ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/subworkflows/nf-core/align_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf index 98c73149e..3d1c8a325 100644 --- a/subworkflows/nf-core/align_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -19,11 +19,17 @@ workflow ALIGN_BWA_MEM { ch_versions = Channel.empty() + // + // Map reads with BWA + // BWA_MEM(reads, index) - BAM_SORT_SAMTOOLS(BWA_MEM.out.bam) + ch_versions = ch_versions.mix(BWA_MEM.out.versions.first()) - ch_versions = ch_versions.mix(BWA_MEM.out.versions.first(), - BAM_SORT_SAMTOOLS.out.versions) + // + // Sort, index BAM file and run samtools stats, flagstat and idxstats + // + BAM_SORT_SAMTOOLS(BWA_MEM.out.bam) + ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first()) emit: bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/subworkflows/nf-core/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf index e7652259a..53148682a 100644 --- a/subworkflows/nf-core/bam_sort_samtools.nf +++ b/subworkflows/nf-core/bam_sort_samtools.nf @@ -19,12 +19,13 @@ workflow BAM_SORT_SAMTOOLS { ch_versions = Channel.empty() SAMTOOLS_SORT(ch_bam) + ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) + SAMTOOLS_INDEX(SAMTOOLS_SORT.out.bam) - BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first(), - SAMTOOLS_INDEX.out.versions.first(), - BAM_STATS_SAMTOOLS.out.versions) + BAM_STATS_SAMTOOLS(SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0])) + ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) emit: bam = SAMTOOLS_SORT.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 013ffac9e..5307c239c 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -16,13 +16,14 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = Channel.empty() - SAMTOOLS_STATS(ch_bam_bai) - SAMTOOLS_FLAGSTAT(ch_bam_bai) - SAMTOOLS_IDXSTATS(ch_bam_bai) + SAMTOOLS_STATS ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first()) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first(), - SAMTOOLS_FLAGSTAT.out.versions.first(), - SAMTOOLS_IDXSTATS.out.versions.first()) + SAMTOOLS_FLAGSTAT ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions.first()) + + SAMTOOLS_IDXSTATS ( ch_bam_bai ) + ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions.first()) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), [ stats ] ] From a26726763b001290f9161f951db10445a50fd86a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 9 Nov 2021 22:32:14 +0100 Subject: [PATCH 248/538] Get rid of the single container in nextflow.config --- .nf-core.yml | 1 - nextflow.config | 9 --------- 2 files changed, 10 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index c8445e750..daf3ed014 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,6 @@ lint: - assets/email_template.txt - lib/NfcoreTemplate.groovy - assets/multiqc_config.yaml - actions_ci: False #get rid of the error "CI is not building the correct docker image. Should be: docker build..." files_exist: - bin/scrape_software_versions.py - modules/local/get_software_versions.nf diff --git a/nextflow.config b/nextflow.config index fdeefcc0a..58be034c9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -100,12 +100,6 @@ params { } -// Container slug. Stable releases should specify release tag! -// Developmental code should specify :dev -// TODO some process will be run by default using this image by now, the individual process container/env should be added -// when the corresponding mulled containers are created and added to the processes -process.container = 'nfcore/chipseq:dev' - // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -177,9 +171,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Increase time available to build conda environment -conda { createTimeout = "60 min" } - // Export these variables to prevent local Python/R libraries from conflicting with those in the container env { PYTHONNOUSERSITE = 1 From a7e43b8ddea4ac6a1026ee40c8ef2e5a46ca75f4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 9 Nov 2021 22:32:33 +0100 Subject: [PATCH 249/538] Fix nextflow_schema --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index f7198db55..b31317e2e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -28,7 +28,7 @@ "type": "integer", "description": "Estimated fragment size used to extend single-end reads.", "fa_icon": "fas fa-chart-area", - "default": "200" + "default": 200 }, "seq_center": { "type": "string", @@ -588,4 +588,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file From 679f0137db336286ab4871e19f97c288d5c03e1a Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 11 Nov 2021 13:39:48 +0100 Subject: [PATCH 250/538] Update modules/local/macs2_consensus.nf Co-authored-by: Harshil Patel --- modules/local/macs2_consensus.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index dfd05d4bb..53248d5f9 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -18,7 +18,6 @@ process MACS2_CONSENSUS { if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { container "https://depot.galaxyproject.org/singularity/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" } else { - // container "quay.io/biocontainers/mulled-v2-dc9ae2a680e9de06c4c555847fbdb8d178f465e6:5e559b41071eb9b24eb25e3a763a75e557120b69-0" container "quay.io/biocontainers/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" } From 41ce4ecddffc898f59305d91dab438a822df333f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 2 Dec 2021 22:12:03 +0100 Subject: [PATCH 251/538] Update nf-core modules --- modules.json | 54 +++++------ .../nf-core/modules/bwa/index/functions.nf | 78 --------------- modules/nf-core/modules/bwa/index/main.nf | 28 ++---- modules/nf-core/modules/bwa/mem/functions.nf | 78 --------------- modules/nf-core/modules/bwa/mem/main.nf | 29 ++---- .../custom/dumpsoftwareversions/functions.nf | 78 --------------- .../custom/dumpsoftwareversions/main.nf | 95 +------------------ .../custom/dumpsoftwareversions/meta.yml | 1 + .../templates/dumpsoftwareversions.py | 89 +++++++++++++++++ .../deeptools/computematrix/functions.nf | 78 --------------- .../modules/deeptools/computematrix/main.nf | 26 ++--- .../deeptools/plotfingerprint/functions.nf | 78 --------------- .../modules/deeptools/plotfingerprint/main.nf | 26 ++--- .../deeptools/plotheatmap/functions.nf | 78 --------------- .../modules/deeptools/plotheatmap/main.nf | 26 ++--- .../deeptools/plotprofile/functions.nf | 78 --------------- .../modules/deeptools/plotprofile/main.nf | 26 ++--- modules/nf-core/modules/fastqc/functions.nf | 78 --------------- modules/nf-core/modules/fastqc/main.nf | 32 +++---- modules/nf-core/modules/gffread/functions.nf | 78 --------------- modules/nf-core/modules/gffread/main.nf | 26 ++--- modules/nf-core/modules/gunzip/functions.nf | 78 --------------- modules/nf-core/modules/gunzip/main.nf | 32 +++---- modules/nf-core/modules/gunzip/meta.yml | 6 ++ .../modules/homer/annotatepeaks/functions.nf | 78 --------------- .../modules/homer/annotatepeaks/main.nf | 28 ++---- .../modules/macs2/callpeak/functions.nf | 78 --------------- .../nf-core/modules/macs2/callpeak/main.nf | 37 ++++---- .../nf-core/modules/macs2/callpeak/meta.yml | 63 ++++++++++++ modules/nf-core/modules/multiqc/functions.nf | 78 --------------- modules/nf-core/modules/multiqc/main.nf | 24 ++--- .../modules/phantompeakqualtools/functions.nf | 78 --------------- .../modules/phantompeakqualtools/main.nf | 27 ++---- .../collectmultiplemetrics/functions.nf | 78 --------------- .../picard/collectmultiplemetrics/main.nf | 26 ++--- .../picard/markduplicates/functions.nf | 78 --------------- .../modules/picard/markduplicates/main.nf | 32 +++---- .../modules/picard/mergesamfiles/functions.nf | 78 --------------- .../modules/picard/mergesamfiles/main.nf | 30 ++---- .../modules/preseq/lcextrap/functions.nf | 78 --------------- .../nf-core/modules/preseq/lcextrap/main.nf | 26 ++--- .../modules/samtools/flagstat/functions.nf | 78 --------------- .../nf-core/modules/samtools/flagstat/main.nf | 26 ++--- .../modules/samtools/idxstats/functions.nf | 78 --------------- .../nf-core/modules/samtools/idxstats/main.nf | 24 ++--- .../modules/samtools/index/functions.nf | 78 --------------- .../nf-core/modules/samtools/index/main.nf | 36 +++---- .../nf-core/modules/samtools/index/meta.yml | 5 + .../modules/samtools/sort/functions.nf | 78 --------------- modules/nf-core/modules/samtools/sort/main.nf | 28 ++---- .../modules/samtools/stats/functions.nf | 78 --------------- .../nf-core/modules/samtools/stats/main.nf | 31 +++--- .../nf-core/modules/samtools/stats/meta.yml | 21 ++-- .../subread/featurecounts/functions.nf | 78 --------------- .../modules/subread/featurecounts/main.nf | 26 ++--- .../nf-core/modules/trimgalore/functions.nf | 78 --------------- modules/nf-core/modules/trimgalore/main.nf | 32 +++---- .../ucsc/bedgraphtobigwig/functions.nf | 78 --------------- .../modules/ucsc/bedgraphtobigwig/main.nf | 26 ++--- modules/nf-core/modules/untar/functions.nf | 78 --------------- modules/nf-core/modules/untar/main.nf | 28 ++---- 61 files changed, 456 insertions(+), 2722 deletions(-) delete mode 100644 modules/nf-core/modules/bwa/index/functions.nf delete mode 100644 modules/nf-core/modules/bwa/mem/functions.nf delete mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/deeptools/computematrix/functions.nf delete mode 100644 modules/nf-core/modules/deeptools/plotfingerprint/functions.nf delete mode 100644 modules/nf-core/modules/deeptools/plotheatmap/functions.nf delete mode 100644 modules/nf-core/modules/deeptools/plotprofile/functions.nf delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/gffread/functions.nf delete mode 100644 modules/nf-core/modules/gunzip/functions.nf delete mode 100644 modules/nf-core/modules/homer/annotatepeaks/functions.nf delete mode 100644 modules/nf-core/modules/macs2/callpeak/functions.nf create mode 100644 modules/nf-core/modules/macs2/callpeak/meta.yml delete mode 100644 modules/nf-core/modules/multiqc/functions.nf delete mode 100644 modules/nf-core/modules/phantompeakqualtools/functions.nf delete mode 100644 modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf delete mode 100644 modules/nf-core/modules/picard/markduplicates/functions.nf delete mode 100644 modules/nf-core/modules/picard/mergesamfiles/functions.nf delete mode 100644 modules/nf-core/modules/preseq/lcextrap/functions.nf delete mode 100644 modules/nf-core/modules/samtools/flagstat/functions.nf delete mode 100644 modules/nf-core/modules/samtools/idxstats/functions.nf delete mode 100644 modules/nf-core/modules/samtools/index/functions.nf delete mode 100644 modules/nf-core/modules/samtools/sort/functions.nf delete mode 100644 modules/nf-core/modules/samtools/stats/functions.nf delete mode 100644 modules/nf-core/modules/subread/featurecounts/functions.nf delete mode 100644 modules/nf-core/modules/trimgalore/functions.nf delete mode 100644 modules/nf-core/modules/ucsc/bedgraphtobigwig/functions.nf delete mode 100644 modules/nf-core/modules/untar/functions.nf diff --git a/modules.json b/modules.json index 1d5fdedc8..f56ae271e 100644 --- a/modules.json +++ b/modules.json @@ -4,85 +4,85 @@ "repos": { "nf-core/modules": { "bwa/index": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "bwa/mem": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "custom/dumpsoftwareversions": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "deeptools/computematrix": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "deeptools/plotfingerprint": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "deeptools/plotheatmap": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "deeptools/plotprofile": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "fastqc": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "gffread": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "gunzip": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "homer/annotatepeaks": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "macs2/callpeak": { - "git_sha": "7b3315591a149609e27914965f858c9a7e071564" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "phantompeakqualtools": { - "git_sha": "7b3315591a149609e27914965f858c9a7e071564" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "picard/collectmultiplemetrics": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "picard/markduplicates": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "picard/mergesamfiles": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "preseq/lcextrap": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "samtools/flagstat": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/idxstats": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/index": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "samtools/sort": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "samtools/stats": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, "subread/featurecounts": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "trimgalore": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "ucsc/bedgraphtobigwig": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "untar": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/nf-core/modules/bwa/index/functions.nf b/modules/nf-core/modules/bwa/index/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/bwa/index/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/bwa/index/main.nf b/modules/nf-core/modules/bwa/index/main.nf index 479431eda..891027377 100644 --- a/modules/nf-core/modules/bwa/index/main.nf +++ b/modules/nf-core/modules/bwa/index/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BWA_INDEX { tag "$fasta" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'index', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::bwa=0.7.17" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7" - } else { - container "quay.io/biocontainers/bwa:0.7.17--hed695b0_7" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bwa:0.7.17--hed695b0_7' : + 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' }" input: path fasta @@ -26,17 +15,18 @@ process BWA_INDEX { path "versions.yml", emit: versions script: + def args = task.ext.args ?: '' """ mkdir bwa bwa \\ index \\ - $options.args \\ - $fasta \\ - -p bwa/${fasta.baseName} + $args \\ + -p bwa/${fasta.baseName} \\ + $fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + "${task.process}": + bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/bwa/mem/functions.nf b/modules/nf-core/modules/bwa/mem/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/bwa/mem/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/bwa/mem/main.nf b/modules/nf-core/modules/bwa/mem/main.nf index b6a548d7d..801293a8f 100644 --- a/modules/nf-core/modules/bwa/mem/main.nf +++ b/modules/nf-core/modules/bwa/mem/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BWA_MEM { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.12" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0" - } else { - container "quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0' : + 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0' }" input: tuple val(meta), path(reads) @@ -27,22 +16,24 @@ process BWA_MEM { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` bwa mem \\ - $options.args \\ + $args \\ $read_group \\ -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools view $options.args2 -@ $task.cpus -bhS -o ${prefix}.bam - + | samtools view $args2 -@ $task.cpus -bhS -o ${prefix}.bam - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') + "${task.process}": + bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index faf2073f7..934bb4672 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path versions @@ -27,80 +16,6 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "versions.yml" , emit: versions script: - """ - #!/usr/bin/env python - - import yaml - import platform - from textwrap import dedent - - def _make_versions_html(versions): - html = [ - dedent( - '''\\ - - - - - - - - - - ''' - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f'''\\ - - - - - - ''' - ) - ) - html.append("") - html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") - return "\\n".join(html) - - module_versions = {} - module_versions["${getProcessName(task.process)}"] = { - 'python': platform.python_version(), - 'yaml': yaml.__version__ - } - - with open("$versions") as f: - workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions - - workflow_versions["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version" - } - - versions_mqc = { - 'id': 'software_versions', - 'section_name': '${workflow.manifest.name} Software Versions', - 'section_href': 'https://github.com/${workflow.manifest.name}', - 'plot_type': 'html', - 'description': 'are collected at run time from the software output.', - 'data': _make_versions_html(workflow_versions) - } - - with open("software_versions.yml", 'w') as f: - yaml.dump(workflow_versions, f, default_flow_style=False) - with open("software_versions_mqc.yml", 'w') as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open('versions.yml', 'w') as f: - yaml.dump(module_versions, f, default_flow_style=False) - """ + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index c8310e356..5b5b8a602 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -31,3 +31,4 @@ output: authors: - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 000000000..d13903925 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/deeptools/computematrix/functions.nf b/modules/nf-core/modules/deeptools/computematrix/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/deeptools/computematrix/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/deeptools/computematrix/main.nf b/modules/nf-core/modules/deeptools/computematrix/main.nf index 9fffdb8e8..70be934bf 100644 --- a/modules/nf-core/modules/deeptools/computematrix/main.nf +++ b/modules/nf-core/modules/deeptools/computematrix/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process DEEPTOOLS_COMPUTEMATRIX { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::deeptools=3.5.1' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0" - } else { - container "quay.io/biocontainers/deeptools:3.5.1--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : + 'quay.io/biocontainers/deeptools:3.5.1--py_0' }" input: tuple val(meta), path(bigwig) @@ -28,10 +17,11 @@ process DEEPTOOLS_COMPUTEMATRIX { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ computeMatrix \\ - $options.args \\ + $args \\ --regionsFileName $bed \\ --scoreFileName $bigwig \\ --outFileName ${prefix}.computeMatrix.mat.gz \\ @@ -39,8 +29,8 @@ process DEEPTOOLS_COMPUTEMATRIX { --numberOfProcessors $task.cpus cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(computeMatrix --version | sed -e "s/computeMatrix //g") + "${task.process}": + deeptools: \$(computeMatrix --version | sed -e "s/computeMatrix //g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/deeptools/plotfingerprint/functions.nf b/modules/nf-core/modules/deeptools/plotfingerprint/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/deeptools/plotfingerprint/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/deeptools/plotfingerprint/main.nf b/modules/nf-core/modules/deeptools/plotfingerprint/main.nf index b2d167f9b..7925c9a97 100644 --- a/modules/nf-core/modules/deeptools/plotfingerprint/main.nf +++ b/modules/nf-core/modules/deeptools/plotfingerprint/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process DEEPTOOLS_PLOTFINGERPRINT { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::deeptools=3.5.1' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0" - } else { - container "quay.io/biocontainers/deeptools:3.5.1--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : + 'quay.io/biocontainers/deeptools:3.5.1--py_0' }" input: tuple val(meta), path(bams), path(bais) @@ -28,11 +17,12 @@ process DEEPTOOLS_PLOTFINGERPRINT { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def extend = (meta.single_end && params.fragment_size > 0) ? "--extendReads ${params.fragment_size}" : '' """ plotFingerprint \\ - $options.args \\ + $args \\ $extend \\ --bamfiles ${bams.join(' ')} \\ --plotFile ${prefix}.plotFingerprint.pdf \\ @@ -41,8 +31,8 @@ process DEEPTOOLS_PLOTFINGERPRINT { --numberOfProcessors $task.cpus cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(plotFingerprint --version | sed -e "s/plotFingerprint //g") + "${task.process}": + deeptools: \$(plotFingerprint --version | sed -e "s/plotFingerprint //g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/deeptools/plotheatmap/functions.nf b/modules/nf-core/modules/deeptools/plotheatmap/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/deeptools/plotheatmap/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/deeptools/plotheatmap/main.nf b/modules/nf-core/modules/deeptools/plotheatmap/main.nf index 19c243dfb..992c90583 100644 --- a/modules/nf-core/modules/deeptools/plotheatmap/main.nf +++ b/modules/nf-core/modules/deeptools/plotheatmap/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process DEEPTOOLS_PLOTHEATMAP { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::deeptools=3.5.1' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0" - } else { - container "quay.io/biocontainers/deeptools:3.5.1--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : + 'quay.io/biocontainers/deeptools:3.5.1--py_0' }" input: tuple val(meta), path(matrix) @@ -27,17 +16,18 @@ process DEEPTOOLS_PLOTHEATMAP { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ plotHeatmap \\ - $options.args \\ + $args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotHeatmap.pdf \\ --outFileNameMatrix ${prefix}.plotHeatmap.mat.tab cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(plotHeatmap --version | sed -e "s/plotHeatmap //g") + "${task.process}": + deeptools: \$(plotHeatmap --version | sed -e "s/plotHeatmap //g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/deeptools/plotprofile/functions.nf b/modules/nf-core/modules/deeptools/plotprofile/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/deeptools/plotprofile/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/deeptools/plotprofile/main.nf b/modules/nf-core/modules/deeptools/plotprofile/main.nf index 3a196bd51..60184fa6b 100644 --- a/modules/nf-core/modules/deeptools/plotprofile/main.nf +++ b/modules/nf-core/modules/deeptools/plotprofile/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process DEEPTOOLS_PLOTPROFILE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::deeptools=3.5.1' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0" - } else { - container "quay.io/biocontainers/deeptools:3.5.1--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/deeptools:3.5.1--py_0' : + 'quay.io/biocontainers/deeptools:3.5.1--py_0' }" input: tuple val(meta), path(matrix) @@ -27,17 +16,18 @@ process DEEPTOOLS_PLOTPROFILE { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ plotProfile \\ - $options.args \\ + $args \\ --matrixFile $matrix \\ --outFileName ${prefix}.plotProfile.pdf \\ --outFileNameData ${prefix}.plotProfile.tab cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(plotProfile --version | sed -e "s/plotProfile //g") + "${task.process}": + deeptools: \$(plotProfile --version | sed -e "s/plotProfile //g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 9f6cfc553..d250eca07 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -27,27 +16,28 @@ process FASTQC { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz + fastqc $args --threads $task.cpus ${prefix}.fastq.gz cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( fastqc --version | sed -e "s/FastQC v//g" ) + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( fastqc --version | sed -e "s/FastQC v//g" ) + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/gffread/functions.nf b/modules/nf-core/modules/gffread/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/gffread/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/gffread/main.nf b/modules/nf-core/modules/gffread/main.nf index 4133ee087..d31f76f82 100644 --- a/modules/nf-core/modules/gffread/main.nf +++ b/modules/nf-core/modules/gffread/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process GFFREAD { tag "$gff" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::gffread=0.12.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/gffread:0.12.1--h8b12597_0" - } else { - container "quay.io/biocontainers/gffread:0.12.1--h8b12597_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gffread:0.12.1--h8b12597_0' : + 'quay.io/biocontainers/gffread:0.12.1--h8b12597_0' }" input: path gff @@ -26,15 +15,16 @@ process GFFREAD { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${gff.baseName}${options.suffix}" : "${gff.baseName}" + def args = task.ext.args ?: '' + def prefix = task.ext.suffix ? "${gff.baseName}${task.ext.suffix}" : "${gff.baseName}" """ gffread \\ $gff \\ - $options.args \\ + $args \\ -o ${prefix}.gtf cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(gffread --version 2>&1) + "${task.process}": + gffread: \$(gffread --version 2>&1) END_VERSIONS """ } diff --git a/modules/nf-core/modules/gunzip/functions.nf b/modules/nf-core/modules/gunzip/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/gunzip/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/gunzip/main.nf b/modules/nf-core/modules/gunzip/main.nf index aec4569fa..77a4e546b 100644 --- a/modules/nf-core/modules/gunzip/main.nf +++ b/modules/nf-core/modules/gunzip/main.nf @@ -1,41 +1,31 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process GUNZIP { tag "$archive" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: - path archive + tuple val(meta), path(archive) output: - path "$gunzip", emit: gunzip - path "versions.yml" , emit: versions + tuple val(meta), path("$gunzip"), emit: gunzip + path "versions.yml" , emit: versions script: - gunzip = archive.toString() - '.gz' + def args = task.ext.args ?: '' + gunzip = archive.toString() - '.gz' """ gunzip \\ -f \\ - $options.args \\ + $args \\ $archive cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') + "${task.process}": + gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/gunzip/meta.yml b/modules/nf-core/modules/gunzip/meta.yml index 3482f0d28..ea1f15460 100644 --- a/modules/nf-core/modules/gunzip/meta.yml +++ b/modules/nf-core/modules/gunzip/meta.yml @@ -10,6 +10,11 @@ tools: documentation: https://www.gnu.org/software/gzip/manual/gzip.html licence: ['GPL-3.0-or-later'] input: + - meta: + type: map + description: | + Optional groovy Map containing meta information + e.g. [ id:'test', single_end:false ] - archive: type: file description: File to be compressed/uncompressed @@ -26,3 +31,4 @@ output: authors: - "@joseespinosa" - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/modules/homer/annotatepeaks/functions.nf b/modules/nf-core/modules/homer/annotatepeaks/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/homer/annotatepeaks/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/homer/annotatepeaks/main.nf b/modules/nf-core/modules/homer/annotatepeaks/main.nf index 1714644b8..84e0241a4 100644 --- a/modules/nf-core/modules/homer/annotatepeaks/main.nf +++ b/modules/nf-core/modules/homer/annotatepeaks/main.nf @@ -1,24 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -def VERSION = '4.11' +def VERSION = '4.11' // Version information not provided by tool on CLI process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::homer=4.11" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/homer:4.11--pl526hc9558a2_3" - } else { - container "quay.io/biocontainers/homer:4.11--pl526hc9558a2_3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/homer:4.11--pl526hc9558a2_3' : + 'quay.io/biocontainers/homer:4.11--pl526hc9558a2_3' }" input: tuple val(meta), path(peak) @@ -30,19 +19,20 @@ process HOMER_ANNOTATEPEAKS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ annotatePeaks.pl \\ $peak \\ $fasta \\ - $options.args \\ + $args \\ -gtf $gtf \\ -cpu $task.cpus \\ > ${prefix}.annotatePeaks.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo $VERSION) + "${task.process}": + homer: $VERSION END_VERSIONS """ } diff --git a/modules/nf-core/modules/macs2/callpeak/functions.nf b/modules/nf-core/modules/macs2/callpeak/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/macs2/callpeak/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/macs2/callpeak/main.nf b/modules/nf-core/modules/macs2/callpeak/main.nf index d54d406db..c5c88f8e0 100644 --- a/modules/nf-core/modules/macs2/callpeak/main.nf +++ b/modules/nf-core/modules/macs2/callpeak/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MACS2_CALLPEAK { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::macs2=2.2.7.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py38h0213d0e_1" - } else { - container "quay.io/biocontainers/macs2:2.2.7.1--py38h0213d0e_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/macs2:2.2.7.1--py38h4a8c8d9_3' : + 'quay.io/biocontainers/macs2:2.2.7.1--py38h4a8c8d9_3' }" input: tuple val(meta), path(ipbam), path(controlbam) @@ -32,13 +21,21 @@ process MACS2_CALLPEAK { tuple val(meta), path("*.bdg") , optional:true, emit: bdg script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" - def format = meta.single_end ? 'BAM' : 'BAMPE' - def control = controlbam ? "--control $controlbam" : '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def args_list = args.tokenize() + def format = meta.single_end ? 'BAM' : 'BAMPE' + def control = controlbam ? "--control $controlbam" : '' + if(args_list.contains('--format')){ + def id = args_list.findIndexOf{it=='--format'} + format = args_list[id+1] + args_list.remove(id+1) + args_list.remove(id) + } """ macs2 \\ callpeak \\ - $options.args \\ + ${args_list.join(' ')} \\ --gsize $macs2_gsize \\ --format $format \\ --name $prefix \\ @@ -46,8 +43,8 @@ process MACS2_CALLPEAK { $control cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(macs2 --version | sed -e "s/macs2 //g") + "${task.process}": + macs2: \$(macs2 --version | sed -e "s/macs2 //g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/macs2/callpeak/meta.yml b/modules/nf-core/modules/macs2/callpeak/meta.yml new file mode 100644 index 000000000..afb949ece --- /dev/null +++ b/modules/nf-core/modules/macs2/callpeak/meta.yml @@ -0,0 +1,63 @@ +name: macs2_callpeak +description: Peak calling of enriched genomic regions of ChIP-seq and ATAC-seq experiments +keywords: + - alignment + - atac-seq + - chip-seq + - peak-calling +tools: + - macs2: + description: Model Based Analysis for ChIP-Seq data + homepage: None + documentation: https://docs.csc.fi/apps/macs2/ + tool_dev_url: https://github.com/macs3-project/MACS + doi: "https://doi.org/10.1101/496521" + licence: ['BSD'] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ipbam: + type: file + description: The ChIP-seq treatment file + - controlbam: + type: file + description: The control file + - macs2_gsize: + type: string + description: Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), + 'mm' for mouse (1.87e9), 'ce' for C. elegans (9e7) and 'dm' for fruitfly (1.2e8) + +output: + - versions: + type: file + description: File containing software version + pattern: "versions.yml" + - peak: + type: file + description: BED file containing annotated peaks + pattern: "*.gappedPeak,*.narrowPeak}" + - xls: + type: file + description: xls file containing annotated peaks + pattern: "*.xls" + - gapped: + type: file + description: Optional BED file containing gapped peak + pattern: "*.gappedPeak" + - bed: + type: file + description: Optional BED file containing peak summits locations for every peak + pattern: "*.bed" + - bdg: + type: file + description: Optional bedGraph files for input and treatment input samples + pattern: "*.bdg" + +authors: + - "@ntoda03" + - "@JoseEspinosa" + - "@jianhong" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 0861aa593..3dceb162a 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path multiqc_files @@ -27,12 +16,13 @@ process MULTIQC { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - multiqc -f $options.args . + multiqc -f $args . cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ } diff --git a/modules/nf-core/modules/phantompeakqualtools/functions.nf b/modules/nf-core/modules/phantompeakqualtools/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/phantompeakqualtools/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index b390bf7e2..6fe34cc28 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -1,24 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -def VERSION = '1.2.2' +def VERSION = '1.2.2' // Version information not provided by tool on CLI process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::phantompeakqualtools=1.2.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0" - } else { - container "quay.io/biocontainers/phantompeakqualtools:1.2.2--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0' : + 'quay.io/biocontainers/phantompeakqualtools:1.2.2--0' }" input: tuple val(meta), path(bam) @@ -30,13 +19,15 @@ process PHANTOMPEAKQUALTOOLS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo $VERSION) + "${task.process}": + phantompeakqualtools: $VERSION END_VERSIONS """ } diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index dd8fdacaa..6b292534c 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -28,7 +17,8 @@ process PICARD_COLLECTMULTIPLEMETRICS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -39,14 +29,14 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard \\ -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ - $options.args \\ + $args \\ INPUT=$bam \\ OUTPUT=${prefix}.CollectMultipleMetrics \\ REFERENCE_SEQUENCE=$fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) + "${task.process}": + picard: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) END_VERSIONS """ } diff --git a/modules/nf-core/modules/picard/markduplicates/functions.nf b/modules/nf-core/modules/picard/markduplicates/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/picard/markduplicates/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 37b825d78..d3bf69385 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -28,7 +17,8 @@ process PICARD_MARKDUPLICATES { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def avail_mem = 3 if (!task.memory) { log.info '[Picard MarkDuplicates] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -39,14 +29,14 @@ process PICARD_MARKDUPLICATES { picard \\ -Xmx${avail_mem}g \\ MarkDuplicates \\ - $options.args \\ - -I $bam \\ - -O ${prefix}.bam \\ - -M ${prefix}.MarkDuplicates.metrics.txt + $args \\ + I=$bam \\ + O=${prefix}.bam \\ + M=${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + "${task.process}": + picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ } diff --git a/modules/nf-core/modules/picard/mergesamfiles/functions.nf b/modules/nf-core/modules/picard/mergesamfiles/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/picard/mergesamfiles/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/picard/mergesamfiles/main.nf b/modules/nf-core/modules/picard/mergesamfiles/main.nf index 355c0bf3b..867965932 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/main.nf +++ b/modules/nf-core/modules/picard/mergesamfiles/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/picard:2.25.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" input: tuple val(meta), path(bams) @@ -26,7 +15,8 @@ process PICARD_MERGESAMFILES { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def bam_files = bams.sort() def avail_mem = 3 if (!task.memory) { @@ -39,20 +29,20 @@ process PICARD_MERGESAMFILES { picard \\ -Xmx${avail_mem}g \\ MergeSamFiles \\ - $options.args \\ + $args \\ ${'INPUT='+bam_files.join(' INPUT=')} \\ OUTPUT=${prefix}.bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + "${task.process}": + picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ } else { """ ln -s ${bam_files[0]} ${prefix}.bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + "${task.process}": + picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ } diff --git a/modules/nf-core/modules/preseq/lcextrap/functions.nf b/modules/nf-core/modules/preseq/lcextrap/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/preseq/lcextrap/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/preseq/lcextrap/main.nf b/modules/nf-core/modules/preseq/lcextrap/main.nf index f551a5493..b5bd06206 100644 --- a/modules/nf-core/modules/preseq/lcextrap/main.nf +++ b/modules/nf-core/modules/preseq/lcextrap/main.nf @@ -1,23 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PRESEQ_LCEXTRAP { tag "$meta.id" label 'process_medium' label 'error_ignore' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::preseq=3.1.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/preseq:3.1.2--h06ef8b0_1" - } else { - container "quay.io/biocontainers/preseq:3.1.2--h06ef8b0_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/preseq:3.1.2--h06ef8b0_1' : + 'quay.io/biocontainers/preseq:3.1.2--h06ef8b0_1' }" input: tuple val(meta), path(bam) @@ -28,20 +17,21 @@ process PRESEQ_LCEXTRAP { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def paired_end = meta.single_end ? '' : '-pe' """ preseq \\ lc_extrap \\ - $options.args \\ + $args \\ $paired_end \\ -output ${prefix}.ccurve.txt \\ $bam cp .command.err ${prefix}.command.log cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//') + "${task.process}": + preseq: \$(echo \$(preseq 2>&1) | sed 's/^.*Version: //; s/Usage:.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/flagstat/functions.nf b/modules/nf-core/modules/samtools/flagstat/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/samtools/flagstat/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index f9115c6bb..03721d0b2 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam), path(bai) @@ -26,11 +15,12 @@ process SAMTOOLS_FLAGSTAT { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - samtools flagstat $bam > ${bam}.flagstat + samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/idxstats/functions.nf b/modules/nf-core/modules/samtools/idxstats/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/samtools/idxstats/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index b005088ab..cd0686791 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam), path(bai) @@ -26,11 +15,12 @@ process SAMTOOLS_IDXSTATS { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ samtools idxstats $bam > ${bam}.idxstats cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/samtools/index/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index febbc11ca..b033e2258 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -1,37 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(input) output: - tuple val(meta), path("*.bai"), optional:true, emit: bai - tuple val(meta), path("*.csi"), optional:true, emit: csi - path "versions.yml" , emit: versions + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.crai"), optional:true, emit: crai + tuple val(meta), path("*.csi") , optional:true, emit: csi + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - samtools index $options.args $bam + samtools index -@ ${task.cpus-1} $args $input + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 988e8f53b..0905b3cd6 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -35,6 +35,10 @@ output: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" - csi: type: file description: CSI index file @@ -46,3 +50,4 @@ output: authors: - "@drpatelh" - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/samtools/sort/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index b30f6f45c..0c2cf25e3 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam) @@ -26,12 +15,13 @@ process SAMTOOLS_SORT { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/samtools/stats/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 6218dd2dd..83c870025 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,36 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - tuple val(meta), path(bam), path(bai) + tuple val(meta), path(input), path(input_index) + path fasta output: tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' + def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats $bam > ${bam}.stats + samtools stats --threads ${task.cpus-1} ${reference} ${input} > ${input}.stats + cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index ae41498a2..869e62e37 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -22,14 +22,18 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" output: - meta: type: map @@ -46,3 +50,4 @@ output: pattern: "versions.yml" authors: - "@drpatelh" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/subread/featurecounts/functions.nf b/modules/nf-core/modules/subread/featurecounts/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/subread/featurecounts/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/subread/featurecounts/main.nf b/modules/nf-core/modules/subread/featurecounts/main.nf index 0a0285dbf..53eb279e1 100644 --- a/modules/nf-core/modules/subread/featurecounts/main.nf +++ b/modules/nf-core/modules/subread/featurecounts/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SUBREAD_FEATURECOUNTS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::subread=2.0.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" - } else { - container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' : + 'quay.io/biocontainers/subread:2.0.1--hed695b0_0' }" input: tuple val(meta), path(bams), path(annotation) @@ -27,7 +16,8 @@ process SUBREAD_FEATURECOUNTS { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def paired_end = meta.single_end ? '' : '-p' def strandedness = 0 @@ -38,7 +28,7 @@ process SUBREAD_FEATURECOUNTS { } """ featureCounts \\ - $options.args \\ + $args \\ $paired_end \\ -T $task.cpus \\ -a $annotation \\ @@ -47,8 +37,8 @@ process SUBREAD_FEATURECOUNTS { ${bams.join(' ')} cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") + "${task.process}": + subread: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") END_VERSIONS """ } diff --git a/modules/nf-core/modules/trimgalore/functions.nf b/modules/nf-core/modules/trimgalore/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/trimgalore/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/trimgalore/main.nf b/modules/nf-core/modules/trimgalore/main.nf index 8e77f1f77..ee40b780b 100644 --- a/modules/nf-core/modules/trimgalore/main.nf +++ b/modules/nf-core/modules/trimgalore/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process TRIMGALORE { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::trim-galore=0.6.7' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/trim-galore:0.6.7--hdfd78af_0" - } else { - container "quay.io/biocontainers/trim-galore:0.6.7--hdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/trim-galore:0.6.7--hdfd78af_0' : + 'quay.io/biocontainers/trim-galore:0.6.7--hdfd78af_0' }" input: tuple val(meta), path(reads) @@ -30,6 +19,7 @@ process TRIMGALORE { tuple val(meta), path("*.zip") , emit: zip optional true script: + def args = task.ext.args ?: '' // Calculate number of --cores for TrimGalore based on value of task.cpus // See: https://github.com/FelixKrueger/TrimGalore/blob/master/Changelog.md#version-060-release-on-1-mar-2019 // See: https://github.com/nf-core/atacseq/pull/65 @@ -48,20 +38,20 @@ process TRIMGALORE { def tpc_r2 = params.three_prime_clip_r2 > 0 ? "--three_prime_clip_r2 ${params.three_prime_clip_r2}" : '' // Added soft-links to original fastqs for consistent naming in MultiQC - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz trim_galore \\ - $options.args \\ + $args \\ --cores $cores \\ --gzip \\ $c_r1 \\ $tpc_r1 \\ ${prefix}.fastq.gz cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') + "${task.process}": + trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') cutadapt: \$(cutadapt --version) END_VERSIONS """ @@ -70,7 +60,7 @@ process TRIMGALORE { [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz trim_galore \\ - $options.args \\ + $args \\ --cores $cores \\ --paired \\ --gzip \\ @@ -81,8 +71,8 @@ process TRIMGALORE { ${prefix}_1.fastq.gz \\ ${prefix}_2.fastq.gz cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') + "${task.process}": + trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') cutadapt: \$(cutadapt --version) END_VERSIONS """ diff --git a/modules/nf-core/modules/ucsc/bedgraphtobigwig/functions.nf b/modules/nf-core/modules/ucsc/bedgraphtobigwig/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/ucsc/bedgraphtobigwig/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf index f55cdb078..9ba306aba 100644 --- a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf @@ -1,24 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -def VERSION = '377' +def VERSION = '377' // Version information not provided by tool on CLI process UCSC_BEDGRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" - } else { - container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1' : + 'quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1' }" input: tuple val(meta), path(bedgraph) @@ -29,7 +18,8 @@ process UCSC_BEDGRAPHTOBIGWIG { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ bedGraphToBigWig \\ $bedgraph \\ @@ -37,8 +27,8 @@ process UCSC_BEDGRAPHTOBIGWIG { ${prefix}.bigWig cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo $VERSION) + "${task.process}": + ucsc: $VERSION END_VERSIONS """ } diff --git a/modules/nf-core/modules/untar/functions.nf b/modules/nf-core/modules/untar/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/nf-core/modules/untar/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index efb9d8251..6d1996e77 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process UNTAR { tag "$archive" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: path archive @@ -26,16 +15,19 @@ process UNTAR { path "versions.yml", emit: versions script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' untar = archive.toString() - '.tar.gz' """ tar \\ -xzvf \\ - $options.args \\ - $archive + $args \\ + $archive \\ + $args2 \\ cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') END_VERSIONS """ } From 37dbf883116afc294120269ba458b79e9cd7f093 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 2 Dec 2021 23:46:59 +0100 Subject: [PATCH 252/538] Update local modules to new DSL2 --- modules/local/bam_filter.nf | 21 ++--- modules/local/bam_remove_orphans.nf | 26 ++----- modules/local/bedtools_genomecov.nf | 27 ++----- modules/local/frip_score.nf | 24 ++---- modules/local/functions.nf | 78 ------------------- modules/local/genome_blacklist_regions.nf | 20 ++--- modules/local/get_chrom_sizes.nf | 15 +--- modules/local/gtf2bed.nf | 18 +---- modules/local/igv.nf | 18 +---- modules/local/macs2_consensus.nf | 18 ++--- modules/local/multiqc.nf | 22 ++---- modules/local/multiqc_custom_peaks.nf | 20 +---- .../multiqc_custom_phantompeakqualtools.nf | 23 ++---- modules/local/plot_homer_annotatepeaks.nf | 22 ++---- modules/local/plot_macs2_qc.nf | 22 ++---- modules/local/samplesheet_check.nf | 18 +---- 16 files changed, 81 insertions(+), 311 deletions(-) delete mode 100644 modules/local/functions.nf diff --git a/modules/local/bam_filter.nf b/modules/local/bam_filter.nf index b6a17db8e..6b31709df 100644 --- a/modules/local/bam_filter.nf +++ b/modules/local/bam_filter.nf @@ -1,25 +1,14 @@ -// Import generic module functions -include { initOptions; saveFiles; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - /* * Filter BAM file */ process BAM_FILTER { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bamtools=2.4.0 bioconda::samtools=1.4.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0" - } else { - container "quay.io/biocontainers/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0' : + 'quay.io/biocontainers/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0' }" input: tuple val(meta), path(bam), path(bai) @@ -32,7 +21,7 @@ process BAM_FILTER { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" def filter_params = meta.single_end ? '-F 0x004' : '-F 0x004 -F 0x0008 -f 0x001' def dup_params = params.keep_dups ? '' : '-F 0x0400' def multimap_params = params.keep_multi_map ? '' : '-q 1' @@ -50,7 +39,7 @@ process BAM_FILTER { -script $config cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') bamtools: \$(echo \$(bamtools --version 2>&1) | sed 's/^.*bamtools //; s/Part .*\$//') END_VERSIONS diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index 5c6ce5086..d25ccae02 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -1,25 +1,14 @@ -// Import generic module functions -include { initOptions; saveFiles; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - /* * Remove orphan reads from paired-end BAM file */ process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::pysam=0.16.0.1 bioconda::samtools=1.13" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0" - } else { - container "quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0' : + 'quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0' }" input: tuple val(meta), path(bam) @@ -29,14 +18,15 @@ process BAM_REMOVE_ORPHANS { path "versions.yml" , emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args?: '' + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam - bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $options.args + bampe_rm_orphan.py ${prefix}.name.sorted.bam ${prefix}.bam $args cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ @@ -45,7 +35,7 @@ process BAM_REMOVE_ORPHANS { ln -s $bam ${prefix}.bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 95b54e49d..76fd991b2 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0" - } else { - container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0': + 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" input: tuple val(meta), path(bam), path(flagstat) @@ -27,10 +16,10 @@ process BEDTOOLS_GENOMECOV { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" - def pe = meta.single_end ? '' : '-pc' - def extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' + def pe = meta.single_end ? '' : '-pc' + def extend = (meta.single_end && params.fragment_size > 0) ? "-fs ${params.fragment_size}" : '' """ SCALE_FACTOR=\$(grep '[0-9] mapped (' $flagstat | awk '{print 1000000/\$1}') echo \$SCALE_FACTOR > ${prefix}.scale_factor.txt @@ -45,8 +34,8 @@ process BEDTOOLS_GENOMECOV { | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(bedtools --version | sed -e "s/bedtools v//g") + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ } diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index ad9123b72..6a364c58c 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FRIP_SCORE { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-0" - } else { - container "quay.io/biocontainers/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-': + 'quay.io/biocontainers/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-0' }" input: tuple val(meta), path(bam), path(peak) @@ -26,14 +15,15 @@ process FRIP_SCORE { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ - READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $options.args | awk -F '\t' '{sum += \$NF} END {print sum}') + READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $args | awk -F '\t' '{sum += \$NF} END {print sum}') samtools flagstat $bam > ${bam}.flagstat grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index 85628ee0e..000000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/local/genome_blacklist_regions.nf b/modules/local/genome_blacklist_regions.nf index 35d0610ae..1a28af0f6 100644 --- a/modules/local/genome_blacklist_regions.nf +++ b/modules/local/genome_blacklist_regions.nf @@ -1,23 +1,13 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - -params.options = [:] - /* * Prepare genome intervals for filtering by removing regions in blacklist file */ process GENOME_BLACKLIST_REGIONS { tag "$sizes" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::bedtools=2.30.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0" - } else { - container "quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0': + 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" input: path sizes @@ -34,7 +24,7 @@ process GENOME_BLACKLIST_REGIONS { sortBed -i $blacklist -g $sizes | complementBed -i stdin -g $sizes > $file_out cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ @@ -43,7 +33,7 @@ process GENOME_BLACKLIST_REGIONS { awk '{print \$1, '0' , \$2}' OFS='\t' $sizes > $file_out cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index b9fa2ac92..3009d8164 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,8 +1,3 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - -params.options = [:] - process GET_CHROM_SIZES { tag "$fasta" publishDir "${params.outdir}", @@ -10,11 +5,9 @@ process GET_CHROM_SIZES { saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::samtools=1.10" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2" - } else { - container "quay.io/biocontainers/samtools:1.10--h9402c20_2" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2': + 'quay.io/biocontainers/samtools:1.10--h9402c20_2' }" input: path fasta @@ -33,7 +26,7 @@ process GET_CHROM_SIZES { cut -f 1,2 ${fasta}.fai > ${fasta}.sizes cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index ea2519c81..1d306cee5 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -1,21 +1,11 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - -params.options = [:] - process GTF2BED { tag "$gtf" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::perl=5.26.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/perl:5.26.2" - } else { - container "quay.io/biocontainers/perl:5.26.2" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/perl:5.26.2': + 'quay.io/biocontainers/perl:5.26.2' }" input: path gtf @@ -31,7 +21,7 @@ process GTF2BED { > ${gtf.baseName}.bed cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": perl: \$(echo \$(perl --version 2>&1) | sed 's/.*v\\(.*\\)) built.*/\\1/') END_VERSIONS """ diff --git a/modules/local/igv.nf b/modules/local/igv.nf index 29798880a..e70ccfa8e 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -1,22 +1,12 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - -params.options = [:] - /* * Create IGV session file */ process IGV { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3': + 'quay.io/biocontainers/python:3.8.3' }" input: path fasta @@ -42,7 +32,7 @@ process IGV { igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 53248d5f9..46d2de245 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -1,9 +1,3 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - /* * Consensus peaks across samples, create boolean filtering file, SAF file for featureCounts */ @@ -15,11 +9,9 @@ process MACS2_CONSENSUS { saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "conda-forge::biopython conda-forge::r-optparse=1.7.1 conda-forge::r-upsetr=1.4.0 bioconda::bedtools=2.30.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" - } else { - container "quay.io/biocontainers/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0': + 'quay.io/biocontainers/mulled-v2-2f48cc59b03027e31ead6d383fe1b8057785dd24:5d182f583f4696f4c4d9f3be93052811b383341f-0' }" input: tuple val(meta), path(peaks) @@ -34,7 +26,7 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - def prefix = options.suffix ? "${meta.id}${options.suffix}.consensus_peaks" : "${meta.id}.consensus_peaks" + def prefix = task.ext.prefix ? "${task.ext.prefix}.consensus_peaks": "${meta.id}.consensus_peaks" def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') @@ -58,7 +50,7 @@ process MACS2_CONSENSUS { plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": python: \$(python --version | sed 's/Python //g') r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') END_VERSIONS diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 319549e60..9983722f7 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--pyhdfd78af_1" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--pyhdfd78af_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.10.1--pyhdfd78af_1': + 'quay.io/biocontainers/multiqc:1.10.1--pyhdfd78af_1' }" input: path multiqc_config @@ -63,16 +52,17 @@ process MULTIQC { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' def custom_config = params.multiqc_config ? "--config $mqc_custom_config" : '' """ multiqc \\ -f \\ - $options.args \\ + $args \\ $custom_config \\ . cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 9f9141f4d..de90cc75d 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -1,20 +1,9 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC_CUSTOM_PEAKS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img': + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: tuple val(meta), path(peak), path(frip) @@ -26,8 +15,7 @@ process MULTIQC_CUSTOM_PEAKS { tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip script: - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index a62557e2f..7a13f7e51 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -1,21 +1,9 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - //TODO substitute with a newest tag (see https://github.com/BioContainers/containers/issues/416) conda (params.enable_conda ? "conda-forge::r-base=3.5.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/r-base:3.5.1" - } else { - container "quay.io/biocontainers/r-base:3.5.1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/r-base:3.5.1': + 'quay.io/biocontainers/r-base:3.5.1' }" input: tuple val(meta), path(spp), path(rdata) @@ -29,8 +17,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation script: - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" @@ -39,7 +26,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 2cd9b654e..523d13252 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -1,24 +1,13 @@ -// Import generic module functions -include { saveFiles; initOptions; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - /* * Aggregated QC plots for peak-to-gene annotation */ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::r-base=4.0.3 conda-forge::r-reshape2=1.4.4 conda-forge::r-optparse=1.6.6 conda-forge::r-ggplot2=3.3.3 conda-forge::r-scales=1.1.1 conda-forge::r-viridis=0.5.1 conda-forge::r-tidyverse=1.3.0 bioconda::bioconductor-biostrings=2.58.0 bioconda::bioconductor-complexheatmap=2.6.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" - } else { - container "quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0': + 'quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0' }" input: path annos @@ -32,16 +21,17 @@ process PLOT_HOMER_ANNOTATEPEAKS { path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def args = task.ext.args ?: '' """ plot_homer_annotatepeaks.r \\ -i ${annos.join(',')} \\ -s ${annos.join(',').replaceAll("${suffix}","")} \\ - $options.args + $args find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf index 3f5590481..b47e7068b 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -1,24 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - /* * Aggregated QC plots for peaks */ process PLOT_MACS2_QC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:task.process.toLowerCase(), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::r-base=4.0.3 conda-forge::r-reshape2=1.4.4 conda-forge::r-optparse=1.6.6 conda-forge::r-ggplot2=3.3.3 conda-forge::r-scales=1.1.1 conda-forge::r-viridis=0.5.1 conda-forge::r-tidyverse=1.3.0 bioconda::bioconductor-biostrings=2.58.0 bioconda::bioconductor-complexheatmap=2.6.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" - } else { - container "quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0': + 'quay.io/biocontainers/mulled-v2-ad9dd5f398966bf899ae05f8e7c54d0fb10cdfa7:05678da05b8e5a7a5130e90a9f9a6c585b965afa-0' }" input: path peaks @@ -29,15 +18,16 @@ process PLOT_MACS2_QC { path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ + def args = task.ext.args ?: '' def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' """ plot_macs2_qc.r \\ -i ${peaks.join(',')} \\ -s ${peaks.join(',').replaceAll("_peaks.${peak_type}","")} \\ - $options.args + $args cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 533d149e5..20f568191 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,20 +1,10 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3': + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet @@ -30,7 +20,7 @@ process SAMPLESHEET_CHECK { samplesheet.valid.csv cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ From d635ee04cba8d32e5586f3c9aee73765e5ee1655 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 9 Dec 2021 22:19:19 +0100 Subject: [PATCH 253/538] Remore publishDir from get_chrom_sizes --- modules/local/get_chrom_sizes.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 3009d8164..335bba2fd 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,8 +1,5 @@ process GET_CHROM_SIZES { tag "$fasta" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::samtools=1.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From 9b4a4411053e05b4c3cfe099e23ee828bffc83f8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 13 Dec 2021 23:16:58 +0100 Subject: [PATCH 254/538] First working version of dsl2 v2.0 pipeline --- .github/workflows/ci.yml | 4 +- conf/modules.config | 831 ++++++++++++++---- modules/local/bam_remove_orphans.nf | 4 +- modules/local/bedtools_genomecov.nf | 2 +- modules/local/macs2_consensus.nf | 3 - modules/local/multiqc.nf | 2 +- nextflow.config | 6 +- subworkflows/local/filter_bam_bamtools.nf | 18 +- subworkflows/local/input_check.nf | 4 +- subworkflows/local/prepare_genome.nf | 21 +- subworkflows/nf-core/align_bwa_mem.nf | 12 +- subworkflows/nf-core/bam_sort_samtools.nf | 12 +- subworkflows/nf-core/bam_stats_samtools.nf | 10 +- .../nf-core/mark_duplicates_picard.nf | 12 +- workflows/chipseq.nf | 198 +++-- 15 files changed, 821 insertions(+), 318 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac99350ad..7bfda24b1 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions: check pipeline minimum and latest edge version + nxf_ver: ["NXF_VER=21.04.0", "NXF_EDGE=1"] steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/conf/modules.config b/conf/modules.config index 60e19e047..cc86eff03 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,170 +1,679 @@ /* -======================================================================================== - Config file for defining DSL2 per module options -======================================================================================== +======================================================================================================== + Config file for defining DSL2 per module options and publishing paths +======================================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. ----------------------------------------------------------------------------------------- + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. +--------------------------------------------------------------------------------------------------------- */ -params { - modules { - 'gffread' { - args = '--keep-exon-attrs -F -T' - publish_dir = 'genome' - } - 'bwa_index' { - args = "-a bwtsw" - publish_dir = "genome/index" - } - 'fastqc' { - args = "--quiet" - } - 'trimgalore' { - args = "--fastqc" - } - 'bwa_mem' { - args = "-M" - args2 = "-h -F 0x0100 -O BAM" - publish_dir = "bwa/library" - suffix = ".Lb" - } - 'samtools_sort_lib' { - publish_dir = "bwa/library" - suffix = ".Lb.sorted" - } - 'picard_mergesamfiles' { - args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.sorted" - } - 'picard_markduplicates' { - args = "--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.mkD.sorted" - } - 'picard_markduplicates_samtools' { - args = '' - suffix = ".mLb.mkD.sorted" - publish_files = ['bai':'', 'stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats'] - publish_dir = "bwa/mergedLibrary" - } - 'bam_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.flT.sorted" - } - 'bam_remove_orphans' { - args = "--only_fr_pairs" - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN" - } - 'samtools_sort_filter' { - publish_dir = "bwa/mergedLibrary" - suffix = ".mLb.clN.sorted" - } - 'picard_collectmultiplemetrics' { - args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" - publish_dir = "bwa/mergedLibrary/picard_metrics" - suffix = ".mLb.clN.sorted" - } - 'preseq_lcextrap' { - args = "-verbose -bam -seed 1" - publish_dir = "bwa/mergedLibrary/preseq" - suffix = ".mLb.clN" - } - 'phantompeakqualtools' { - publish_dir = "bwa/mergedLibrary/phantompeakqualtools" - suffix = ".mLb.clN" - } - 'multiqc_custom_phantompeakqualtools' { - publish_dir = "multiqc" - publish_files = [:] - } - 'bedtools_genomecov' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" - } - 'ucsc_bedgraphtobigwig' { - publish_dir = "bwa/mergedLibrary/bigwig" - suffix = ".mLb.clN" - } - 'deeptools_computematrix' { - args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" - } - 'deeptools_plotprofile' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" - } - 'deeptools_plotheatmap' { - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" - } - 'deeptools_plotfingerprint' { - args = "--skipZeros" - publish_dir = "bwa/mergedLibrary/deeptools" - suffix = ".mLb.clN" - } - 'macs2_callpeak' { - args = "--keep-dup all" - publish_dir = "bwa/mergedLibrary/macs2" - } - 'frip_score' { - args = "-bed -c -f 0.20" - publish_dir = "frip" - publish_files = [:] - } - 'multiqc_custom_peaks' { - publish_dir = "multiqc" - publish_files = [:] - } - 'plot_macs2_qc' { - args = "-o ./ -p macs2_peak" - publish_dir = "bwa/mergedLibrary/macs2" - } - 'homer_annotatepeaks_macs2' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - suffix = "_peaks" - } - 'plot_homer_annotatepeaks' { - args = "-o ./ -p macs2_annotatePeaks" - publish_dir = "bwa/mergedLibrary/macs2" - } - 'macs2_consensus' { - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true - } - 'homer_annotatepeaks_consensus' { - args = "-gid" - publish_dir = "bwa/mergedLibrary/macs2" - publish_by_id = true - suffix = ".consensus_peaks" - } - 'subread_featurecounts' { - args = "-F SAF -O --fracOverlap 0.2" - publish_dir = "bwa/mergedLibrary/macs2" +// +// Generic process options for all workflows +// +process { + + 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' + ] + } + // + // Process options for local subworkflows + // + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:INPUT_CHECK:SAMPLESHEET_CHECK' { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'GUNZIP_.*' { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + // withName: 'UNTAR.*' { + withName: 'UNTAR' { + publishDir = [ + path: { "${params.outdir}/genome/index" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + withName: BWA_INDEX { + ext.args = '-a bwtsw' + publishDir = [ + path: { "${params.outdir}/genome/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: GFFREAD { + ext.args = '--keep-exon-attrs -F -T' + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + withName: GTF2BED { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + withName: GET_CHROM_SIZES { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + withName: GENOME_BLACKLIST_REGIONS { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + + + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/library" }, + mode: params.publish_dir_mode, + pattern: "*.bam", + enabled: params.save_align_intermeds + ] + } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + // ext.args = params.bam_csi_index ? '-c' : '' + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/library" }, + mode: params.publish_dir_mode, + pattern: '*.{bai,csi}', + enabled: params.save_align_intermeds + ] + } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_STATS' { + // ext.args = params.bam_csi_index ? '-c' : '' + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/library" }, + mode: params.publish_dir_mode, + pattern: "*.{stats,flagstat,idxstats}", + enabled: params.save_align_intermeds + ] + } + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + // ext.args = params.bam_csi_index ? '-c' : '' + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}" }, + // mode: params.publish_dir_mode, + // pattern: "*.{bam,csi}", + // enabled: ( ['star_salmon','hisat2'].contains(params.aligner) && + // ( params.save_align_intermeds || + // ( !params.with_umi && params.skip_markduplicates ) + // ) + // ) || params.save_align_intermeds || params.skip_markduplicates + // ] + // } + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + // mode: params.publish_dir_mode, + // pattern: "*.{stats,flagstat,idxstats}" + // ] + // } +// } + +// process { + + // withName: TRIMGALORE { + // ext.args = [ + // '--fastqc', + // params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' + // ].join(' ').trim() + // publishDir = [ + // [ + // path: { "${params.outdir}/trimgalore/fastqc" }, + // mode: copy, + // pattern: "*.{html,zip}" + // ], + // [ + // path: { "${params.outdir}/trimgalore" }, + // mode: copy, + // pattern: "*.fq.gz", + // enabled: params.save_trimmed + // ], + // [ + // path: { "${params.outdir}/trimgalore" }, + // mode: copy, + // pattern: "*.txt" + // ] + // ] + // } + withName: BWA_MEM { + ext.args = [ + '-M', + params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + ].join(' ').trim() + ext.args2 = '-h -F 0x0100 -O BAM' + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/bwa/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + // withName: SAMTOOLS_SORT_LIB { + // ext.prefix = { "${meta.id}.Lb.sorted" } + // publishDir = [ + // path: { "${params.outdir}/bwa/library" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + withName: PICARD_MERGESAMFILES { + ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.prefix = { "${meta.id}.mLb.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + // withName: PICARD_MARKDUPLICATES { + // ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + // ext.prefix = { "${meta.id}.mLb.mkD.sorted" } + // publishDir = [ + // path: { "${params.outdir}/bwa/mergedLibrary" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + withName: BAM_FILTER { + ext.prefix = { "${meta.id}.mLb.flT.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: BAM_REMOVE_ORPHANS { + ext.args = '--only_fr_pairs' + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + // withName: SAMTOOLS_SORT_FILTER { //FILTER_BAM_BAMTOOLS //delete + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}.mLb.clN.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*.{bai,csi}' + ] + } + + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + ext.prefix = { "${meta.id}.mLb.clN.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: "*.bam" + ] + } + + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.mLb.clN.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/library" }, + mode: 'copy', + pattern: "*.{stats,flagstat,idxstats}" + ] + } + + withName: PICARD_COLLECTMULTIPLEMETRICS { + ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.prefix = { "${meta.id}.mLb.clN.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/picard_metrics" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: PRESEQ_LCEXTRAP { + ext.args = '-verbose -bam -seed 1' + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/preseq" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: PHANTOMPEAKQUALTOOLS { + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/phantompeakqualtools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { + publishDir = [ + path: { "${params.outdir}/multiqc" }, + enabled: false + ] + } + withName: BEDTOOLS_GENOMECOV { + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/bigwig" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: UCSC_BEDGRAPHTOBIGWIG { + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/bigwig" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEEPTOOLS_COMPUTEMATRIX { + ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEEPTOOLS_PLOTPROFILE { + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEEPTOOLS_PLOTHEATMAP { + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEEPTOOLS_PLOTFINGERPRINT { + ext.args = [ + '--skipZeros', + "--numberOfSamples $params.fingerprint_bins" + ].join(' ').trim() + ext.prefix = { "${meta.id}.mLb.clN" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + // withName: DESEQ2_FEATURECOUNTS { + // publishDir = [ + // path: { "${params.outdir}/bwa/mergedLibrary/macs2" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + +// } + +// if (!params.skip_alignment && !params.skip_markduplicates) { +// process { + // MARK_DUPLICATES_PICARD + withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { + ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.prefix = { "${meta.id}.mLb.mkD.sorted" } + publishDir = [ + [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*metrics.txt' + ], + [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*.bam' + ] + ] + } + + withName: '.*:MARK_DUPLICATES_PICARD:SAMTOOLS_INDEX' { + // ext.args = params.bam_csi_index ? '-c' : '' // TODO implement it + ext.prefix = { "${meta.id}.mkD.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*.{bai,csi}' + ] + } + + withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { + publishDir = [ + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + mode: 'copy', + pattern: '*.{stats,flagstat,idxstats}' + ] + } +// } +} + +if (!params.skip_fastqc) { + process { + withName: FASTQC { + ext.args = '--quiet' + } + } +} + +// here +if (params.macs_gsize) { + process { + withName: MACS2_CALLPEAK { + ext.args = [ + '--keep-dup all', + params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", + params.save_macs_pileup ? '--bdg --SPMR' : '', + params.macs_fdr ? "--pvalue ${params.macs_pvalue}" : '', + params.macs_pvalue ? "--qvalue ${params.macs_fdr}" : '' + ].join(' ').trim() + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: FRIP_SCORE { + ext.args = '-bed -c -f 0.20' + publishDir = [ + path: { "${params.outdir}/frip" }, + enable: false + ] + } + withName: MULTIQC_CUSTOM_PEAKS { + publishDir = [ + path: { "${params.outdir}/multiqc" }, + enabled: false + ] + } + withName: PLOT_MACS2_QC { + ext.args = '-o ./ -p macs2_peak' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: HOMER_ANNOTATEPEAKS_MACS2 { + ext.args = '-gid' + // ext.prefix = 'peaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: PLOT_HOMER_ANNOTATEPEAKS { + ext.args = '-o ./ -p macs2_annotatePeaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: MACS2_CONSENSUS { + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: HOMER_ANNOTATEPEAKS_CONSENSUS { + ext.args = '-gid' + ext.prefix = 'consensus_peaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'deseq2_featurecounts' { - publish_dir = "bwa/mergedLibrary/macs2" + + withName: SUBREAD_FEATURECOUNTS { + ext.args = '-F SAF -O --fracOverlap 0.2' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'multiqc' { - args = '' - publish_dir = "multiqc" + } +} + +if (!params.skip_multiqc) { + process { + withName: MULTIQC { + ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } } + +// params { +// modules { +// 'gffread' { +// args = '--keep-exon-attrs -F -T' +// publish_dir = 'genome' +// } +// 'bwa_index' { +// args = "-a bwtsw" +// publish_dir = "genome/index" +// } +// 'fastqc' { +// args = "--quiet" +// } +// 'trimgalore' { +// args = "--fastqc" +// } +// 'bwa_mem' { +// args = "-M" +// args2 = "-h -F 0x0100 -O BAM" +// publish_dir = "bwa/library" +// suffix = ".Lb" +// } +// 'samtools_sort_lib' { // ALIGN_BWA_MEM +// publish_dir = "bwa/library" +// suffix = ".Lb.sorted" +// } +// 'picard_mergesamfiles' { +// args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" +// publish_dir = "bwa/mergedLibrary" +// suffix = ".mLb.sorted" +// } +// 'picard_markduplicates' { +// args = "--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp" +// publish_dir = "bwa/mergedLibrary" +// suffix = ".mLb.mkD.sorted" +// } +// 'picard_markduplicates_samtools' { //MARK_DUPLICATES_PICARD +// args = '' +// suffix = ".mLb.mkD.sorted" +// publish_files = ['bai':'', 'stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats'] +// publish_dir = "bwa/mergedLibrary" +// } +// 'bam_filter' { +// publish_dir = "bwa/mergedLibrary" +// suffix = ".mLb.flT.sorted" +// } +// 'bam_remove_orphans' { +// args = "--only_fr_pairs" +// publish_dir = "bwa/mergedLibrary" +// suffix = ".mLb.clN" +// } +// 'samtools_sort_filter' { //FILTER_BAM_BAMTOOLS +// publish_dir = "bwa/mergedLibrary" +// suffix = ".mLb.clN.sorted" +// } +// 'picard_collectmultiplemetrics' { +// args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" +// publish_dir = "bwa/mergedLibrary/picard_metrics" +// suffix = ".mLb.clN.sorted" +// } +// 'preseq_lcextrap' { +// args = "-verbose -bam -seed 1" +// publish_dir = "bwa/mergedLibrary/preseq" +// suffix = ".mLb.clN" +// } +// 'phantompeakqualtools' { +// publish_dir = "bwa/mergedLibrary/phantompeakqualtools" +// suffix = ".mLb.clN" +// } +// 'multiqc_custom_phantompeakqualtools' { +// publish_dir = "multiqc" +// publish_files = [:] +// } +// 'bedtools_genomecov' { +// publish_dir = "bwa/mergedLibrary/bigwig" +// suffix = ".mLb.clN" +// } +// 'ucsc_bedgraphtobigwig' { +// publish_dir = "bwa/mergedLibrary/bigwig" +// suffix = ".mLb.clN" +// } +// 'deeptools_computematrix' { +// args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" +// publish_dir = "bwa/mergedLibrary/deeptools" +// suffix = ".mLb.clN" +// } +// 'deeptools_plotprofile' { +// publish_dir = "bwa/mergedLibrary/deeptools" +// suffix = ".mLb.clN" +// } +// 'deeptools_plotheatmap' { +// publish_dir = "bwa/mergedLibrary/deeptools" +// suffix = ".mLb.clN" +// } +// 'deeptools_plotfingerprint' { +// args = "--skipZeros" +// publish_dir = "bwa/mergedLibrary/deeptools" +// suffix = ".mLb.clN" +// } +// 'macs2_callpeak' { +// args = "--keep-dup all" +// publish_dir = "bwa/mergedLibrary/macs2" +// } +// 'frip_score' { +// args = "-bed -c -f 0.20" +// publish_dir = "frip" +// publish_files = [:] +// } +// 'multiqc_custom_peaks' { +// publish_dir = "multiqc" +// publish_files = [:] +// } +// 'plot_macs2_qc' { +// args = "-o ./ -p macs2_peak" +// publish_dir = "bwa/mergedLibrary/macs2" +// } +// 'homer_annotatepeaks_macs2' { +// args = "-gid" +// publish_dir = "bwa/mergedLibrary/macs2" +// suffix = "_peaks" +// } +// 'plot_homer_annotatepeaks' { +// args = "-o ./ -p macs2_annotatePeaks" +// publish_dir = "bwa/mergedLibrary/macs2" +// } +// 'macs2_consensus' { +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_by_id = true +// } +// 'homer_annotatepeaks_consensus' { +// args = "-gid" +// publish_dir = "bwa/mergedLibrary/macs2" +// publish_by_id = true +// suffix = ".consensus_peaks" +// } +// 'subread_featurecounts' { +// args = "-F SAF -O --fracOverlap 0.2" +// publish_dir = "bwa/mergedLibrary/macs2" +// } +// 'deseq2_featurecounts' { +// publish_dir = "bwa/mergedLibrary/macs2" +// } +// 'multiqc' { +// args = '' +// publish_dir = "multiqc" +// } +// } +// } diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index d25ccae02..99ff4f932 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -18,8 +18,8 @@ process BAM_REMOVE_ORPHANS { path "versions.yml" , emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def args = task.ext.args?: '' - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" if (!meta.single_end) { """ samtools sort -n -@ $task.cpus -o ${prefix}.name.sorted.bam -T ${prefix}.name.sorted $bam diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 76fd991b2..e8cbb3f74 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -34,7 +34,7 @@ process BEDTOOLS_GENOMECOV { | sort -T '.' -k1,1 -k2,2n > ${prefix}.bedGraph cat <<-END_VERSIONS > versions.yml - "${task.process}": + "${task.process}": bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 46d2de245..2165ca929 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -4,9 +4,6 @@ process MACS2_CONSENSUS { tag "$meta.id" label 'process_long' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "conda-forge::biopython conda-forge::r-optparse=1.7.1 conda-forge::r-upsetr=1.4.0 bioconda::bedtools=2.30.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 9983722f7..37e41984c 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -63,7 +63,7 @@ process MULTIQC { cat <<-END_VERSIONS > versions.yml "${task.process}": - ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ } diff --git a/nextflow.config b/nextflow.config index 58be034c9..fefd9c631 100644 --- a/nextflow.config +++ b/nextflow.config @@ -103,9 +103,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -209,6 +206,9 @@ manifest { version = '1.3.0dev' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/subworkflows/local/filter_bam_bamtools.nf b/subworkflows/local/filter_bam_bamtools.nf index 4bcbb4f53..1ab9fec7f 100644 --- a/subworkflows/local/filter_bam_bamtools.nf +++ b/subworkflows/local/filter_bam_bamtools.nf @@ -1,15 +1,15 @@ /* * Filter BAM file */ -params.bam_filter_options = [:] -params.bam_remove_orphans_options = [:] -params.samtools_sort_options = [:] -params.samtools_index_options = [:] -params.samtools_stats_options = [:] - -include { BAM_FILTER } from '../../modules/local/bam_filter' addParams( options: params.bam_filter_options ) -include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' addParams( options: params.bam_remove_orphans_options ) -include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) +// params.bam_filter_options = [:] +// params.bam_remove_orphans_options = [:] +// params.samtools_sort_options = [:] +// params.samtools_index_options = [:] +// params.samtools_stats_options = [:] + +include { BAM_FILTER } from '../../modules/local/bam_filter' //addParams( options: params.bam_filter_options ) +include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' //addParams( options: params.bam_remove_orphans_options ) +include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' //addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) workflow FILTER_BAM_BAMTOOLS { take: diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index a20214b73..0879ae832 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ // Check input samplesheet and get read channels // -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 1e776669f..620bb87a8 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,24 +2,19 @@ // Uncompress and prepare reference genome files // -params.genome_options = [:] -params.index_options = [:] -params.gffread_options = [:] -params.bwa_index_options = [:] - include { GUNZIP as GUNZIP_FASTA GUNZIP as GUNZIP_GTF GUNZIP as GUNZIP_GFF GUNZIP as GUNZIP_GENE_BED - GUNZIP as GUNZIP_BLACKLIST } from '../../modules/nf-core/modules/gunzip/main' addParams( options: params.genome_options ) -include { UNTAR } from '../../modules/nf-core/modules/untar/main' addParams( options: params.index_options ) -include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' addParams( options: params.gffread_options ) -include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' addParams( options: params.bwa_index_options ) - -include { GTF2BED } from '../../modules/local/gtf2bed' addParams( options: params.genome_options ) -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' addParams( options: params.genome_options ) -include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' addParams( options: params.genome_options ) + GUNZIP as GUNZIP_BLACKLIST } from '../../modules/nf-core/modules/gunzip/main' +include { UNTAR } from '../../modules/nf-core/modules/untar/main' +include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' +include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' + +include { GTF2BED } from '../../modules/local/gtf2bed' +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' workflow PREPARE_GENOME { diff --git a/subworkflows/nf-core/align_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf index 3d1c8a325..0f80487fa 100644 --- a/subworkflows/nf-core/align_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -2,13 +2,13 @@ * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -params.bwa_mem_options = [:] -params.samtools_sort_options = [:] -params.samtools_index_options = [:] -params.samtools_stats_options = [:] +// params.bwa_mem_options = [:] +// params.samtools_sort_options = [:] +// params.samtools_index_options = [:] +// params.samtools_stats_options = [:] -include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' addParams( options: params.bwa_mem_options ) -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) +include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' //addParams( options: params.bwa_mem_options ) +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' //addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) workflow ALIGN_BWA_MEM { take: diff --git a/subworkflows/nf-core/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf index 53148682a..9e1ce9dbb 100644 --- a/subworkflows/nf-core/bam_sort_samtools.nf +++ b/subworkflows/nf-core/bam_sort_samtools.nf @@ -2,13 +2,13 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -params.sort_options = [:] -params.index_options = [:] -params.stats_options = [:] +// params.sort_options = [:] +// params.index_options = [:] +// params.stats_options = [:] -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams( options: params.sort_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.index_options ) -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' addParams( options: params.stats_options ) +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' //addParams( options: params.sort_options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.index_options ) +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' //addParams( options: params.stats_options ) workflow BAM_SORT_SAMTOOLS { take: diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 5307c239c..fe26629a6 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -2,11 +2,11 @@ * Run SAMtools stats, flagstat and idxstats */ -params.options = [:] +//params.options = [:] -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams( options: params.options ) -include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' addParams( options: params.options ) -include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' addParams( options: params.options ) +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' //addParams( options: params.options ) +include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' //addParams( options: params.options ) +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' //addParams( options: params.options ) workflow BAM_STATS_SAMTOOLS { take: @@ -16,7 +16,7 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = Channel.empty() - SAMTOOLS_STATS ( ch_bam_bai ) + SAMTOOLS_STATS ( ch_bam_bai, [] ) ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions.first()) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) diff --git a/subworkflows/nf-core/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf index af2a944e5..adaa2911a 100644 --- a/subworkflows/nf-core/mark_duplicates_picard.nf +++ b/subworkflows/nf-core/mark_duplicates_picard.nf @@ -1,13 +1,13 @@ /* * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats */ -params.markduplicates_options = [:] -params.samtools_index_options = [:] -params.samtools_stats_options = [:] +// params.markduplicates_options = [:] // TODO +// params.samtools_index_options = [:] // TODO +// params.samtools_stats_options = [:] // TODO -include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' addParams( options: params.markduplicates_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.samtools_index_options ) -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' addParams( options: params.samtools_stats_options ) +include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' //addParams( options: params.markduplicates_options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_index_options ) +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' //addParams( options: params.samtools_stats_options ) workflow MARK_DUPLICATES_PICARD { take: diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 1a9e4e7df..9e3833020 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -27,7 +27,7 @@ if (anno_readme && file(anno_readme).exists()) { file(anno_readme).copyTo("${params.outdir}/genome/") } -def peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' +// def peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' /* ======================================================================================== @@ -59,59 +59,59 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering */ // Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() +// def modules = params.modules.clone() -def plot_macs2_qc_options = modules['plot_macs2_qc'] -plot_macs2_qc_options.publish_dir += "/$peakType/qc" +// def plot_macs2_qc_options = modules['plot_macs2_qc'] +// plot_macs2_qc_options.publish_dir += "/$peakType/qc" -def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] -plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" +// def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] +// plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" -def macs2_consensus_options = modules['macs2_consensus'] -macs2_consensus_options.publish_dir += "/$peakType/qc" +// def macs2_consensus_options = modules['macs2_consensus'] +// macs2_consensus_options.publish_dir += "/$peakType/qc" -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' -multiqc_options.publish_dir += "/$peakType" +// def multiqc_options = modules['multiqc'] +// multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' +// multiqc_options.publish_dir += "/$peakType" -include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' addParams( options: modules['bedtools_genomecov'] ) -include { FRIP_SCORE } from '../modules/local/frip_score' addParams( options: modules['frip_score'] ) -include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' addParams( options: plot_macs2_qc_options ) -include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' addParams( options: plot_homer_annotatepeaks_options ) -include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' addParams( options: macs2_consensus_options ) -//include { DESEQ2_QC } from '../modules/local/deseq2_qc' addParams( options: deseq2_qc_options, multiqc_label: 'star_salmon' ) -include { IGV } from '../modules/local/igv' addParams( options: [:] ) -include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) -include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' addParams( options: modules['multiqc_custom_phantompeakqualtools'] ) -include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' addParams( options: modules['multiqc_custom_peaks'] ) +include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' +include { FRIP_SCORE } from '../modules/local/frip_score' +include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' +include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' +include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' +//include { DESEQ2_QC } from '../modules/local/deseq2_qc' +include { IGV } from '../modules/local/igv' //addParams( options: [:] ) +include { MULTIQC } from '../modules/local/multiqc' +include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' +include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -def publish_genome_options = params.save_reference ? [publish_dir: 'genome'] : [publish_files: false] -def publish_index_options = params.save_reference ? [publish_dir: 'genome/index'] : [publish_files: false] - -def gffread_options = modules['gffread'] -if (!params.save_reference) { gffread_options['publish_files'] = false } - -def bwa_index_options = modules['bwa_index'] -if (!params.save_reference) { bwa_index_options['publish_files'] = false } - -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( - genome_options : publish_genome_options, - index_options : publish_index_options, - gffread_options : gffread_options, - bwa_index_options : bwa_index_options -) -include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' addParams( - bam_filter_options : modules['bam_filter'], - bam_remove_orphans_options: modules['bam_remove_orphans'], - samtools_sort_options : modules['samtools_sort_filter'], - samtools_index_options : modules['samtools_sort_filter'], - samtools_stats_options : modules['samtools_sort_filter'] -) +// def publish_genome_options = params.save_reference ? [publish_dir: 'genome'] : [publish_files: false] +// def publish_index_options = params.save_reference ? [publish_dir: 'genome/index'] : [publish_files: false] + +// def gffread_options = modules['gffread'] +// if (!params.save_reference) { gffread_options['publish_files'] = false } + +// def bwa_index_options = modules['bwa_index'] +// if (!params.save_reference) { bwa_index_options['publish_files'] = false } + +include { INPUT_CHECK } from '../subworkflows/local/input_check' //addParams( options: [:] ) +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' //addParams( +// genome_options : publish_genome_options, +// index_options : publish_index_options, +// gffread_options : gffread_options, +// bwa_index_options : bwa_index_options +// ) +include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' //addParams( +// bam_filter_options : modules['bam_filter'], +// bam_remove_orphans_options: modules['bam_remove_orphans'], +// samtools_sort_options : modules['samtools_sort_filter'], +// samtools_index_options : modules['samtools_sort_filter'], +// samtools_stats_options : modules['samtools_sort_filter'] +// ) /* ======================================================================================== @@ -123,55 +123,55 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' // MODULE: Installed directly from nf-core/modules // -def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] -deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" - -def macs2_callpeak_options = modules['macs2_callpeak'] -macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) -macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' -macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' -macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' -macs2_callpeak_options['publish_dir'] += "/$peakType" - -def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] -homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" - -def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] -homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" - -def subread_featurecounts_options = modules['subread_featurecounts'] -subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" - -include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' addParams( options: modules['picard_mergesamfiles'] ) -include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' addParams( options: modules['picard_collectmultiplemetrics'] ) -include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' addParams( options: modules['preseq_lcextrap'] ) -include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' addParams( options: modules['phantompeakqualtools'] ) -include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' addParams( options: modules['ucsc_bedgraphtobigwig'] ) -include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' addParams( options: modules['deeptools_computematrix'] ) -include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' addParams( options: modules['deeptools_plotprofile'] ) -include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' addParams( options: modules['deeptools_plotheatmap'] ) -include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' addParams( options: deeptools_plotfingerprint_options ) -include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' addParams( options: macs2_callpeak_options ) -include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' addParams( options: subread_featurecounts_options ) -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) - -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_macs2_options ) -include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' addParams( options:homer_annotatepeaks_consensus_options ) +// def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] // AQUI see here https://github.com/nf-core/rnaseq/blob/492f6e0e678b4a5fcdf26b3a60834efb23265889/conf/modules.config#L83 +// deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" + +// def macs2_callpeak_options = modules['macs2_callpeak'] +// macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) +// macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' +// macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' +// macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' +// macs2_callpeak_options['publish_dir'] += "/$peakType" + +// def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] +// homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" + +// def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] +// homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" + +// def subread_featurecounts_options = modules['subread_featurecounts'] +// subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" + +include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' +include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' +include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' +include { PHANTOMPEAKQUALTOOLS } from '../modules/nf-core/modules/phantompeakqualtools/main' +include { UCSC_BEDGRAPHTOBIGWIG } from '../modules/nf-core/modules/ucsc/bedgraphtobigwig/main' +include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deeptools/computematrix/main' +include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' +include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' +include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' +include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' +include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' + +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/modules/homer/annotatepeaks/main' +include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/modules/homer/annotatepeaks/main' // // SUBWORKFLOW: Consisting entirely of nf-core/modules // -def trimgalore_options = modules['trimgalore'] -trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--nextseq ${params.trim_nextseq}"]) : '' -if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } +// def trimgalore_options = modules['trimgalore'] +// trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--nextseq ${params.trim_nextseq}"]) : '' +// if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } -def picard_markduplicates_samtools = modules['picard_markduplicates_samtools'] +// def picard_markduplicates_samtools = modules['picard_markduplicates_samtools'] -include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) -include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) -include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: picard_markduplicates_samtools, samtools_stats_options: picard_markduplicates_samtools ) +include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' //addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) +include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' //addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) +include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' //addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: picard_markduplicates_samtools, samtools_stats_options: picard_markduplicates_samtools ) /* ======================================================================================== @@ -214,8 +214,9 @@ workflow CHIPSEQ { // // SUBWORKFLOW: Map reads & BAM QC // - score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - params.modules['bwa_mem'].args += score + // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + // params.modules['bwa_mem'].args += score + ALIGN_BWA_MEM ( FASTQC_TRIMGALORE.out.reads, PREPARE_GENOME.out.bwa_index @@ -410,6 +411,8 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) + // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}.view() + PLOT_HOMER_ANNOTATEPEAKS ( HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, ch_peak_annotation_header, @@ -488,16 +491,17 @@ workflow CHIPSEQ { // // Create IGV session // - IGV ( - PREPARE_GENOME.out.fasta, - UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - params.modules['ucsc_bedgraphtobigwig'], - params.modules['macs2_callpeak'], - params.modules['macs2_consensus'] - ) - ch_versions = ch_versions.mix(IGV.out.versions) + // TODO rethink how files are passed + // IGV ( + // PREPARE_GENOME.out.fasta, + // UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + // params.modules['ucsc_bedgraphtobigwig'], + // params.modules['macs2_callpeak'], + // params.modules['macs2_consensus'] + // ) + // ch_versions = ch_versions.mix(IGV.out.versions) // // MODULE: Pipeline reporting From 9b2c1220e125446f39b78302c0fb4fd3b4ca916d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 13 Dec 2021 23:19:24 +0100 Subject: [PATCH 255/538] Fix indent --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index cc86eff03..af9af4b4b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -55,7 +55,7 @@ process { enabled: params.save_reference ] } - withName: BWA_INDEX { + withName: BWA_INDEX { ext.args = '-a bwtsw' publishDir = [ path: { "${params.outdir}/genome/index" }, From 9733d26356d8d21331488f5479775021a9985d90 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 14 Dec 2021 16:42:47 +0000 Subject: [PATCH 256/538] Template update for nf-core/tools version 2.2 --- .gitattributes | 2 + .github/CONTRIBUTING.md | 38 ++------ .github/ISSUE_TEMPLATE/bug_report.md | 63 ------------- .github/ISSUE_TEMPLATE/bug_report.yml | 52 ++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 ------- .github/ISSUE_TEMPLATE/feature_request.yml | 11 +++ .github/workflows/awsfulltest.yml | 8 +- .github/workflows/awstest.yml | 10 +- .github/workflows/ci.yml | 23 +++-- .github/workflows/linting_comment.yml | 1 + CITATIONS.md | 2 +- README.md | 13 ++- assets/multiqc_config.yaml | 2 +- assets/nf-core-chipseq_logo.png | Bin 17874 -> 0 bytes assets/nf-core-chipseq_logo_light.png | Bin 0 -> 10959 bytes assets/sendmail_template.txt | 4 +- bin/scrape_software_versions.py | 36 ------- conf/base.config | 3 + conf/modules.config | 55 ++++++----- conf/test.config | 4 +- docs/images/nf-core-chipseq_logo.png | Bin 34565 -> 0 bytes docs/images/nf-core-chipseq_logo_dark.png | Bin 0 -> 73947 bytes docs/images/nf-core-chipseq_logo_light.png | 11 +++ docs/output.md | 2 +- docs/usage.md | 36 ------- lib/NfcoreSchema.groovy | 26 +++-- lib/NfcoreTemplate.groovy | 30 ++---- lib/Utils.groovy | 7 -- lib/WorkflowMain.groovy | 6 +- modules.json | 9 +- modules/local/functions.nf | 68 ------------- modules/local/get_software_versions.nf | 33 ------- modules/local/samplesheet_check.nf | 24 ++--- .../custom/dumpsoftwareversions/main.nf | 21 +++++ .../custom/dumpsoftwareversions/meta.yml | 34 +++++++ .../templates/dumpsoftwareversions.py | 89 ++++++++++++++++++ modules/nf-core/modules/fastqc/functions.nf | 68 ------------- modules/nf-core/modules/fastqc/main.nf | 39 ++++---- modules/nf-core/modules/fastqc/meta.yml | 7 +- modules/nf-core/modules/multiqc/functions.nf | 68 ------------- modules/nf-core/modules/multiqc/main.nf | 31 +++--- modules/nf-core/modules/multiqc/meta.yml | 7 +- nextflow.config | 31 +++--- nextflow_schema.json | 29 ------ subworkflows/local/input_check.nf | 8 +- workflows/chipseq.nf | 44 +++------ 47 files changed, 419 insertions(+), 669 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 assets/nf-core-chipseq_logo.png create mode 100644 assets/nf-core-chipseq_logo_light.png delete mode 100755 bin/scrape_software_versions.py delete mode 100644 docs/images/nf-core-chipseq_logo.png create mode 100644 docs/images/nf-core-chipseq_logo_dark.png create mode 100644 docs/images/nf-core-chipseq_logo_light.png delete mode 100644 modules/local/functions.nf delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf diff --git a/.gitattributes b/.gitattributes index 7fe55006f..050bb1203 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 87854ad80..d37fb5dfa 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,16 +68,13 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -102,27 +99,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dbc527cc8..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/chipseq pipeline documentation](https://nf-co.re/chipseq/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..b0d2788d9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/chipseq pipeline documentation](https://nf-co.re/chipseq/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/chipseq _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 6b4360344..997624c21 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 15aceab96..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/chipseq pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 000000000..d8c130a54 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/chipseq pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 906aa559c..a5e2cade9 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,14 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -30,5 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' - + profiles: test_full,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 6fc417220..b8f720cbe 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,18 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-test-${{ github.sha }}" } - profiles: '[ "test", "aws_tower" ]' - + profiles: test,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e8f2eba4..57b49cfac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,9 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 +env: + NXF_ANSI_LOG: false + CAPSULE_LOG: none jobs: test: @@ -17,20 +18,26 @@ jobs: # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest - env: - NXF_VER: ${{ matrix.nxf_ver }} - NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions + include: + # Test pipeline minimum Nextflow version + - NXF_VER: '21.10.3' + NXF_EDGE: '' + # Test latest edge release of Nextflow + - NXF_VER: '' + NXF_EDGE: '1' steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow env: - CAPSULE_LOG: none + NXF_VER: ${{ matrix.NXF_VER }} + # Uncomment only if the edge release is more recent than the latest stable release + # See https://github.com/nextflow-io/nextflow/issues/2467 + # NXF_EDGE: ${{ matrix.NXF_EDGE }} run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f9..44d72994b 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/CITATIONS.md b/CITATIONS.md index 89046a380..cecb5945f 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 72f3bfd11..5dcdd654d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# ![nf-core/chipseq](docs/images/nf-core-chipseq_logo.png) +# ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -33,18 +33,21 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/chipseq -profile test, + nextflow run nf-core/chipseq -profile test,YOURPROFILE ``` + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + + > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index bfe3a8f05..b7c276e1b 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/chipseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/nf-core-chipseq_logo.png b/assets/nf-core-chipseq_logo.png deleted file mode 100644 index 2d8daa2d0459094c6626ac9890ef9baaebaca722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17874 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 Y6NEZP{JR7n(gJxer6^e~ZWQ$Y0NwaQn*aa+ diff --git a/assets/nf-core-chipseq_logo_light.png b/assets/nf-core-chipseq_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..21300d1d37f585ca022911966f6413c2895c66b2 GIT binary patch literal 10959 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 Fe*kd -Content-Disposition: inline; filename="nf-core-chipseq_logo.png" +Content-Disposition: inline; filename="nf-core-chipseq_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-chipseq_logo.png"). +<% out << new File("$projectDir/assets/nf-core-chipseq_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index c060d8d5d..000000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/chipseq" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/chipseq Software Versions' -section_href: 'https://github.com/nf-core/chipseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index 467dd2fed..07779064b 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,4 +54,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } } diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec2..a0506a4db 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,32 +1,41 @@ /* ======================================================================================== - Config file for defining DSL2 per module options + Config file for defining DSL2 per module options and publishing paths ======================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ -params { - modules { - 'fastqc' { - args = "--quiet" - } - 'multiqc' { - args = "" - } +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: SAMPLESHEET_CHECK { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: FASTQC { + ext.args = '--quiet' } + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + pattern: '*_versions.yml' + ] + } + } diff --git a/conf/test.config b/conf/test.config index cc60ec23e..3a199a627 100644 --- a/conf/test.config +++ b/conf/test.config @@ -16,8 +16,8 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 - max_memory = 6.GB - max_time = 6.h + max_memory = '6.GB' + max_time = '6.h' // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets diff --git a/docs/images/nf-core-chipseq_logo.png b/docs/images/nf-core-chipseq_logo.png deleted file mode 100644 index 076a6569fa97494d5031781a66907fdb159c4b25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34565 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-chipseq_logo_light.png b/docs/images/nf-core-chipseq_logo_light.png new file mode 100644 index 000000000..d46347c2d --- /dev/null +++ b/docs/images/nf-core-chipseq_logo_light.png @@ -0,0 +1,11 @@ + + +503 Service Unavailable + +

Service Unavailable

+

The server is temporarily unable to service your +request due to maintenance downtime or capacity +problems. Please try again later.

+

Additionally, a 503 Service Unavailable +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/docs/output.md b/docs/output.md index 27ece4791..b9c8a3df6 100644 --- a/docs/output.md +++ b/docs/output.md @@ -60,7 +60,7 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ * `pipeline_info/` * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index 49bda59c7..d1e7eebc7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -181,42 +181,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd6..40ab65f20 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -202,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,11 +349,20 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a3..2fc0a9b9b 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 18173e985..1b88aec0e 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -37,11 +37,4 @@ class Utils { "===================================================================================" } } - - // - // Join module args with appropriate spacing - // - public static String joinModuleArgs(args_list) { - return ' ' + args_list.join(' ') - } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index bc960fcc8..0bf58e435 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -61,6 +61,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -69,9 +72,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" diff --git a/modules.json b/modules.json index a11f8855c..072fc172e 100644 --- a/modules.json +++ b/modules.json @@ -3,12 +3,15 @@ "homePage": "https://github.com/nf-core/chipseq", "repos": { "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } -} +} \ No newline at end of file diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index da9da093d..000000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 3e9926b85..000000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index b200e6ffb..5094e5a0f 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,31 +1,27 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 000000000..934bb4672 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,21 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 000000000..5b5b8a602 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,34 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 000000000..d13903925 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index da9da093d..000000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b26..d250eca07 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -24,24 +13,32 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953dc..b09553a3c 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,10 +41,10 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index da9da093d..000000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index da7808002..3dceb162a 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path multiqc_files @@ -24,12 +13,16 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) + def args = task.ext.args ?: '' """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + multiqc -f $args . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 532a8bb1e..63c75a450 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file @@ -29,10 +30,10 @@ output: type: file description: Plots created by MultiQC pattern: "*_data" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/nextflow.config b/nextflow.config index 4f7ea7561..e5ae4e45b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,7 +26,6 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -34,14 +33,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -58,9 +55,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -68,13 +62,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -126,11 +113,22 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + // Export these variables to prevent local Python/R libraries from conflicting with those in the container +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. + env { PYTHONNOUSERSITE = 1 R_PROFILE_USER = "/.Rprofile" R_ENVIRON_USER = "/.Renviron" + JULIA_DEPOT_PATH = "/usr/local/share/julia" } // Capture exit codes from upstream processes when piping @@ -160,10 +158,13 @@ manifest { homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' + nextflowVersion = '!>=21.10.3' version = '1.3.0dev' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/nextflow_schema.json b/nextflow_schema.json index 2c3b9f6e3..91a37921a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,12 +104,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -184,22 +178,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -260,13 +238,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b664bc8ca..cddcbb3ce 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ // Check input samplesheet and get read channels // -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: @@ -12,12 +10,14 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) + .csv .splitCsv ( header:true, sep:',' ) .map { create_fastq_channels(it) } .set { reads } emit: - reads // channel: [ val(meta), [ reads ] ] + reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 46b8fb78f..5714aa820 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -32,18 +32,10 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() - -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) - // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { INPUT_CHECK } from '../subworkflows/local/input_check' /* ======================================================================================== @@ -51,14 +43,12 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( opti ======================================================================================== */ -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' - // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -71,7 +61,7 @@ def multiqc_report = [] workflow CHIPSEQ { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -79,6 +69,7 @@ workflow CHIPSEQ { INPUT_CHECK ( ch_input ) + ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) // // MODULE: Run FastQC @@ -86,21 +77,10 @@ workflow CHIPSEQ { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - // - // MODULE: Pipeline reporting - // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // @@ -113,14 +93,14 @@ workflow CHIPSEQ { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(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(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() ) - multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) + multiqc_report = MULTIQC.out.report.toList() + ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* From 5f5f534465c38bf6f908cc75b57ea6371fe72d99 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 16 Dec 2021 00:10:10 +0100 Subject: [PATCH 257/538] Update modules.config --- conf/modules.config | 63 ++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index af9af4b4b..4d4d39fa0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -96,8 +96,33 @@ process { enabled: params.save_reference ] } - - + withName: '.*:FASTQC_TRIMGALORE:FASTQC' { + ext.args = '--quiet' + } + withName: '.*:FASTQC_TRIMGALORE:TRIMGALORE' { + ext.args = [ + '--fastqc', + params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' + ].join(' ').trim() + publishDir = [ + [ + path: { "${params.outdir}/trimgalore/fastqc" }, + mode: 'copy', + pattern: "*.{html,zip}" + ], + [ + path: { "${params.outdir}/trimgalore" }, + mode: 'copy', + pattern: "*.fq.gz", + enabled: params.save_trimmed + ], + [ + path: { "${params.outdir}/trimgalore" }, + mode: 'copy', + pattern: "*.txt" + ] + ] + } withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { // TODO: substitute by this line when multiple aligners are implemented // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { @@ -157,30 +182,6 @@ process { // process { - // withName: TRIMGALORE { - // ext.args = [ - // '--fastqc', - // params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' - // ].join(' ').trim() - // publishDir = [ - // [ - // path: { "${params.outdir}/trimgalore/fastqc" }, - // mode: copy, - // pattern: "*.{html,zip}" - // ], - // [ - // path: { "${params.outdir}/trimgalore" }, - // mode: copy, - // pattern: "*.fq.gz", - // enabled: params.save_trimmed - // ], - // [ - // path: { "${params.outdir}/trimgalore" }, - // mode: copy, - // pattern: "*.txt" - // ] - // ] - // } withName: BWA_MEM { ext.args = [ '-M', @@ -393,7 +394,7 @@ process { withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + path: { "${params.outdir}/bwa/samtools_stats" }, mode: 'copy', pattern: '*.{stats,flagstat,idxstats}' ] @@ -401,14 +402,6 @@ process { // } } -if (!params.skip_fastqc) { - process { - withName: FASTQC { - ext.args = '--quiet' - } - } -} - // here if (params.macs_gsize) { process { From 448d99c653b5fa6a6f3e3db840283b34a672243e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 20 Dec 2021 18:52:17 +0100 Subject: [PATCH 258/538] Fix usage.md --- docs/usage.md | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 37343e096..3a0490c45 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -84,50 +84,6 @@ The minimum reference genome requirements are a FASTA and GTF file, all other fi > **NB:** Compressed reference files are also supported by the pipeline i.e. standard files with the `.gz` extension and indices folders with the `tar.gz` extension. -## Samplesheet input - -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. - -```console ---input '[path to samplesheet file]' -``` - -### Multiple runs of the same sample - -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: - -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz -``` - -### Full samplesheet - -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. - -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. - -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` - -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | - -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. - ## Running the pipeline The typical command for running the pipeline is as follows: From 627f0516269dd10fe5576ef29bf74b1cc2094018 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 20 Dec 2021 19:00:03 +0100 Subject: [PATCH 259/538] Update nextflow ver in ci.yml for testing params --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0773e2c6a..5bf66d594 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,7 +51,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest env: - NXF_VER: '21.04.0' + NXF_VER: '21.10.3' NXF_ANSI_LOG: false strategy: matrix: From caa26f17bff99b6cce377aa4386ddc4ba57ed043 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 20 Dec 2021 22:13:08 +0100 Subject: [PATCH 260/538] Remove singularity_pull_docker_container from config --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 2f01be186..c13bae66c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -82,7 +82,6 @@ params { show_hidden_params = false schema_ignore_params = 'genomes,modules' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' From 7b7e77bf43f83b000c00653483eaee437344da5c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 20 Dec 2021 22:13:54 +0100 Subject: [PATCH 261/538] Add templalte light log --- docs/images/nf-core-chipseq_logo_light.png | Bin 428 -> 73788 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-chipseq_logo_light.png b/docs/images/nf-core-chipseq_logo_light.png index d46347c2d217dd9a7c090367c55a068226f937c1..51a83b3d789d5852acc2bb044650b13785c6bf41 100644 GIT binary patch literal 73788 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| 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 H?aKcGF<{p3 literal 428 zcmZ`#K~BRk5WM>pOV3aj5H~9lG(l7

J-waT~81OO72jb}RoLJM9sUyE8jGGwP=P zT({r52Hx8DE$sF$+szslcT#Se_EpNdtuM&KawTQ+v8aUV!(c1b6Y4w!6D(Cvt4H`E zKADbS@9>1i;=z)V7g#7c)78Q2R21&3KiPRN)L6AW!IagA!AuZn7(F8!n;^O(3&GEL z`IdZS!SoYp3ZUbR4QN~-hc4sVpItBmfoJG&#Lk2yM)p}|n3k}!gi}7^1bED6U@;Ic zl^ka$&sv*cyhCf#Eg<}pQxJ33KjQ@CIv?|QCJpD_6tkR+I~LC|e?kXMA=kc(1G!N4 VJvv>8IrcTl)qtG)%H@^D#V=*Sk$eCE From b1bd7bc452edc03babde54c080c178d6346aa870 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 21 Dec 2021 12:21:49 +0100 Subject: [PATCH 262/538] Add IGV module again --- conf/modules.config | 347 +++++++++++-------------------------------- modules/local/igv.nf | 12 +- workflows/chipseq.nf | 27 ++-- 3 files changed, 106 insertions(+), 280 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6269b8403..522482121 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -51,7 +51,7 @@ process { enabled: params.save_reference ] } - // withName: 'UNTAR.*' { + // withName: 'UNTAR_.*' { withName: 'UNTAR' { publishDir = [ path: { "${params.outdir}/genome/index" }, @@ -106,34 +106,45 @@ process { // // Read QC and trimming options // -process { - withName: '.*:FASTQC_TRIMGALORE:FASTQC' { - ext.args = '--quiet' + +if (!(params.skip_fastqc || params.skip_qc)) { + process { + withName: '.*:FASTQC_TRIMGALORE:FASTQC' { + ext.args = '--quiet' + } } - withName: '.*:FASTQC_TRIMGALORE:TRIMGALORE' { - ext.args = [ - '--fastqc', - params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' - ].join(' ').trim() - publishDir = [ - [ - path: { "${params.outdir}/trimgalore/fastqc" }, - mode: 'copy', - pattern: "*.{html,zip}" - ], - [ - path: { "${params.outdir}/trimgalore" }, - mode: 'copy', - pattern: "*.fq.gz", - enabled: params.save_trimmed - ], - [ - path: { "${params.outdir}/trimgalore" }, - mode: 'copy', - pattern: "*.txt" +} + +if (!params.skip_trimming) { + process { + withName: '.*:FASTQC_TRIMGALORE:TRIMGALORE' { + ext.args = [ + '--fastqc', + params.trim_nextseq > 0 ? "--nextseq ${params.trim_nextseq}" : '' + ].join(' ').trim() + publishDir = [ + [ + path: { "${params.outdir}/trimgalore/fastqc" }, + mode: 'copy', + pattern: "*.{html,zip}" + ], + [ + path: { "${params.outdir}/trimgalore" }, + mode: 'copy', + pattern: "*.fq.gz", + enabled: params.save_trimmed + ], + [ + path: { "${params.outdir}/trimgalore" }, + mode: 'copy', + pattern: "*.txt" + ] ] - ] + } } +} + +process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { // TODO: substitute by this line when multiple aligners are implemented // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { @@ -169,30 +180,6 @@ process { enabled: params.save_align_intermeds ] } - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - // ext.args = params.bam_csi_index ? '-c' : '' - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}" }, - // mode: 'copy', - // pattern: "*.{bam,csi}", - // enabled: ( ['star_salmon','hisat2'].contains(params.aligner) && - // ( params.save_align_intermeds || - // ( !params.with_umi && params.skip_markduplicates ) - // ) - // ) || params.save_align_intermeds || params.skip_markduplicates - // ] - // } - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/samtools_stats" }, - // mode: 'copy', - // pattern: "*.{stats,flagstat,idxstats}" - // ] - // } -// } - -// process { - withName: BWA_MEM { ext.args = [ '-M', @@ -206,14 +193,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // withName: SAMTOOLS_SORT_LIB { - // ext.prefix = { "${meta.id}.Lb.sorted" } - // publishDir = [ - // path: { "${params.outdir}/bwa/library" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } withName: PICARD_MERGESAMFILES { ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.sorted" } @@ -223,15 +202,38 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - // withName: PICARD_MARKDUPLICATES { - // ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' - // ext.prefix = { "${meta.id}.mLb.mkD.sorted" } - // publishDir = [ - // path: { "${params.outdir}/bwa/mergedLibrary" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } + withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { + ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.prefix = { "${meta.id}.mLb.mkD.sorted" } + publishDir = [ + [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*metrics.txt' + ], + [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*.bam' + ] + ] + } + withName: '.*:MARK_DUPLICATES_PICARD:SAMTOOLS_INDEX' { + // ext.args = params.bam_csi_index ? '-c' : '' // TODO implement it + ext.prefix = { "${meta.id}.mkD.sorted" } + publishDir = [ + path: { "${params.outdir}/bwa/mergedLibrary" }, + mode: 'copy', + pattern: '*.{bai,csi}' + ] + } + withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { + publishDir = [ + path: { "${params.outdir}/bwa/samtools_stats" }, + mode: 'copy', + pattern: '*.{stats,flagstat,idxstats}' + ] + } withName: BAM_FILTER { ext.prefix = { "${meta.id}.mLb.flT.sorted" } publishDir = [ @@ -249,8 +251,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - // withName: SAMTOOLS_SORT_FILTER { //FILTER_BAM_BAMTOOLS //delete withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -259,7 +259,6 @@ process { pattern: '*.{bai,csi}' ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -268,7 +267,6 @@ process { pattern: "*.bam" ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -277,7 +275,6 @@ process { pattern: "*.{stats,flagstat,idxstats}" ] } - withName: PICARD_COLLECTMULTIPLEMETRICS { ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.clN.sorted" } @@ -370,47 +367,6 @@ process { // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // ] // } - -// } - -// if (!params.skip_alignment && !params.skip_markduplicates) { -// process { - // MARK_DUPLICATES_PICARD - withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { - ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' - ext.prefix = { "${meta.id}.mLb.mkD.sorted" } - publishDir = [ - [ - path: { "${params.outdir}/bwa/mergedLibrary" }, - mode: 'copy', - pattern: '*metrics.txt' - ], - [ - path: { "${params.outdir}/bwa/mergedLibrary" }, - mode: 'copy', - pattern: '*.bam' - ] - ] - } - - withName: '.*:MARK_DUPLICATES_PICARD:SAMTOOLS_INDEX' { - // ext.args = params.bam_csi_index ? '-c' : '' // TODO implement it - ext.prefix = { "${meta.id}.mkD.sorted" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, - mode: 'copy', - pattern: '*.{bai,csi}' - ] - } - - withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { - publishDir = [ - path: { "${params.outdir}/bwa/samtools_stats" }, - mode: 'copy', - pattern: '*.{stats,flagstat,idxstats}' - ] - } -// } } // here @@ -502,7 +458,6 @@ if (params.macs_gsize) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SUBREAD_FEATURECOUNTS { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ @@ -517,6 +472,21 @@ if (params.macs_gsize) { } } +if (!params.skip_igv) { + process { + withName: IGV { + publishDir = [ + path: { [ + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } +} + if (!params.skip_multiqc) { process { withName: MULTIQC { @@ -532,152 +502,3 @@ if (!params.skip_multiqc) { } } } - -// params { -// modules { -// 'gffread' { -// args = '--keep-exon-attrs -F -T' -// publish_dir = 'genome' -// } -// 'bwa_index' { -// args = "-a bwtsw" -// publish_dir = "genome/index" -// } -// 'fastqc' { -// args = "--quiet" -// } -// 'trimgalore' { -// args = "--fastqc" -// } -// 'bwa_mem' { -// args = "-M" -// args2 = "-h -F 0x0100 -O BAM" -// publish_dir = "bwa/library" -// suffix = ".Lb" -// } -// 'samtools_sort_lib' { // ALIGN_BWA_MEM -// publish_dir = "bwa/library" -// suffix = ".Lb.sorted" -// } -// 'picard_mergesamfiles' { -// args = "SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" -// publish_dir = "bwa/mergedLibrary" -// suffix = ".mLb.sorted" -// } -// 'picard_markduplicates' { -// args = "--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp" -// publish_dir = "bwa/mergedLibrary" -// suffix = ".mLb.mkD.sorted" -// } -// 'picard_markduplicates_samtools' { //MARK_DUPLICATES_PICARD -// args = '' -// suffix = ".mLb.mkD.sorted" -// publish_files = ['bai':'', 'stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats'] -// publish_dir = "bwa/mergedLibrary" -// } -// 'bam_filter' { -// publish_dir = "bwa/mergedLibrary" -// suffix = ".mLb.flT.sorted" -// } -// 'bam_remove_orphans' { -// args = "--only_fr_pairs" -// publish_dir = "bwa/mergedLibrary" -// suffix = ".mLb.clN" -// } -// 'samtools_sort_filter' { //FILTER_BAM_BAMTOOLS -// publish_dir = "bwa/mergedLibrary" -// suffix = ".mLb.clN.sorted" -// } -// 'picard_collectmultiplemetrics' { -// args = "VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp" -// publish_dir = "bwa/mergedLibrary/picard_metrics" -// suffix = ".mLb.clN.sorted" -// } -// 'preseq_lcextrap' { -// args = "-verbose -bam -seed 1" -// publish_dir = "bwa/mergedLibrary/preseq" -// suffix = ".mLb.clN" -// } -// 'phantompeakqualtools' { -// publish_dir = "bwa/mergedLibrary/phantompeakqualtools" -// suffix = ".mLb.clN" -// } -// 'multiqc_custom_phantompeakqualtools' { -// publish_dir = "multiqc" -// publish_files = [:] -// } -// 'bedtools_genomecov' { -// publish_dir = "bwa/mergedLibrary/bigwig" -// suffix = ".mLb.clN" -// } -// 'ucsc_bedgraphtobigwig' { -// publish_dir = "bwa/mergedLibrary/bigwig" -// suffix = ".mLb.clN" -// } -// 'deeptools_computematrix' { -// args = "scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels" -// publish_dir = "bwa/mergedLibrary/deeptools" -// suffix = ".mLb.clN" -// } -// 'deeptools_plotprofile' { -// publish_dir = "bwa/mergedLibrary/deeptools" -// suffix = ".mLb.clN" -// } -// 'deeptools_plotheatmap' { -// publish_dir = "bwa/mergedLibrary/deeptools" -// suffix = ".mLb.clN" -// } -// 'deeptools_plotfingerprint' { -// args = "--skipZeros" -// publish_dir = "bwa/mergedLibrary/deeptools" -// suffix = ".mLb.clN" -// } -// 'macs2_callpeak' { -// args = "--keep-dup all" -// publish_dir = "bwa/mergedLibrary/macs2" -// } -// 'frip_score' { -// args = "-bed -c -f 0.20" -// publish_dir = "frip" -// publish_files = [:] -// } -// 'multiqc_custom_peaks' { -// publish_dir = "multiqc" -// publish_files = [:] -// } -// 'plot_macs2_qc' { -// args = "-o ./ -p macs2_peak" -// publish_dir = "bwa/mergedLibrary/macs2" -// } -// 'homer_annotatepeaks_macs2' { -// args = "-gid" -// publish_dir = "bwa/mergedLibrary/macs2" -// suffix = "_peaks" -// } -// 'plot_homer_annotatepeaks' { -// args = "-o ./ -p macs2_annotatePeaks" -// publish_dir = "bwa/mergedLibrary/macs2" -// } -// 'macs2_consensus' { -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_by_id = true -// } -// 'homer_annotatepeaks_consensus' { -// args = "-gid" -// publish_dir = "bwa/mergedLibrary/macs2" -// publish_by_id = true -// suffix = ".consensus_peaks" -// } -// 'subread_featurecounts' { -// args = "-F SAF -O --fracOverlap 0.2" -// publish_dir = "bwa/mergedLibrary/macs2" -// } -// 'deseq2_featurecounts' { -// publish_dir = "bwa/mergedLibrary/macs2" -// } -// 'multiqc' { -// args = '' -// publish_dir = "multiqc" -// } -// } -// } diff --git a/modules/local/igv.nf b/modules/local/igv.nf index e70ccfa8e..0cf01511a 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -10,12 +10,12 @@ process IGV { input: path fasta - path ("${bigwig_options.publish_dir}/*") - path ("${peak_options.publish_dir}/*") - path ("${consensus_options.publish_dir}/*") - val bigwig_options - val peak_options - val consensus_options + path ("${bigwig_publish_dir}/*") + path ("${peak_publish_dir}/*") + path ("${consensus_publish_dir}/*") + val bigwig_publish_dir + val peak_publish_dir + val consensus_publish_dir // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) output: diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index cda46b955..dcd502cae 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -494,17 +494,22 @@ workflow CHIPSEQ { // // Create IGV session // - // TODO rethink how files are passed - // IGV ( - // PREPARE_GENOME.out.fasta, - // UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - // MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - // params.modules['ucsc_bedgraphtobigwig'], - // params.modules['macs2_callpeak'], - // params.modules['macs2_consensus'] - // ) - // ch_versions = ch_versions.mix(IGV.out.versions) + if (!params.skip_igv) { + IGV ( + PREPARE_GENOME.out.fasta, + UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + "bwa/mergedLibrary/bigwig", + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') } + ) + ch_versions = ch_versions.mix(IGV.out.versions) + } // // MODULE: Pipeline reporting From 87eefc4074aa3a95d8f2b800375c4309aeb9308a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 21 Dec 2021 12:41:11 +0100 Subject: [PATCH 263/538] Remove vestiges from the old syntax --- subworkflows/local/filter_bam_bamtools.nf | 13 +-- subworkflows/nf-core/align_bwa_mem.nf | 9 +-- subworkflows/nf-core/bam_sort_samtools.nf | 10 +-- subworkflows/nf-core/bam_stats_samtools.nf | 8 +- subworkflows/nf-core/fastqc_trimgalore.nf | 7 +- .../nf-core/mark_duplicates_picard.nf | 9 +-- workflows/chipseq.nf | 80 ++----------------- 7 files changed, 24 insertions(+), 112 deletions(-) diff --git a/subworkflows/local/filter_bam_bamtools.nf b/subworkflows/local/filter_bam_bamtools.nf index 1ab9fec7f..8472ce5d0 100644 --- a/subworkflows/local/filter_bam_bamtools.nf +++ b/subworkflows/local/filter_bam_bamtools.nf @@ -1,15 +1,10 @@ /* * Filter BAM file */ -// params.bam_filter_options = [:] -// params.bam_remove_orphans_options = [:] -// params.samtools_sort_options = [:] -// params.samtools_index_options = [:] -// params.samtools_stats_options = [:] - -include { BAM_FILTER } from '../../modules/local/bam_filter' //addParams( options: params.bam_filter_options ) -include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' //addParams( options: params.bam_remove_orphans_options ) -include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' //addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) + +include { BAM_FILTER } from '../../modules/local/bam_filter' +include { BAM_REMOVE_ORPHANS } from '../../modules/local/bam_remove_orphans' +include { BAM_SORT_SAMTOOLS } from '../nf-core/bam_sort_samtools' workflow FILTER_BAM_BAMTOOLS { take: diff --git a/subworkflows/nf-core/align_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf index 0f80487fa..297fd3504 100644 --- a/subworkflows/nf-core/align_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -2,13 +2,8 @@ * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats */ -// params.bwa_mem_options = [:] -// params.samtools_sort_options = [:] -// params.samtools_index_options = [:] -// params.samtools_stats_options = [:] - -include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' //addParams( options: params.bwa_mem_options ) -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' //addParams( sort_options: params.samtools_sort_options, index_options: params.samtools_index_options, stats_options: params.samtools_stats_options ) +include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow ALIGN_BWA_MEM { take: diff --git a/subworkflows/nf-core/bam_sort_samtools.nf b/subworkflows/nf-core/bam_sort_samtools.nf index 9e1ce9dbb..418e14cc0 100644 --- a/subworkflows/nf-core/bam_sort_samtools.nf +++ b/subworkflows/nf-core/bam_sort_samtools.nf @@ -2,13 +2,9 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -// params.sort_options = [:] -// params.index_options = [:] -// params.stats_options = [:] - -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' //addParams( options: params.sort_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.index_options ) -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' //addParams( options: params.stats_options ) +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow BAM_SORT_SAMTOOLS { take: diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index fe26629a6..89a7338f6 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -2,11 +2,9 @@ * Run SAMtools stats, flagstat and idxstats */ -//params.options = [:] - -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' //addParams( options: params.options ) -include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' //addParams( options: params.options ) -include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' //addParams( options: params.options ) +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' workflow BAM_STATS_SAMTOOLS { take: diff --git a/subworkflows/nf-core/fastqc_trimgalore.nf b/subworkflows/nf-core/fastqc_trimgalore.nf index acaab9fd5..966541cad 100644 --- a/subworkflows/nf-core/fastqc_trimgalore.nf +++ b/subworkflows/nf-core/fastqc_trimgalore.nf @@ -2,11 +2,8 @@ // Read QC and trimming // -params.fastqc_options = [:] -params.trimgalore_options = [:] - -include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' addParams( options: params.fastqc_options ) -include { TRIMGALORE } from '../../modules/nf-core/modules/trimgalore/main' addParams( options: params.trimgalore_options ) +include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' +include { TRIMGALORE } from '../../modules/nf-core/modules/trimgalore/main' workflow FASTQC_TRIMGALORE { take: diff --git a/subworkflows/nf-core/mark_duplicates_picard.nf b/subworkflows/nf-core/mark_duplicates_picard.nf index adaa2911a..33e88bf58 100644 --- a/subworkflows/nf-core/mark_duplicates_picard.nf +++ b/subworkflows/nf-core/mark_duplicates_picard.nf @@ -1,13 +1,10 @@ /* * Picard MarkDuplicates, sort, index BAM file and run samtools stats, flagstat and idxstats */ -// params.markduplicates_options = [:] // TODO -// params.samtools_index_options = [:] // TODO -// params.samtools_stats_options = [:] // TODO -include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' //addParams( options: params.markduplicates_options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' //addParams( options: params.samtools_index_options ) -include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' //addParams( options: params.samtools_stats_options ) +include { PICARD_MARKDUPLICATES } from '../../modules/nf-core/modules/picard/markduplicates/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { BAM_STATS_SAMTOOLS } from './bam_stats_samtools' workflow MARK_DUPLICATES_PICARD { take: diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index dcd502cae..de4419bd9 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -61,29 +61,13 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -// def modules = params.modules.clone() - -// def plot_macs2_qc_options = modules['plot_macs2_qc'] -// plot_macs2_qc_options.publish_dir += "/$peakType/qc" - -// def plot_homer_annotatepeaks_options = modules['plot_homer_annotatepeaks'] -// plot_homer_annotatepeaks_options.publish_dir += "/$peakType/qc" - -// def macs2_consensus_options = modules['macs2_consensus'] -// macs2_consensus_options.publish_dir += "/$peakType/qc" - -// def multiqc_options = modules['multiqc'] -// multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' -// multiqc_options.publish_dir += "/$peakType" - include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' include { FRIP_SCORE } from '../modules/local/frip_score' include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' //include { DESEQ2_QC } from '../modules/local/deseq2_qc' -include { IGV } from '../modules/local/igv' //addParams( options: [:] ) +include { IGV } from '../modules/local/igv' include { MULTIQC } from '../modules/local/multiqc' include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks' @@ -91,30 +75,9 @@ include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_c // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // - -// def publish_genome_options = params.save_reference ? [publish_dir: 'genome'] : [publish_files: false] -// def publish_index_options = params.save_reference ? [publish_dir: 'genome/index'] : [publish_files: false] - -// def gffread_options = modules['gffread'] -// if (!params.save_reference) { gffread_options['publish_files'] = false } - -// def bwa_index_options = modules['bwa_index'] -// if (!params.save_reference) { bwa_index_options['publish_files'] = false } - -include { INPUT_CHECK } from '../subworkflows/local/input_check' //addParams( options: [:] ) -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' //addParams( -// genome_options : publish_genome_options, -// index_options : publish_index_options, -// gffread_options : gffread_options, -// bwa_index_options : bwa_index_options -// ) -include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' //addParams( -// bam_filter_options : modules['bam_filter'], -// bam_remove_orphans_options: modules['bam_remove_orphans'], -// samtools_sort_options : modules['samtools_sort_filter'], -// samtools_index_options : modules['samtools_sort_filter'], -// samtools_stats_options : modules['samtools_sort_filter'] -// ) +include { INPUT_CHECK } from '../subworkflows/local/input_check' +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' +include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' /* ======================================================================================== @@ -126,25 +89,6 @@ include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' // MODULE: Installed directly from nf-core/modules // -// def deeptools_plotfingerprint_options = modules['deeptools_plotfingerprint'] // AQUI see here https://github.com/nf-core/rnaseq/blob/492f6e0e678b4a5fcdf26b3a60834efb23265889/conf/modules.config#L83 -// deeptools_plotfingerprint_options.args += " --numberOfSamples $params.fingerprint_bins" - -// def macs2_callpeak_options = modules['macs2_callpeak'] -// macs2_callpeak_options.args += params.narrow_peak ? '' : Utils.joinModuleArgs(['--broad', "--broad-cutoff ${params.broad_cutoff}"]) -// macs2_callpeak_options.args += params.save_macs_pileup ? Utils.joinModuleArgs(['--bdg', '--SPMR']) : '' -// macs2_callpeak_options.args += params.macs_fdr ? Utils.joinModuleArgs(["--qvalue ${params.macs_fdr}"]) : '' -// macs2_callpeak_options.args += params.macs_pvalue ? Utils.joinModuleArgs(["--pvalue ${params.macs_pvalue}"]) : '' -// macs2_callpeak_options['publish_dir'] += "/$peakType" - -// def homer_annotatepeaks_macs2_options = modules['homer_annotatepeaks_macs2'] -// homer_annotatepeaks_macs2_options['publish_dir'] += "/$peakType" - -// def homer_annotatepeaks_consensus_options = modules['homer_annotatepeaks_consensus'] -// homer_annotatepeaks_consensus_options['publish_dir'] += "/$peakType/consensus" - -// def subread_featurecounts_options = modules['subread_featurecounts'] -// subread_featurecounts_options['publish_dir'] += "/$peakType/consensus" - include { PICARD_MERGESAMFILES } from '../modules/nf-core/modules/picard/mergesamfiles/main' include { PICARD_COLLECTMULTIPLEMETRICS } from '../modules/nf-core/modules/picard/collectmultiplemetrics/main' include { PRESEQ_LCEXTRAP } from '../modules/nf-core/modules/preseq/lcextrap/main' @@ -165,16 +109,9 @@ include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../module // SUBWORKFLOW: Consisting entirely of nf-core/modules // -// def trimgalore_options = modules['trimgalore'] -// trimgalore_options.args += params.trim_nextseq > 0 ? Utils.joinModuleArgs(["--nextseq ${params.trim_nextseq}"]) : '' -// if (params.save_trimmed) { trimgalore_options.publish_files.put('fq.gz','') } - - -// def picard_markduplicates_samtools = modules['picard_markduplicates_samtools'] - -include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' //addParams( fastqc_options: modules['fastqc'], trimgalore_options: trimgalore_options ) -include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' //addParams( bwa_mem_options: modules['bwa_mem'], samtools_sort_options: modules['samtools_sort_lib'], samtools_index_options: modules['samtools_sort_lib'], samtools_stats_options: modules['samtools_sort_lib'] ) -include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' //addParams( markduplicates_options: modules['picard_markduplicates'], samtools_index_options: picard_markduplicates_samtools, samtools_stats_options: picard_markduplicates_samtools ) +include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' +include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' +include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' /* ======================================================================================== @@ -217,9 +154,6 @@ workflow CHIPSEQ { // // SUBWORKFLOW: Map reads & BAM QC // - // score = params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - // params.modules['bwa_mem'].args += score - ALIGN_BWA_MEM ( FASTQC_TRIMGALORE.out.reads, PREPARE_GENOME.out.bwa_index From 59c4b23666f9e48d8596f7a89f866d6ef10224ff Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 21 Dec 2021 20:38:06 +0100 Subject: [PATCH 264/538] Add back skip parameters --- conf/modules.config | 285 ++++++++++++++++++++++++------------------- workflows/chipseq.nf | 251 +++++++++++++++++++------------------ 2 files changed, 295 insertions(+), 241 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 522482121..88dd3900a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -275,24 +275,6 @@ process { pattern: "*.{stats,flagstat,idxstats}" ] } - withName: PICARD_COLLECTMULTIPLEMETRICS { - ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' - ext.prefix = { "${meta.id}.mLb.clN.sorted" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/picard_metrics" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: PRESEQ_LCEXTRAP { - ext.args = '-verbose -bam -seed 1' - ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/preseq" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } withName: PHANTOMPEAKQUALTOOLS { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ @@ -323,153 +305,210 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: DEEPTOOLS_COMPUTEMATRIX { - ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' - ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: DEEPTOOLS_PLOTPROFILE { - ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: DEEPTOOLS_PLOTHEATMAP { - ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: DEEPTOOLS_PLOTFINGERPRINT { - ext.args = [ - '--skipZeros', - "--numberOfSamples $params.fingerprint_bins" - ].join(' ').trim() - ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - // withName: DESEQ2_FEATURECOUNTS { - // publishDir = [ - // path: { "${params.outdir}/bwa/mergedLibrary/macs2" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } } -// here -if (params.macs_gsize) { +if (!params.skip_picard_metrics) { process { - withName: MACS2_CALLPEAK { - ext.args = [ - '--keep-dup all', - params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", - params.save_macs_pileup ? '--bdg --SPMR' : '', - params.macs_fdr ? "--pvalue ${params.macs_pvalue}" : '', - params.macs_pvalue ? "--qvalue ${params.macs_fdr}" : '' - ].join(' ').trim() + withName: PICARD_COLLECTMULTIPLEMETRICS { + ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + path: { "${params.outdir}/bwa/mergedLibrary/picard_metrics" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: FRIP_SCORE { - ext.args = '-bed -c -f 0.20' + } +} + +if (!params.skip_preseq) { + process { + withName: PRESEQ_LCEXTRAP { + ext.args = '-verbose -bam -seed 1' + ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/frip" }, - enable: false + path: { "${params.outdir}/bwa/mergedLibrary/preseq" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: MULTIQC_CUSTOM_PEAKS { + } +} + +if (!params.skip_plot_profile) { + process { + withName: DEEPTOOLS_COMPUTEMATRIX { + ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' + ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/multiqc" }, - enabled: false + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: PLOT_MACS2_QC { - ext.args = '-o ./ -p macs2_peak' + withName: DEEPTOOLS_PLOTPROFILE { + ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: HOMER_ANNOTATEPEAKS_MACS2 { - ext.args = '-gid' - // ext.prefix = 'peaks' + withName: DEEPTOOLS_PLOTHEATMAP { + ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: PLOT_HOMER_ANNOTATEPEAKS { - ext.args = '-o ./ -p macs2_annotatePeaks' + } +} + +if (!params.skip_plot_fingerprint) { + process { + withName: DEEPTOOLS_PLOTFINGERPRINT { + ext.args = [ + '--skipZeros', + "--numberOfSamples $params.fingerprint_bins" + ].join(' ').trim() + ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: MACS2_CONSENSUS { + } +} + +if (params.macs_gsize) { + process { + withName: MACS2_CALLPEAK { + ext.args = [ + '--keep-dup all', + params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", + params.save_macs_pileup ? '--bdg --SPMR' : '', + params.macs_fdr ? "--pvalue ${params.macs_pvalue}" : '', + params.macs_pvalue ? "--qvalue ${params.macs_fdr}" : '' + ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: HOMER_ANNOTATEPEAKS_CONSENSUS { - ext.args = '-gid' - ext.prefix = 'consensus_peaks' + withName: FRIP_SCORE { + ext.args = '-bed -c -f 0.20' publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + path: { "${params.outdir}/frip" }, + enable: false ] } - withName: SUBREAD_FEATURECOUNTS { - ext.args = '-F SAF -O --fracOverlap 0.2' + withName: MULTIQC_CUSTOM_PEAKS { publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + path: { "${params.outdir}/multiqc" }, + enabled: false ] } } + + if (!params.skip_peak_annotation && !params.skip_peak_qc) { + process { + withName: PLOT_MACS2_QC { + ext.args = '-o ./ -p macs2_peak' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: HOMER_ANNOTATEPEAKS_MACS2 { + ext.args = '-gid' + // ext.prefix = 'peaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: PLOT_HOMER_ANNOTATEPEAKS { + ext.args = '-o ./ -p macs2_annotatePeaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + if (!params.skip_consensus_peaks) { + process { + withName: MACS2_CONSENSUS { + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SUBREAD_FEATURECOUNTS { + ext.args = '-F SAF -O --fracOverlap 0.2' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + if (!params.skip_peak_annotation) { + process { + withName: HOMER_ANNOTATEPEAKS_CONSENSUS { + ext.args = '-gid' + ext.prefix = 'consensus_peaks' + publishDir = [ + path: { [ + "${params.outdir}/bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + + // if (!params.skip_diff_analysis) { + // process { + // withName: DESEQ2_FEATURECOUNTS { + // publishDir = [ + // path: { "${params.outdir}/bwa/mergedLibrary/macs2" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + // } + // } } if (!params.skip_igv) { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index de4419bd9..45901d10a 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -201,19 +201,23 @@ workflow CHIPSEQ { // // MODULE: Post alignment QC // - PICARD_COLLECTMULTIPLEMETRICS ( - FILTER_BAM_BAMTOOLS.out.bam, - PREPARE_GENOME.out.fasta - ) - ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) + if (!params.skip_picard_metrics) { + PICARD_COLLECTMULTIPLEMETRICS ( + FILTER_BAM_BAMTOOLS.out.bam, + PREPARE_GENOME.out.fasta + ) + ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) + } // // MODULE: Library coverage // - PRESEQ_LCEXTRAP ( - FILTER_BAM_BAMTOOLS.out.bam - ) - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + if (!params.skip_preseq) { + PRESEQ_LCEXTRAP ( + FILTER_BAM_BAMTOOLS.out.bam + ) + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + } // // MODULE: Strand cross-correlation @@ -250,21 +254,23 @@ workflow CHIPSEQ { // // MODULE: Coverage plots // - DEEPTOOLS_COMPUTEMATRIX ( - UCSC_BEDGRAPHTOBIGWIG.out.bigwig, - PREPARE_GENOME.out.gene_bed - ) - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) + if (!params.skip_plot_profile) { + DEEPTOOLS_COMPUTEMATRIX ( + UCSC_BEDGRAPHTOBIGWIG.out.bigwig, + PREPARE_GENOME.out.gene_bed + ) + ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) - DEEPTOOLS_PLOTPROFILE ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix - ) - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) + DEEPTOOLS_PLOTPROFILE ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix + ) + ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) - DEEPTOOLS_PLOTHEATMAP ( - DEEPTOOLS_COMPUTEMATRIX.out.matrix - ) - ch_versions = ch_versions.mix(DEEPTOOLS_PLOTHEATMAP.out.versions.first()) + DEEPTOOLS_PLOTHEATMAP ( + DEEPTOOLS_COMPUTEMATRIX.out.matrix + ) + ch_versions = ch_versions.mix(DEEPTOOLS_PLOTHEATMAP.out.versions.first()) + } // // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] @@ -294,17 +300,17 @@ workflow CHIPSEQ { // // plotFingerprint for IP and control together // - DEEPTOOLS_PLOTFINGERPRINT ( - ch_ip_control_bam_bai - ) - ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) + if (!params.skip_plot_fingerprint) { + DEEPTOOLS_PLOTFINGERPRINT ( + ch_ip_control_bam_bai + ) + ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) + } + // + // Call peaks + // if (params.macs_gsize) { - - // - // Call peaks - // - // Create channel: [ val(meta), ip_bam, control_bam ] ch_ip_control_bam_bai .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } @@ -335,94 +341,103 @@ workflow CHIPSEQ { ch_peak_count_header, ch_frip_score_header ) + if (!params.skip_peak_annotation && !params.skip_peak_qc) { + PLOT_MACS2_QC ( // plot_macs2_qc.r + MACS2_CALLPEAK.out.peak.collect{it[1]} + ) + ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) + + HOMER_ANNOTATEPEAKS_MACS2 ( + MACS2_CALLPEAK.out.peak, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf + ) + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) + + // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}.view() + + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt" + ) + ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + } - PLOT_MACS2_QC ( - MACS2_CALLPEAK.out.peak.collect{it[1]} - ) - ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) - - HOMER_ANNOTATEPEAKS_MACS2 ( - MACS2_CALLPEAK.out.peak, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf - ) - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) - - // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}.view() - - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt" - ) - ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) - - // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - MACS2_CALLPEAK - .out - .peak - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - .groupTuple() - .map { - antibody, groups, peaks -> - [ - antibody, - groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - peaks - ] } - .map { - antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } - .set { ch_antibody_peaks } - - MACS2_CONSENSUS ( - ch_antibody_peaks - ) - ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) - - HOMER_ANNOTATEPEAKS_CONSENSUS ( - MACS2_CONSENSUS.out.bed, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf - ) - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - - // Create channel: [ val(meta), ip_bam ] - MACS2_CONSENSUS - .out - .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .combine(ch_ip_saf) - .map { - it -> - fmeta = it[1] - fmeta['replicates_exist'] = it[4]['replicates_exist'] - fmeta['multiple_groups'] = it[4]['multiple_groups'] - [ fmeta, it[2], it[5] ] } - .set { ch_ip_bam } - - SUBREAD_FEATURECOUNTS ( - ch_ip_bam - ) - ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - - // // DESEQ2_FEATURECOUNTS ( - // // params.modules['deseq2_featurecounts'] - // // ) - // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - + // + // Consensus peaks analysis + // + if (!params.skip_consensus_peaks) { + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + MACS2_CALLPEAK + .out + .peak + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ + antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks + ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + MACS2_CONSENSUS ( + ch_antibody_peaks + ) + ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) + + if (!params.skip_peak_annotation) { + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf + ) + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + } + + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .combine(ch_ip_saf) + .map { + it -> + fmeta = it[1] + fmeta['replicates_exist'] = it[4]['replicates_exist'] + fmeta['multiple_groups'] = it[4]['multiple_groups'] + [ fmeta, it[2], it[5] ] } + .set { ch_ip_bam } + + SUBREAD_FEATURECOUNTS ( + ch_ip_bam + ) + ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) + + // if (!params.skip_diff_analysis) { + // // DESEQ2_FEATURECOUNTS ( + // // params.modules['deseq2_featurecounts'] + // // ) + // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + // } + } } // From 46d9dda942a4641d2395568cd3372879bcc26c19 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 22 Dec 2021 23:07:14 +0100 Subject: [PATCH 265/538] Add missing skip parameters --- conf/modules.config | 27 +++++++-------- workflows/chipseq.nf | 78 +++++++++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 45 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 88dd3900a..de0dc2bd8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -509,19 +509,19 @@ if (params.macs_gsize) { // } // } // } -} -if (!params.skip_igv) { - process { - withName: IGV { - publishDir = [ - path: { [ - "${params.outdir}/igv", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + if (!params.skip_igv) { + process { + withName: IGV { + publishDir = [ + path: { [ + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } } } } @@ -531,10 +531,7 @@ if (!params.skip_multiqc) { withName: MULTIQC { ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' publishDir = [ - path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + path: { "${params.outdir}/multiqc" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 45901d10a..e095352ff 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -201,22 +201,26 @@ workflow CHIPSEQ { // // MODULE: Post alignment QC // + ch_picardcollectmultiplemetrics_multiqc = Channel.empty() if (!params.skip_picard_metrics) { PICARD_COLLECTMULTIPLEMETRICS ( FILTER_BAM_BAMTOOLS.out.bam, PREPARE_GENOME.out.fasta ) + ch_picardcollectmultiplemetrics_multiqc = MARK_DUPLICATES_PICARD.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) } // // MODULE: Library coverage // + ch_preseq_multiqc = Channel.empty() if (!params.skip_preseq) { PRESEQ_LCEXTRAP ( FILTER_BAM_BAMTOOLS.out.bam ) - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.ccurve + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) } // @@ -254,6 +258,7 @@ workflow CHIPSEQ { // // MODULE: Coverage plots // + ch_deeptoolsplotprofile_multiqc = Channel.empty() if (!params.skip_plot_profile) { DEEPTOOLS_COMPUTEMATRIX ( UCSC_BEDGRAPHTOBIGWIG.out.bigwig, @@ -264,6 +269,7 @@ workflow CHIPSEQ { DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix ) + ch_deeptoolsplotprofile_multiqc = DEEPTOOLS_PLOTPROFILE.out.table ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) DEEPTOOLS_PLOTHEATMAP ( @@ -300,22 +306,29 @@ workflow CHIPSEQ { // // plotFingerprint for IP and control together // + ch_deeptoolsplotfingerprint_multiqc = Channel.empty() if (!params.skip_plot_fingerprint) { DEEPTOOLS_PLOTFINGERPRINT ( ch_ip_control_bam_bai ) + ch_deeptools_plotfingerprintmultiqc = DEEPTOOLS_PLOTFINGERPRINT.out.matrix ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) } // // Call peaks // + ch_custompeaks_frip_multiqc = Channel.empty() + ch_custompeaks_count_multiqc = Channel.empty() + ch_plothomerannotatepeaks_multiqc = Channel.empty() + ch_subreadfeaturecounts_multiqc = Channel.empty() if (params.macs_gsize) { // Create channel: [ val(meta), ip_bam, control_bam ] ch_ip_control_bam_bai .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } .set { ch_ip_control_bam } + MACS2_CALLPEAK ( ch_ip_control_bam, params.macs_gsize @@ -341,8 +354,11 @@ workflow CHIPSEQ { ch_peak_count_header, ch_frip_score_header ) + ch_custompeaks_frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip + ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count + if (!params.skip_peak_annotation && !params.skip_peak_qc) { - PLOT_MACS2_QC ( // plot_macs2_qc.r + PLOT_MACS2_QC ( MACS2_CALLPEAK.out.peak.collect{it[1]} ) ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) @@ -361,6 +377,7 @@ workflow CHIPSEQ { ch_peak_annotation_header, "_peaks.annotatePeaks.txt" ) + ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) } @@ -428,6 +445,7 @@ workflow CHIPSEQ { SUBREAD_FEATURECOUNTS ( ch_ip_bam ) + ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) // if (!params.skip_diff_analysis) { @@ -437,27 +455,27 @@ workflow CHIPSEQ { // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) // } - } - } - // - // Create IGV session - // - if (!params.skip_igv) { - IGV ( - PREPARE_GENOME.out.fasta, - UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - "bwa/mergedLibrary/bigwig", - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') } - ) - ch_versions = ch_versions.mix(IGV.out.versions) + // + // Create IGV session + // + if (!params.skip_igv) { + IGV ( + PREPARE_GENOME.out.fasta, + UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + "bwa/mergedLibrary/bigwig", + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') } + ) + ch_versions = ch_versions.mix(IGV.out.versions) + } + } } // @@ -496,20 +514,20 @@ workflow CHIPSEQ { FILTER_BAM_BAMTOOLS.out.stats.collect{it[1]}.ifEmpty([]), FILTER_BAM_BAMTOOLS.out.flagstat.collect{it[1]}.ifEmpty([]), FILTER_BAM_BAMTOOLS.out.idxstats.collect{it[1]}.ifEmpty([]), - PICARD_COLLECTMULTIPLEMETRICS.out.metrics.collect{it[1]}.ifEmpty([]), + ch_picardcollectmultiplemetrics_multiqc.collect{it[1]}.ifEmpty([]), - PRESEQ_LCEXTRAP.out.ccurve.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTPROFILE.out.table.collect{it[1]}.ifEmpty([]), - DEEPTOOLS_PLOTFINGERPRINT.out.matrix.collect{it[1]}.ifEmpty([]), + ch_preseq_multiqc.collect{it[1]}.ifEmpty([]), + ch_deeptoolsplotprofile_multiqc.collect{it[1]}.ifEmpty([]), + ch_deeptoolsplotfingerprint_multiqc.collect{it[1]}.ifEmpty([]), PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.correlation.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PEAKS.out.count.collect{it[1]}.ifEmpty([]), - MULTIQC_CUSTOM_PEAKS.out.frip.collect{it[1]}.ifEmpty([]), - PLOT_HOMER_ANNOTATEPEAKS.out.tsv.collect().ifEmpty([]), - SUBREAD_FEATURECOUNTS.out.summary.collect{it[1]}.ifEmpty([]), + ch_custompeaks_frip_multiqc.collect{it[1]}.ifEmpty([]), + ch_custompeaks_count_multiqc.collect{it[1]}.ifEmpty([]), + ch_plothomerannotatepeaks_multiqc.collect{it[1]}.ifEmpty([]), + ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([]), // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() From ff433252a15f9800a3ecca1f745fd60e21e62a9c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 22 Dec 2021 23:08:49 +0100 Subject: [PATCH 266/538] Add macsGsizeWarn method --- lib/WorkflowChipseq.groovy | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index a24781669..99d4cbe18 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -25,7 +25,7 @@ class WorkflowChipseq { } if (!params.macs_gsize) { - macsGsizeWarn(params, log) + macsGsizeWarn(log) } } @@ -69,4 +69,26 @@ class WorkflowChipseq { System.exit(1) } } + + // + // Print a warning if both GTF and GFF have been provided + // + private static void gtfGffWarn(log) { + log.warn "=============================================================================\n" + + " Both '--gtf' and '--gff' parameters have been provided.\n" + + " Using GTF file as priority.\n" + + "===================================================================================" + } + + // + // Print a warning if macs_gsize parameter has not been provided + // + private static void macsGsizeWarn(log) { + log.warn "=============================================================================\n" + + " --macs_gsize parameter has not been provided.\n" + + " MACS2 peak-calling and differential analysis will be skipped.\n" + + " Provide '--macs_gsize genome_size' to change this behaviour.\n" + + "===================================================================================" + } + } From bc297e1b8ce1493d4d4b0a33f7c8407f4ae3fd2e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 22 Dec 2021 23:09:18 +0100 Subject: [PATCH 267/538] Add macs_gsize to nextflow config --- lib/WorkflowChipseq.groovy | 2 +- nextflow.config | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 99d4cbe18..9c8c46f8c 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -87,7 +87,7 @@ class WorkflowChipseq { log.warn "=============================================================================\n" + " --macs_gsize parameter has not been provided.\n" + " MACS2 peak-calling and differential analysis will be skipped.\n" + - " Provide '--macs_gsize genome_size' to change this behaviour.\n" + + " Provide '--macs_gsize macs2_genome_size' to change this behaviour.\n" + "===================================================================================" } diff --git a/nextflow.config b/nextflow.config index c13bae66c..e3bd51444 100644 --- a/nextflow.config +++ b/nextflow.config @@ -38,6 +38,7 @@ params { // Options: Peaks narrow_peak = false broad_cutoff = 0.1 + macs_gsize = null macs_fdr = null macs_pvalue = null min_reps_consensus = 1 From f098af0f5e39c586276ff80e383f83e3f1a3570c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 22 Dec 2021 23:15:24 +0100 Subject: [PATCH 268/538] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06cee4a48..4398da938 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Major enhancements +* Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + * Removed `--publish_dir_mode` as it is no longer required for the new syntax +* Bump minimum Nextflow version from `21.04.0` -> `21.10.3` +* Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) * Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) * Updated Nextflow version to `v21.04.0` (see [nextflow#572](https://github.com/nextflow-io/nextflow/issues/1964)) * Move template boilerplate code to Groovy `lib/` From 865210afa074301fad8e83429dbae93b762ea0ae Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 08:49:05 +0100 Subject: [PATCH 269/538] Try to fix ci --- .github/workflows/ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5bf66d594..9cbd18562 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,12 +50,11 @@ jobs: name: Test workflow parameters if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest - env: - NXF_VER: '21.10.3' - NXF_ANSI_LOG: false strategy: matrix: - parameters: [--skip_trimming, --skip_consensus_peaks] + parameters: + - "--skip_trimming" + - "--skip_consensus_peaks" steps: - name: Check out pipeline code uses: actions/checkout@v2 From b9ecb715550f1fca6eef49169b102fa0ba1a25f2 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 14:18:05 +0100 Subject: [PATCH 270/538] Update .github/workflows/awsfulltest.yml Co-authored-by: Harshil Patel --- .github/workflows/awsfulltest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 945378313..f56327c16 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -27,4 +27,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' From af28f5b8a391bef080c83f765ab8abae92f5f8ca Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 14:21:16 +0100 Subject: [PATCH 271/538] Update .github/workflows/awstest.yml Co-authored-by: Harshil Patel --- .github/workflows/awstest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 5404cbd32..efb79775a 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,4 +25,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' From 29efd678be8214afb0cafe6f93f3b815dde95ea7 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 14:21:55 +0100 Subject: [PATCH 272/538] Update CHANGELOG.md Co-authored-by: Harshil Patel --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4398da938..27d0d4867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Removed `--publish_dir_mode` as it is no longer required for the new syntax * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` * Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) -* Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) -* Updated Nextflow version to `v21.04.0` (see [nextflow#572](https://github.com/nextflow-io/nextflow/issues/1964)) -* Move template boilerplate code to Groovy `lib/` * Added `python3` shebang to appropriate scripts in `bin/` directory ### Other enhancements & fixes From d530787dada33f2ca828b2ac24ef731aeb5af95a Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 15:29:26 +0100 Subject: [PATCH 273/538] Update modules/local/plot_homer_annotatepeaks.nf Co-authored-by: Harshil Patel --- modules/local/plot_homer_annotatepeaks.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 523d13252..0873e38eb 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -1,6 +1,3 @@ -/* - * Aggregated QC plots for peak-to-gene annotation - */ process PLOT_HOMER_ANNOTATEPEAKS { label 'process_medium' From fd3e77b3edc4e94ba53db6cebdcb8b5fd51c10c2 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 15:29:41 +0100 Subject: [PATCH 274/538] Update modules/local/plot_macs2_qc.nf Co-authored-by: Harshil Patel --- modules/local/plot_macs2_qc.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/local/plot_macs2_qc.nf b/modules/local/plot_macs2_qc.nf index b47e7068b..bbbf1ce81 100644 --- a/modules/local/plot_macs2_qc.nf +++ b/modules/local/plot_macs2_qc.nf @@ -1,6 +1,3 @@ -/* - * Aggregated QC plots for peaks - */ process PLOT_MACS2_QC { label 'process_medium' From 2b36e83ea5a67f6c826f1f1735fe48bebf4ba01c Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 23 Dec 2021 15:30:31 +0100 Subject: [PATCH 275/538] Update nextflow.config Co-authored-by: Harshil Patel --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index e3bd51444..15be97225 100644 --- a/nextflow.config +++ b/nextflow.config @@ -81,7 +81,7 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false // Config options From 318dd3c298e582f87554bee9b33f99a92333a3a4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 14:48:34 +0100 Subject: [PATCH 276/538] Install custom_getchromsizes module --- conf/modules.config | 2 +- modules.json | 3 ++ modules/local/get_chrom_sizes.nf | 30 -------------- .../modules/custom/getchromsizes/main.nf | 29 ++++++++++++++ .../modules/custom/getchromsizes/meta.yml | 39 +++++++++++++++++++ subworkflows/local/prepare_genome.nf | 14 +++---- 6 files changed, 79 insertions(+), 38 deletions(-) delete mode 100644 modules/local/get_chrom_sizes.nf create mode 100644 modules/nf-core/modules/custom/getchromsizes/main.nf create mode 100644 modules/nf-core/modules/custom/getchromsizes/meta.yml diff --git a/conf/modules.config b/conf/modules.config index de0dc2bd8..10b1d336d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -85,7 +85,7 @@ process { enabled: params.save_reference ] } - withName: GET_CHROM_SIZES { + withName: CUSTOM_GETCHROMSIZES { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', diff --git a/modules.json b/modules.json index f56ae271e..d5064b5dc 100644 --- a/modules.json +++ b/modules.json @@ -12,6 +12,9 @@ "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "custom/getchromsizes": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "deeptools/computematrix": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf deleted file mode 100644 index 335bba2fd..000000000 --- a/modules/local/get_chrom_sizes.nf +++ /dev/null @@ -1,30 +0,0 @@ -process GET_CHROM_SIZES { - tag "$fasta" - - conda (params.enable_conda ? "bioconda::samtools=1.10" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.10--h9402c20_2': - 'quay.io/biocontainers/samtools:1.10--h9402c20_2' }" - - input: - path fasta - - output: - path '*.sizes' , emit: sizes - path '*.fai' , emit: fai - path "versions.yml", emit: versions - - script: - """ - samtools \\ - faidx \\ - $fasta - - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/custom/getchromsizes/main.nf b/modules/nf-core/modules/custom/getchromsizes/main.nf new file mode 100644 index 000000000..270b3f489 --- /dev/null +++ b/modules/nf-core/modules/custom/getchromsizes/main.nf @@ -0,0 +1,29 @@ +process CUSTOM_GETCHROMSIZES { + tag "$fasta" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + path fasta + + output: + path '*.sizes' , emit: sizes + path '*.fai' , emit: fai + path "versions.yml", emit: versions + + script: + def args = task.ext.args ?: '' + """ + samtools faidx $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + custom: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/custom/getchromsizes/meta.yml b/modules/nf-core/modules/custom/getchromsizes/meta.yml new file mode 100644 index 000000000..eb1db4bb0 --- /dev/null +++ b/modules/nf-core/modules/custom/getchromsizes/meta.yml @@ -0,0 +1,39 @@ +name: custom_getchromsizes +description: Generates a FASTA file of chromosome sizes and a fasta index file +keywords: + - fasta + - chromosome + - indexing +tools: + - samtools: + description: Tools for dealing with SAM, BAM and CRAM files + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + tool_dev_url: https://github.com/samtools/samtools + doi: 10.1093/bioinformatics/btp352 + licence: ['MIT'] + +input: + - fasta: + type: file + description: FASTA file + pattern: "*.{fasta}" + +output: + - sizes: + type: file + description: File containing chromosome lengths + pattern: "*.{sizes}" + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - versions: + type: file + description: File containing software version + pattern: "versions.yml" + + +authors: + - "@tamara-hodgetts" + - "@chris-cheshire" diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 620bb87a8..afdddc49e 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -8,12 +8,12 @@ include { GUNZIP as GUNZIP_GFF GUNZIP as GUNZIP_GENE_BED GUNZIP as GUNZIP_BLACKLIST } from '../../modules/nf-core/modules/gunzip/main' -include { UNTAR } from '../../modules/nf-core/modules/untar/main' -include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' -include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' +include { UNTAR } from '../../modules/nf-core/modules/untar/main' +include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' +include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' +include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' include { GTF2BED } from '../../modules/local/gtf2bed' -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' workflow PREPARE_GENOME { @@ -96,14 +96,14 @@ workflow PREPARE_GENOME { // // Create chromosome sizes file // - ch_chrom_sizes = GET_CHROM_SIZES ( ch_fasta ).sizes - ch_versions = ch_versions.mix(GET_CHROM_SIZES.out.versions) + ch_chrom_sizes = CUSTOM_GETCHROMSIZES ( ch_fasta ).sizes + ch_versions = ch_versions.mix(CUSTOM_GETCHROMSIZES.out.versions) // // Prepare genome intervals for filtering by removing regions in blacklist file // GENOME_BLACKLIST_REGIONS ( - GET_CHROM_SIZES.out.sizes, + CUSTOM_GETCHROMSIZES.out.sizes, ch_blacklist.ifEmpty([]) ) ch_versions = ch_versions.mix(GENOME_BLACKLIST_REGIONS.out.versions) From 38769b6be5eab09c037e45f6292daaba60b4db3f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:06:58 +0100 Subject: [PATCH 277/538] Set macs_consensus files from modules.config --- conf/modules.config | 1 + modules/local/macs2_consensus.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 10b1d336d..f1d851233 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -458,6 +458,7 @@ if (params.macs_gsize) { if (!params.skip_consensus_peaks) { process { withName: MACS2_CONSENSUS { + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/bwa/mergedLibrary/macs2", diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 2165ca929..7ca2c35e7 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -23,7 +23,7 @@ process MACS2_CONSENSUS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ if (meta.multiple_groups || meta.replicates_exist) { - def prefix = task.ext.prefix ? "${task.ext.prefix}.consensus_peaks": "${meta.id}.consensus_peaks" + def prefix = task.ext.prefix ?: "${meta.id}" def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') From 154674d9f939ee4195c0213ed2466ed996363d7f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:08:06 +0100 Subject: [PATCH 278/538] Remove line, review comment --- modules/local/multiqc.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 37e41984c..4d6fe9f53 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -43,7 +43,6 @@ process MULTIQC { path ('macs2/annotation/*') path ('featurecounts/*') - // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) output: path "*multiqc_report.html", emit: report From aa10f83e683a162c0b69cc43bc3e16b379512cb4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:16:40 +0100 Subject: [PATCH 279/538] Add versions.yml to multiqc_custom_peaks --- modules/local/multiqc_custom_peaks.nf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index de90cc75d..64f918c4f 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -19,5 +19,10 @@ process MULTIQC_CUSTOM_PEAKS { """ cat $peak | wc -l | awk -v OFS='\t' '{ print "${prefix}", \$1 }' | cat $peak_count_header - > ${prefix}.peak_count_mqc.tsv cat $frip_score_header $frip > ${prefix}.FRiP_mqc.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS """ } From 50c0410850b88b2278128d65118a5c283022092b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:28:41 +0100 Subject: [PATCH 280/538] Remove comment --- modules/local/multiqc_custom_phantompeakqualtools.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index 7a13f7e51..d0b1ea9cb 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -1,5 +1,4 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { - //TODO substitute with a newest tag (see https://github.com/BioContainers/containers/issues/416) conda (params.enable_conda ? "conda-forge::r-base=3.5.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/r-base:3.5.1': From 9eb3c17951b83774e42889b4797ef28ae203945f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:33:50 +0100 Subject: [PATCH 281/538] Add authors to manifest --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 15be97225..2b0941719 100644 --- a/nextflow.config +++ b/nextflow.config @@ -202,7 +202,7 @@ dag { manifest { name = 'nf-core/chipseq' - author = 'Philip Ewels' + author = 'Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel' homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' From 41f753c73b9806d920d848b2f4e833e4ea8682bc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 15:58:28 +0100 Subject: [PATCH 282/538] Update LICENSE authors to make nf-ore happy --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 2a0f576bc..e6309f574 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Philip Ewels +Copyright (c) Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 206469f7f027795f58970b217a23a7ce47b72712 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Dec 2021 16:08:03 +0100 Subject: [PATCH 283/538] Files exists not needed anymore --- .nf-core.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index daf3ed014..a384653dc 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,4 @@ lint: - assets/email_template.txt - lib/NfcoreTemplate.groovy - assets/multiqc_config.yaml - files_exist: - - bin/scrape_software_versions.py - - modules/local/get_software_versions.nf + From 7abee4540d5c804125febd44d52bf375c1ed143d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 17 Jan 2022 18:11:24 +0100 Subject: [PATCH 284/538] Add chromap_index and chromap_chromap modules --- modules.json | 6 ++ .../nf-core/modules/chromap/chromap/main.nf | 92 +++++++++++++++++++ .../nf-core/modules/chromap/chromap/meta.yml | 88 ++++++++++++++++++ modules/nf-core/modules/chromap/index/main.nf | 36 ++++++++ .../nf-core/modules/chromap/index/meta.yml | 33 +++++++ 5 files changed, 255 insertions(+) create mode 100644 modules/nf-core/modules/chromap/chromap/main.nf create mode 100644 modules/nf-core/modules/chromap/chromap/meta.yml create mode 100644 modules/nf-core/modules/chromap/index/main.nf create mode 100644 modules/nf-core/modules/chromap/index/meta.yml diff --git a/modules.json b/modules.json index d5064b5dc..06340876b 100644 --- a/modules.json +++ b/modules.json @@ -9,6 +9,12 @@ "bwa/mem": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, + "chromap/chromap": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, + "chromap/index": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/chromap/chromap/main.nf b/modules/nf-core/modules/chromap/chromap/main.nf new file mode 100644 index 000000000..4a7f00974 --- /dev/null +++ b/modules/nf-core/modules/chromap/chromap/main.nf @@ -0,0 +1,92 @@ +def VERSION = '0.1' // Version information not provided by tool on CLI + +process CHROMAP_CHROMAP { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::chromap=0.1 bioconda::samtools=1.13" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' : + 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' }" + + input: + tuple val(meta), path(reads) + path fasta + path index + path barcodes + path whitelist + path chr_order + path pairs_chr_order + + output: + tuple val(meta), path("*.bed.gz") , optional:true, emit: bed + tuple val(meta), path("*.bam") , optional:true, emit: bam + tuple val(meta), path("*.tagAlign.gz"), optional:true, emit: tagAlign + tuple val(meta), path("*.pairs.gz") , optional:true, emit: pairs + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def args_list = args.tokenize() + + def file_extension = args.contains("--SAM") ? 'sam' : args.contains("--TagAlign")? 'tagAlign' : args.contains("--pairs")? 'pairs' : 'bed' + if (barcodes) { + args_list << "-b ${barcodes.join(',')}" + if (whitelist) { + args_list << "--barcode-whitelist $whitelist" + } + } + if (chr_order) { + args_list << "--chr-order $chr_order" + } + if (pairs_chr_order){ + args_list << "--pairs-natural-chr-order $pairs_chr_order" + } + def final_args = args_list.join(' ') + def compression_cmds = "gzip ${prefix}.${file_extension}" + if (args.contains("--SAM")) { + compression_cmds = """ + samtools view $args2 -@ $task.cpus -bh \\ + -o ${prefix}.bam ${prefix}.${file_extension} + rm ${prefix}.${file_extension} + """ + } + if (meta.single_end) { + """ + chromap \\ + $final_args \\ + -t $task.cpus \\ + -x $index \\ + -r $fasta \\ + -1 ${reads.join(',')} \\ + -o ${prefix}.${file_extension} + + $compression_cmds + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: $VERSION + END_VERSIONS + """ + } else { + """ + chromap \\ + $final_args \\ + -t $task.cpus \\ + -x $index \\ + -r $fasta \\ + -1 ${reads[0]} \\ + -2 ${reads[1]} \\ + -o ${prefix}.${file_extension} + + $compression_cmds + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: $VERSION + END_VERSIONS + """ + } +} diff --git a/modules/nf-core/modules/chromap/chromap/meta.yml b/modules/nf-core/modules/chromap/chromap/meta.yml new file mode 100644 index 000000000..57936c673 --- /dev/null +++ b/modules/nf-core/modules/chromap/chromap/meta.yml @@ -0,0 +1,88 @@ +name: chromap_chromap +description: | + Performs preprocessing and alignment of chromatin fastq files to + fasta reference files using chromap. +keywords: + - chromap + - alignment + - map + - fastq + - bam + - sam + - hi-c + - atac-seq + - chip-seq + - trimming + - duplicate removal +tools: + - chromap: + description: Fast alignment and preprocessing of chromatin profiles + homepage: https://github.com/haowenz/chromap + documentation: https://github.com/haowenz/chromap + tool_dev_url: https://github.com/haowenz/chromap + doi: "" + licence: ['GPL v3'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - fasta: + type: file + description: | + The fasta reference file. + - index: + type: file + description: | + Chromap genome index files (*.index) + - barcodes: + type: file + description: | + Cell barcode files + - whitelist: + type: file + description: | + Cell barcode whitelist file + - chr_order: + type: file + description: | + Custom chromosome order + - pairs_chr_order: + type: file + description: | + Natural chromosome order for pairs flipping +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bed: + type: file + description: BED file + pattern: "*.bed.gz" + - bam: + type: file + description: BAM file + pattern: "*.bam" + - tagAlign: + type: file + description: tagAlign file + pattern: "*.tagAlign.gz" + - pairs: + type: file + description: pairs file + pattern: "*.pairs.gz" + +authors: + - "@mahesh-panchal" diff --git a/modules/nf-core/modules/chromap/index/main.nf b/modules/nf-core/modules/chromap/index/main.nf new file mode 100644 index 000000000..cafeca2fb --- /dev/null +++ b/modules/nf-core/modules/chromap/index/main.nf @@ -0,0 +1,36 @@ +def VERSION = '0.1' // Version information not provided by tool on CLI + +process CHROMAP_INDEX { + tag '$fasta' + label 'process_medium' + + conda (params.enable_conda ? "bioconda::chromap=0.1 bioconda::samtools=1.13" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' : + 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' }" + + input: + path fasta + + output: + path "*.index" , emit: index + path "versions.yml", emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = fasta.baseName + """ + chromap \\ + -i \\ + $args \\ + -t $task.cpus \\ + -r $fasta \\ + -o ${prefix}.index + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: $VERSION + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/chromap/index/meta.yml b/modules/nf-core/modules/chromap/index/meta.yml new file mode 100644 index 000000000..a6a18fe9d --- /dev/null +++ b/modules/nf-core/modules/chromap/index/meta.yml @@ -0,0 +1,33 @@ +name: chromap_index +description: Indexes a fasta reference genome ready for chromatin profiling. +keywords: + - index + - fasta + - genome + - reference +tools: + - chromap: + description: Fast alignment and preprocessing of chromatin profiles + homepage: https://github.com/haowenz/chromap + documentation: https://github.com/haowenz/chromap + tool_dev_url: https://github.com/haowenz/chromap + doi: "" + licence: ['GPL v3'] + +input: + - fasta: + type: file + description: Fasta reference file. + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - index: + type: file + description: Index file of the reference genome + pattern: "*.{index}" + +authors: + - "@mahesh-panchal" From f747b688c769c7700bcf219aaeb8ee7a7c720937 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 17 Jan 2022 18:15:46 +0100 Subject: [PATCH 285/538] Draft implementation of multiple aligner, add chromap add --- conf/modules.config | 50 +++++++++++++++++++++ nextflow.config | 3 +- subworkflows/local/prepare_genome.nf | 52 ++++++++++++++++------ subworkflows/nf-core/align_chromap.nf | 38 ++++++++++++++++ workflows/chipseq.nf | 64 +++++++++++++++++++++------ 5 files changed, 178 insertions(+), 29 deletions(-) create mode 100644 subworkflows/nf-core/align_chromap.nf diff --git a/conf/modules.config b/conf/modules.config index f1d851233..97e6ee474 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -193,6 +193,56 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } +} + +process { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/chromap/library" }, + mode: 'copy', + pattern: "*.bam", + enabled: params.save_align_intermeds + ] + } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + // ext.args = params.bam_csi_index ? '-c' : '' + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/chromap/library" }, + mode: 'copy', + pattern: '*.{bai,csi}', + enabled: params.save_align_intermeds + ] + } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { + // TODO: substitute by this line when multiple aligners are implemented + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_STATS' { + // ext.args = params.bam_csi_index ? '-c' : '' + ext.prefix = { "${meta.id}.Lb.sorted" } + publishDir = [ + path: { "${params.outdir}/chromap/library" }, + mode: 'copy', + pattern: "*.{stats,flagstat,idxstats}", + enabled: params.save_align_intermeds + ] + } + withName: CHROMAP_CHROMAP { + ext.args = '--preset chip' + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/chromap/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +process { withName: PICARD_MERGESAMFILES { ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.sorted" } diff --git a/nextflow.config b/nextflow.config index 2b0941719..8f8157fc7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -29,7 +29,8 @@ params { skip_trimming = false save_trimmed = false - // Options: Alignments + // Options: Alignment + aligner = 'bwa' bwa_min_score = null keep_dups = false keep_multi_map = false diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index afdddc49e..fe89b57c0 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -12,11 +12,14 @@ include { UNTAR } from '../../modules/nf-core/modules/untar/main' include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' +include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/index/main' include { GTF2BED } from '../../modules/local/gtf2bed' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' workflow PREPARE_GENOME { + take: + prepare_tool_index // string : tool to prepare index for main: @@ -112,25 +115,46 @@ workflow PREPARE_GENOME { // Uncompress BWA index or generate from scratch if required // ch_bwa_index = Channel.empty() - if (params.bwa_index) { - if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR ( params.bwa_index ).untar - ch_versions = ch_versions.mix(UNTAR.out.versions) + if (prepare_tool_index == 'bwa') { + if (params.bwa_index) { + if (params.bwa_index.endsWith('.tar.gz')) { + ch_bwa_index = UNTAR ( params.bwa_index ).untar + ch_versions = ch_versions.mix(UNTAR.out.versions) + } else { + ch_bwa_index = file(params.bwa_index) + } } else { - ch_bwa_index = file(params.bwa_index) + ch_bwa_index = BWA_INDEX ( ch_fasta ).index + ch_versions = ch_versions.mix(BWA_INDEX.out.versions) + } + } + + // + // Uncompress CHROMAP index or generate from scratch if required + // + ch_chromap_index = Channel.empty() + if (prepare_tool_index == 'chromap') { + if (params.chromap_index) { + if (params.chromap_index.endsWith('.tar.gz')) { + ch_bwa_index = UNTAR ( params.chromap_index ).untar + ch_versions = ch_versions.mix(UNTAR.out.versions) + } else { + ch_chromap_index = file(params.chromap_index) + } + } else { + ch_chromap_index = CHROMAP_INDEX ( ch_fasta ).index + ch_versions = ch_versions.mix(CHROMAP_INDEX.out.versions) } - } else { - ch_bwa_index = BWA_INDEX ( ch_fasta ).index - ch_versions = ch_versions.mix(BWA_INDEX.out.versions) } emit: - fasta = ch_fasta // path: genome.fasta - gtf = ch_gtf // path: genome.gtf - gene_bed = ch_gene_bed // path: gene.bed - chrom_sizes = ch_chrom_sizes // path: genome.sizes - blacklist = ch_blacklist // path: blacklist.bed - bwa_index = ch_bwa_index // path: bbsplit/index/ + fasta = ch_fasta // path: genome.fasta + gtf = ch_gtf // path: genome.gtf + gene_bed = ch_gene_bed // path: gene.bed + chrom_sizes = ch_chrom_sizes // path: genome.sizes + blacklist = ch_blacklist // path: blacklist.bed + bwa_index = ch_bwa_index // path: bwa/index/ + chromap_index = ch_chromap_index // path: genome.index versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/align_chromap.nf b/subworkflows/nf-core/align_chromap.nf new file mode 100644 index 000000000..5afa99bc2 --- /dev/null +++ b/subworkflows/nf-core/align_chromap.nf @@ -0,0 +1,38 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { CHROMAP_CHROMAP } from '../../modules/nf-core/modules/chromap/chromap/main' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow ALIGN_CHROMAP { + take: + reads // channel: [ val(meta), [ reads ] ] + index // path: /path/to/index + fasta // path: /path/to/fasta + + main: + + ch_versions = Channel.empty() + + // + // Map reads with CHROMAP + // + CHROMAP_CHROMAP(reads, fasta, index, [], [], [], []) + ch_versions = ch_versions.mix(CHROMAP_CHROMAP.out.versions.first()) + + // + // Sort, index BAM file and run samtools stats, flagstat and idxstats + // + BAM_SORT_SAMTOOLS(CHROMAP_CHROMAP.out.bam) + ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first()) + + emit: + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // path: versions.yml +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index e095352ff..a483b562c 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -4,10 +4,15 @@ ======================================================================================== */ +def valid_params = [ + aligners : [ 'bwa', 'chromap' ] +] + def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters WorkflowChipseq.initialise(params, log) +// WorkflowChipseq.initialise(params, log, valid_params) // Check input path parameters to see if they exist def checkPathParamList = [ @@ -23,6 +28,10 @@ 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!' } +// Check alignment parameters +def prepareToolIndices = [] +// if (!params.skip_alignment) { prepareToolIndices << params.aligner } //DEL + // Save AWS IGenomes file containing annotation version def anno_readme = params.genomes[ params.genome ]?.readme if (anno_readme && file(anno_readme).exists()) { @@ -30,8 +39,6 @@ if (anno_readme && file(anno_readme).exists()) { file(anno_readme).copyTo("${params.outdir}/genome/") } -// def peakType = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - /* ======================================================================================== CONFIG FILES @@ -111,6 +118,7 @@ include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../module include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' +include { ALIGN_CHROMAP } from '../subworkflows/nf-core/align_chromap' include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' /* @@ -129,7 +137,9 @@ workflow CHIPSEQ { // // SUBWORKFLOW: Uncompress and prepare reference genome files // - PREPARE_GENOME () + PREPARE_GENOME ( + params.aligner + ) ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions) // @@ -151,21 +161,47 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) + + // // SUBWORKFLOW: Map reads & BAM QC // - ALIGN_BWA_MEM ( - FASTQC_TRIMGALORE.out.reads, - PREPARE_GENOME.out.bwa_index - ) - ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) + ch_genome_bam = Channel.empty() + ch_genome_bam_index = Channel.empty() + ch_samtools_stats = Channel.empty() + ch_samtools_flagstat = Channel.empty() + ch_samtools_idxstats = Channel.empty() + if (params.aligner == 'bwa') { + ALIGN_BWA_MEM ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.bwa_index + ) + ch_genome_bam = ALIGN_BWA_MEM.out.bam + ch_genome_bam_index = ALIGN_BWA_MEM.out.bai + ch_samtools_stats = ALIGN_BWA_MEM.out.stats + ch_samtools_flagstat = ALIGN_BWA_MEM.out.flagstat + ch_samtools_idxstats = ALIGN_BWA_MEM.out.idxstats + ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) + } + + if (params.aligner == 'chromap') { + ALIGN_CHROMAP ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.chromap_index, + PREPARE_GENOME.out.fasta + ) + ch_genome_bam = ALIGN_CHROMAP.out.bam + ch_genome_bam_index = ALIGN_CHROMAP.out.bai + ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) + } // // SUBWORKFLOW: Merge resequenced BAM files // - ALIGN_BWA_MEM - .out - .bam + // ALIGN_BWA_MEM //DEL + ch_genome_bam + // .out //DEL + // .bam //DEL .map { meta, bam -> fmeta = meta.findAll { it.key != 'read_group' } @@ -502,9 +538,9 @@ workflow CHIPSEQ { FASTQC_TRIMGALORE.out.trim_zip.collect{it[1]}.ifEmpty([]), FASTQC_TRIMGALORE.out.trim_log.collect{it[1]}.ifEmpty([]), - ALIGN_BWA_MEM.out.stats.collect{it[1]}, - ALIGN_BWA_MEM.out.flagstat.collect{it[1]}, - ALIGN_BWA_MEM.out.idxstats.collect{it[1]}, + ch_samtools_stats.collect{it[1]}.ifEmpty([]), + ch_samtools_flagstat.collect{it[1]}.ifEmpty([]), + ch_samtools_idxstats.collect{it[1]}.ifEmpty([]), MARK_DUPLICATES_PICARD.out.stats.collect{it[1]}.ifEmpty([]), MARK_DUPLICATES_PICARD.out.flagstat.collect{it[1]}.ifEmpty([]), From cb60c2ce56b2707d544a0e44eb0744e91c055f81 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 18 Jan 2022 23:30:04 +0100 Subject: [PATCH 286/538] Add bowtie/align module --- modules/nf-core/modules/bowtie2/align/main.nf | 74 +++++++++++++++++++ .../nf-core/modules/bowtie2/align/meta.yml | 51 +++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 modules/nf-core/modules/bowtie2/align/main.nf create mode 100644 modules/nf-core/modules/bowtie2/align/meta.yml diff --git a/modules/nf-core/modules/bowtie2/align/main.nf b/modules/nf-core/modules/bowtie2/align/main.nf new file mode 100644 index 000000000..20b08f721 --- /dev/null +++ b/modules/nf-core/modules/bowtie2/align/main.nf @@ -0,0 +1,74 @@ +process BOWTIE2_ALIGN { + tag "$meta.id" + label 'process_high' + + conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4 bioconda::samtools=1.14 conda-forge::pigz=2.6' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:4d235f41348a00533f18e47c9669f1ecb327f629-0' : + 'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:4d235f41348a00533f18e47c9669f1ecb327f629-0' }" + + input: + tuple val(meta), path(reads) + path index + val save_unaligned + + output: + tuple val(meta), path('*.bam') , emit: bam + tuple val(meta), path('*.log') , emit: log + tuple val(meta), path('*fastq.gz'), emit: fastq, optional:true + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + if (meta.single_end) { + def unaligned = save_unaligned ? "--un-gz ${prefix}.unmapped.fastq.gz" : '' + """ + INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'` + bowtie2 \\ + -x \$INDEX \\ + -U $reads \\ + --threads $task.cpus \\ + $unaligned \\ + $args \\ + 2> ${prefix}.bowtie2.log \\ + | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam - + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ + } else { + def unaligned = save_unaligned ? "--un-conc-gz ${prefix}.unmapped.fastq.gz" : '' + """ + INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'` + bowtie2 \\ + -x \$INDEX \\ + -1 ${reads[0]} \\ + -2 ${reads[1]} \\ + --threads $task.cpus \\ + $unaligned \\ + $args \\ + 2> ${prefix}.bowtie2.log \\ + | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam - + + if [ -f ${prefix}.unmapped.fastq.1.gz ]; then + mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz + fi + if [ -f ${prefix}.unmapped.fastq.2.gz ]; then + mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ + } +} diff --git a/modules/nf-core/modules/bowtie2/align/meta.yml b/modules/nf-core/modules/bowtie2/align/meta.yml new file mode 100644 index 000000000..77c9e3970 --- /dev/null +++ b/modules/nf-core/modules/bowtie2/align/meta.yml @@ -0,0 +1,51 @@ +name: bowtie2_align +description: Align reads to a reference genome using bowtie2 +keywords: + - align + - fasta + - genome + - reference +tools: + - bowtie2: + description: | + Bowtie 2 is an ultrafast and memory-efficient tool for aligning + sequencing reads to long reference sequences. + homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml + documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml + doi: 10.1038/nmeth.1923 + licence: ['GPL-3.0-or-later'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: file + description: Bowtie2 genome index files + pattern: "*.ebwt" +output: + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - fastq: + type: file + description: Unaligned FastQ files + pattern: "*.fastq.gz" + - log: + type: file + description: Aligment log + pattern: "*.log" +authors: + - "@joseespinosa" + - "@drpatelh" From 1ac2e936969d717089b3b01c94ba668b721e6074 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 18 Jan 2022 23:30:22 +0100 Subject: [PATCH 287/538] Add bowtie/build module --- modules.json | 6 ++++ modules/nf-core/modules/bowtie2/build/main.nf | 27 +++++++++++++++ .../nf-core/modules/bowtie2/build/meta.yml | 33 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 modules/nf-core/modules/bowtie2/build/main.nf create mode 100644 modules/nf-core/modules/bowtie2/build/meta.yml diff --git a/modules.json b/modules.json index 06340876b..d247eaf43 100644 --- a/modules.json +++ b/modules.json @@ -3,6 +3,12 @@ "homePage": "https://github.com/nf-core/chipseq", "repos": { "nf-core/modules": { + "bowtie2/align": { + "git_sha": "3f9a0285816a2e0ae73a3875fb5ae4b409da5952" + }, + "bowtie2/build": { + "git_sha": "e3285528aca2733ff2d544cb5e5fcc34599226f3" + }, "bwa/index": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/bowtie2/build/main.nf b/modules/nf-core/modules/bowtie2/build/main.nf new file mode 100644 index 000000000..da2e9ed52 --- /dev/null +++ b/modules/nf-core/modules/bowtie2/build/main.nf @@ -0,0 +1,27 @@ +process BOWTIE2_BUILD { + tag "$fasta" + label 'process_high' + + conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bowtie2:2.4.4--py39hbb4e92a_0' : + 'quay.io/biocontainers/bowtie2:2.4.4--py39hbb4e92a_0' }" + + input: + path fasta + + output: + path 'bowtie2' , emit: index + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + """ + mkdir bowtie2 + bowtie2-build $args --threads $task.cpus $fasta bowtie2/${fasta.baseName} + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/bowtie2/build/meta.yml b/modules/nf-core/modules/bowtie2/build/meta.yml new file mode 100644 index 000000000..ecc54e9b0 --- /dev/null +++ b/modules/nf-core/modules/bowtie2/build/meta.yml @@ -0,0 +1,33 @@ +name: bowtie2_build +description: Builds bowtie index for reference genome +keywords: + - build + - index + - fasta + - genome + - reference +tools: + - bowtie2: + description: | + Bowtie 2 is an ultrafast and memory-efficient tool for aligning + sequencing reads to long reference sequences. + homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml + documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml + doi: 10.1038/nmeth.1923 + licence: ['GPL-3.0-or-later'] +input: + - fasta: + type: file + description: Input genome fasta file +output: + - index: + type: file + description: Bowtie2 genome index files + pattern: "*.bt2" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" From 74e014899dbde7ba0ffe4b6da75fc7eb70b14d96 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 18 Jan 2022 23:30:52 +0100 Subject: [PATCH 288/538] Add bowtie2 as aligner --- conf/modules.config | 132 ++++++++++++-------------- main.nf | 16 ++-- subworkflows/local/prepare_genome.nf | 22 ++++- subworkflows/nf-core/align_bowtie2.nf | 38 ++++++++ workflows/chipseq.nf | 24 ++++- 5 files changed, 149 insertions(+), 83 deletions(-) create mode 100644 subworkflows/nf-core/align_bowtie2.nf diff --git a/conf/modules.config b/conf/modules.config index 97e6ee474..ebf071458 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -60,14 +60,6 @@ process { enabled: params.save_reference ] } - withName: BWA_INDEX { - ext.args = '-a bwtsw' - publishDir = [ - path: { "${params.outdir}/genome/index" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } withName: GFFREAD { ext.args = '--keep-exon-attrs -F -T' publishDir = [ @@ -145,9 +137,7 @@ if (!params.skip_trimming) { } process { - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/bwa/library" }, @@ -156,9 +146,7 @@ process { enabled: params.save_align_intermeds ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { // ext.args = params.bam_csi_index ? '-c' : '' ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ @@ -168,9 +156,7 @@ process { enabled: params.save_align_intermeds ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_BWA_MEM:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_STATS' { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_STATS' { // ext.args = params.bam_csi_index ? '-c' : '' ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ @@ -180,65 +166,67 @@ process { enabled: params.save_align_intermeds ] } - withName: BWA_MEM { - ext.args = [ - '-M', - params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - ].join(' ').trim() - ext.args2 = '-h -F 0x0100 -O BAM' - ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/bwa/library" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } } -process { - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { - ext.prefix = { "${meta.id}.Lb.sorted" } - publishDir = [ - path: { "${params.outdir}/chromap/library" }, - mode: 'copy', - pattern: "*.bam", - enabled: params.save_align_intermeds - ] - } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - // ext.args = params.bam_csi_index ? '-c' : '' - ext.prefix = { "${meta.id}.Lb.sorted" } - publishDir = [ - path: { "${params.outdir}/chromap/library" }, - mode: 'copy', - pattern: '*.{bai,csi}', - enabled: params.save_align_intermeds - ] +if (params.aligner == 'bwa') { + process { + withName: BWA_INDEX { + ext.args = '-a bwtsw' + publishDir = [ + path: { "${params.outdir}/genome/${params.aligner}/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: BWA_MEM { + ext.args = [ + '-M', + params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' + ].join(' ').trim() + ext.args2 = '-h -F 0x0100 -O BAM' + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_CHROMAP:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - // TODO: substitute by this line when multiple aligners are implemented - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_STATS' { - // ext.args = params.bam_csi_index ? '-c' : '' - ext.prefix = { "${meta.id}.Lb.sorted" } - publishDir = [ - path: { "${params.outdir}/chromap/library" }, - mode: 'copy', - pattern: "*.{stats,flagstat,idxstats}", - enabled: params.save_align_intermeds - ] +} + +if (params.aligner == 'bowtie2') { + process { + withName: BOWTIE2_BUILD { + ext.args = '' + publishDir = [ + path: { "${params.outdir}/genome/${params.aligner}/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: BOWTIE2_ALIGN { + ext.args = '' + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - withName: CHROMAP_CHROMAP { - ext.args = '--preset chip' - ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/chromap/library" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] +} + +if (params.aligner == 'chromap') { + process { + withName: CHROMAP_CHROMAP { + ext.args = '--preset chip' + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } } diff --git a/main.nf b/main.nf index f2fe7440c..2ef142eea 100755 --- a/main.nf +++ b/main.nf @@ -17,13 +17,15 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') -params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') -params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') -params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') -params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') -params.macs_gsize = WorkflowMain.getGenomeAttribute(params, 'macs_gsize') -params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') +params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') +params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') +params.bowtie2_index = WorkflowMain.getGenomeAttribute(params, 'bowtie2') +params.chromap_index = WorkflowMain.getGenomeAttribute(params, 'chromap') +params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') +params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') +params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') +params.macs_gsize = WorkflowMain.getGenomeAttribute(params, 'macs_gsize') +params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') /* ======================================================================================== diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index fe89b57c0..84ee83f22 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -12,6 +12,7 @@ include { UNTAR } from '../../modules/nf-core/modules/untar/main' include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' +include { BOWTIE2_BUILD } from '../../modules/nf-core/modules/bowtie2/build/main' include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/index/main' include { GTF2BED } from '../../modules/local/gtf2bed' @@ -129,6 +130,24 @@ workflow PREPARE_GENOME { } } + // + // Uncompress Bowtie2 index or generate from scratch if required + // + ch_bowtie2_index = Channel.empty() + if (prepare_tool_index == 'bowtie2') { + if (params.bowtie2_index) { + if (params.bowtie2_index.endsWith('.tar.gz')) { + ch_bowtie2_index = UNTAR ( params.bowtie2_index ).untar + ch_versions = ch_versions.mix(UNTAR.out.versions) + } else { + ch_bowtie2_index = file(params.bowtie2_index) + } + } else { + ch_bowtie2_index = BOWTIE2_BUILD ( ch_fasta ).index + ch_versions = ch_versions.mix(BOWTIE2_BUILD.out.versions) + } + } + // // Uncompress CHROMAP index or generate from scratch if required // @@ -136,7 +155,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'chromap') { if (params.chromap_index) { if (params.chromap_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR ( params.chromap_index ).untar + ch_chromap_index = UNTAR ( params.chromap_index ).untar ch_versions = ch_versions.mix(UNTAR.out.versions) } else { ch_chromap_index = file(params.chromap_index) @@ -154,6 +173,7 @@ workflow PREPARE_GENOME { chrom_sizes = ch_chrom_sizes // path: genome.sizes blacklist = ch_blacklist // path: blacklist.bed bwa_index = ch_bwa_index // path: bwa/index/ + bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ chromap_index = ch_chromap_index // path: genome.index versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] diff --git a/subworkflows/nf-core/align_bowtie2.nf b/subworkflows/nf-core/align_bowtie2.nf new file mode 100644 index 000000000..bb0888f3c --- /dev/null +++ b/subworkflows/nf-core/align_bowtie2.nf @@ -0,0 +1,38 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { BOWTIE2_ALIGN } from '../../modules/nf-core/modules/bowtie2/align/main' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow ALIGN_BOWTIE2 { + take: + reads // channel: [ val(meta), [ reads ] ] + index // path: /path/to/index + save_unaligned // boolean: true/false + + main: + + ch_versions = Channel.empty() + + // + // Map reads with BWA + // + BOWTIE2_ALIGN(reads, index, save_unaligned) + ch_versions = ch_versions.mix(BOWTIE2_ALIGN.out.versions.first()) + + // + // Sort, index BAM file and run samtools stats, flagstat and idxstats + // + BAM_SORT_SAMTOOLS(BOWTIE2_ALIGN.out.bam) + ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first()) + + emit: + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // path: versions.yml +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index a483b562c..b6375d6b5 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -5,21 +5,21 @@ */ def valid_params = [ - aligners : [ 'bwa', 'chromap' ] + aligners : [ 'bwa', 'bowtie2', 'chromap' ] ] def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters WorkflowChipseq.initialise(params, log) -// WorkflowChipseq.initialise(params, log, valid_params) +// WorkflowChipseq.initialise(params, log, valid_params) //TODO include valid_params // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, params.gtf, params.gff, params.gene_bed, - params.bwa_index, + params.bwa_index, //TODO change now more aligners params.blacklist, params.bamtools_filter_pe_config, params.bamtools_filter_se_config ] @@ -119,6 +119,7 @@ include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../module include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' include { ALIGN_CHROMAP } from '../subworkflows/nf-core/align_chromap' +include { ALIGN_BOWTIE2 } from '../subworkflows/nf-core/align_bowtie2' include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' /* @@ -183,6 +184,20 @@ workflow CHIPSEQ { ch_samtools_idxstats = ALIGN_BWA_MEM.out.idxstats ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) } + params.save_unaligned = false + if (params.aligner == 'bowtie2') { + ALIGN_BOWTIE2 ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.bowtie2_index, + params.save_unaligned + ) + ch_genome_bam = ALIGN_BOWTIE2.out.bam + ch_genome_bam_index = ALIGN_BOWTIE2.out.bai + ch_samtools_stats = ALIGN_BOWTIE2.out.stats + ch_samtools_flagstat = ALIGN_BOWTIE2.out.flagstat + ch_samtools_idxstats = ALIGN_BOWTIE2.out.idxstats + ch_versions = ch_versions.mix(ALIGN_BOWTIE2.out.versions.first()) + } if (params.aligner == 'chromap') { ALIGN_CHROMAP ( @@ -192,6 +207,9 @@ workflow CHIPSEQ { ) ch_genome_bam = ALIGN_CHROMAP.out.bam ch_genome_bam_index = ALIGN_CHROMAP.out.bai + // ch_samtools_stats = ALIGN_CHROMAP.out.stats //TODO + // ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat + // ch_samtools_idxstats = ALIGN_CHROMAP.out.idxstats ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) } From 52f127fbf545e4678d1bdad47d5d663c802e7850 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 19 Jan 2022 11:33:48 +0100 Subject: [PATCH 289/538] Adding star/genomegenerate module --- modules.json | 3 + .../modules/star/genomegenerate/main.nf | 66 +++++++++++++++++++ .../modules/star/genomegenerate/meta.yml | 37 +++++++++++ 3 files changed, 106 insertions(+) create mode 100644 modules/nf-core/modules/star/genomegenerate/main.nf create mode 100644 modules/nf-core/modules/star/genomegenerate/meta.yml diff --git a/modules.json b/modules.json index d247eaf43..9286e6370 100644 --- a/modules.json +++ b/modules.json @@ -87,6 +87,9 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "star/genomegenerate": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "subread/featurecounts": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/nf-core/modules/star/genomegenerate/main.nf b/modules/nf-core/modules/star/genomegenerate/main.nf new file mode 100644 index 000000000..ad32c0dd8 --- /dev/null +++ b/modules/nf-core/modules/star/genomegenerate/main.nf @@ -0,0 +1,66 @@ +process STAR_GENOMEGENERATE { + tag "$fasta" + label 'process_high' + + // Note: 2.7X indices incompatible with AWS iGenomes. + conda (params.enable_conda ? "bioconda::star=2.7.9a bioconda::samtools=1.13 conda-forge::gawk=5.1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:a7908dfb0485a80ca94e4d17b0ac991532e4e989-0' : + 'quay.io/biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:a7908dfb0485a80ca94e4d17b0ac991532e4e989-0' }" + + input: + path fasta + path gtf + + output: + path "star" , emit: index + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def args_list = args.tokenize() + def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' + if (args_list.contains('--genomeSAindexNbases')) { + """ + mkdir star + STAR \\ + --runMode genomeGenerate \\ + --genomeDir star/ \\ + --genomeFastaFiles $fasta \\ + --sjdbGTFfile $gtf \\ + --runThreadN $task.cpus \\ + $memory \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } else { + """ + samtools faidx $fasta + NUM_BASES=`gawk '{sum = sum + \$2}END{if ((log(sum)/log(2))/2 - 1 > 14) {printf "%.0f", 14} else {printf "%.0f", (log(sum)/log(2))/2 - 1}}' ${fasta}.fai` + + mkdir star + STAR \\ + --runMode genomeGenerate \\ + --genomeDir star/ \\ + --genomeFastaFiles $fasta \\ + --sjdbGTFfile $gtf \\ + --runThreadN $task.cpus \\ + --genomeSAindexNbases \$NUM_BASES \\ + $memory \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + } +} diff --git a/modules/nf-core/modules/star/genomegenerate/meta.yml b/modules/nf-core/modules/star/genomegenerate/meta.yml new file mode 100644 index 000000000..04ade1957 --- /dev/null +++ b/modules/nf-core/modules/star/genomegenerate/meta.yml @@ -0,0 +1,37 @@ +name: star_genomegenerate +description: Create index for STAR +keywords: + - index + - fasta + - genome + - reference +tools: + - star: + description: | + STAR is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: https://github.com/alexdobin/STAR + manual: https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf + doi: 10.1093/bioinformatics/bts635 + licence: ['MIT'] +input: + - fasta: + type: file + description: Fasta file of the reference genome + - gtf: + type: file + description: GTF file of the reference genome + +output: + - index: + type: directory + description: Folder containing the star index files + pattern: "star" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@kevinmenden" + - "@drpatelh" From 71cfadba5dec780501cbe3468a32fe98161a8e37 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 19 Jan 2022 11:35:11 +0100 Subject: [PATCH 290/538] Adding star/align module --- modules.json | 3 + modules/nf-core/modules/star/align/main.nf | 68 +++++++++++++++++ modules/nf-core/modules/star/align/meta.yml | 81 +++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 modules/nf-core/modules/star/align/main.nf create mode 100644 modules/nf-core/modules/star/align/meta.yml diff --git a/modules.json b/modules.json index 9286e6370..9da79a53c 100644 --- a/modules.json +++ b/modules.json @@ -87,6 +87,9 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, + "star/align": { + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + }, "star/genomegenerate": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/star/align/main.nf b/modules/nf-core/modules/star/align/main.nf new file mode 100644 index 000000000..9725496fd --- /dev/null +++ b/modules/nf-core/modules/star/align/main.nf @@ -0,0 +1,68 @@ +process STAR_ALIGN { + tag "$meta.id" + label 'process_high' + + // Note: 2.7X indices incompatible with AWS iGenomes. + conda (params.enable_conda ? 'bioconda::star=2.7.9a' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/star:2.7.9a--h9ee0642_0' : + 'quay.io/biocontainers/star:2.7.9a--h9ee0642_0' }" + + input: + tuple val(meta), path(reads) + path index + path gtf + val star_ignore_sjdbgtf + val seq_platform + val seq_center + + output: + tuple val(meta), path('*d.out.bam') , emit: bam + tuple val(meta), path('*Log.final.out') , emit: log_final + tuple val(meta), path('*Log.out') , emit: log_out + tuple val(meta), path('*Log.progress.out'), emit: log_progress + path "versions.yml" , emit: versions + + tuple val(meta), path('*sortedByCoord.out.bam') , optional:true, emit: bam_sorted + tuple val(meta), path('*toTranscriptome.out.bam'), optional:true, emit: bam_transcript + tuple val(meta), path('*Aligned.unsort.out.bam') , optional:true, emit: bam_unsorted + tuple val(meta), path('*fastq.gz') , optional:true, emit: fastq + tuple val(meta), path('*.tab') , optional:true, emit: tab + tuple val(meta), path('*.out.junction') , optional:true, emit: junction + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def ignore_gtf = star_ignore_sjdbgtf ? '' : "--sjdbGTFfile $gtf" + def seq_platform = seq_platform ? "'PL:$seq_platform'" : "" + def seq_center = seq_center ? "--outSAMattrRGline ID:$prefix 'CN:$seq_center' 'SM:$prefix' $seq_platform " : "--outSAMattrRGline ID:$prefix 'SM:$prefix' $seq_platform " + def out_sam_type = (args.contains('--outSAMtype')) ? '' : '--outSAMtype BAM Unsorted' + def mv_unsorted_bam = (args.contains('--outSAMtype BAM Unsorted SortedByCoordinate')) ? "mv ${prefix}.Aligned.out.bam ${prefix}.Aligned.unsort.out.bam" : '' + """ + STAR \\ + --genomeDir $index \\ + --readFilesIn $reads \\ + --runThreadN $task.cpus \\ + --outFileNamePrefix $prefix. \\ + $out_sam_type \\ + $ignore_gtf \\ + $seq_center \\ + $args + + $mv_unsorted_bam + + if [ -f ${prefix}.Unmapped.out.mate1 ]; then + mv ${prefix}.Unmapped.out.mate1 ${prefix}.unmapped_1.fastq + gzip ${prefix}.unmapped_1.fastq + fi + if [ -f ${prefix}.Unmapped.out.mate2 ]; then + mv ${prefix}.Unmapped.out.mate2 ${prefix}.unmapped_2.fastq + gzip ${prefix}.unmapped_2.fastq + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + star: \$(STAR --version | sed -e "s/STAR_//g") + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/star/align/meta.yml b/modules/nf-core/modules/star/align/meta.yml new file mode 100644 index 000000000..2d78b81ae --- /dev/null +++ b/modules/nf-core/modules/star/align/meta.yml @@ -0,0 +1,81 @@ +name: star_align +description: Align reads to a reference genome using STAR +keywords: + - align + - fasta + - genome + - reference +tools: + - star: + description: | + STAR is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: https://github.com/alexdobin/STAR + manual: https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf + doi: 10.1093/bioinformatics/bts635 + licence: ['MIT'] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: directory + description: STAR genome index + pattern: "star" +output: + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - log_final: + type: file + description: STAR final log file + pattern: "*Log.final.out" + - log_out: + type: file + description: STAR lot out file + pattern: "*Log.out" + - log_progress: + type: file + description: STAR log progress file + pattern: "*Log.progress.out" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bam_sorted: + type: file + description: Sorted BAM file of read alignments (optional) + pattern: "*sortedByCoord.out.bam" + - bam_transcript: + type: file + description: Output BAM file of transcriptome alignment (optional) + pattern: "*toTranscriptome.out.bam" + - bam_unsorted: + type: file + description: Unsorted BAM file of read alignments (optional) + pattern: "*Aligned.unsort.out.bam" + - fastq: + type: file + description: Unmapped FastQ files (optional) + pattern: "*fastq.gz" + - tab: + type: file + description: STAR output tab file(s) (optional) + pattern: "*.tab" + - junction: + type: file + description: STAR chimeric junction output file (optional) + pattern: "*.out.junction" + +authors: + - "@kevinmenden" + - "@drpatelh" + - "@praveenraj2018" From 5e280431bb75fbe4c5fcd00ce74c4a3a1394b492 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 19 Jan 2022 14:38:51 +0100 Subject: [PATCH 291/538] Create star modules locally since the version in modules does not work with igenomes --- modules.json | 6 -- .../align/main.nf => local/star_align.nf} | 19 ++--- .../main.nf => local/star_genomegenerate.nf} | 0 modules/nf-core/modules/star/align/meta.yml | 81 ------------------- .../modules/star/genomegenerate/meta.yml | 37 --------- 5 files changed, 7 insertions(+), 136 deletions(-) rename modules/{nf-core/modules/star/align/main.nf => local/star_align.nf} (70%) rename modules/{nf-core/modules/star/genomegenerate/main.nf => local/star_genomegenerate.nf} (100%) delete mode 100644 modules/nf-core/modules/star/align/meta.yml delete mode 100644 modules/nf-core/modules/star/genomegenerate/meta.yml diff --git a/modules.json b/modules.json index 9da79a53c..d247eaf43 100644 --- a/modules.json +++ b/modules.json @@ -87,12 +87,6 @@ "samtools/stats": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, - "star/align": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" - }, - "star/genomegenerate": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" - }, "subread/featurecounts": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, diff --git a/modules/nf-core/modules/star/align/main.nf b/modules/local/star_align.nf similarity index 70% rename from modules/nf-core/modules/star/align/main.nf rename to modules/local/star_align.nf index 9725496fd..5a67b1716 100644 --- a/modules/nf-core/modules/star/align/main.nf +++ b/modules/local/star_align.nf @@ -3,40 +3,35 @@ process STAR_ALIGN { label 'process_high' // Note: 2.7X indices incompatible with AWS iGenomes. - conda (params.enable_conda ? 'bioconda::star=2.7.9a' : null) + conda (params.enable_conda ? "bioconda::star=2.6.1d" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/star:2.7.9a--h9ee0642_0' : - 'quay.io/biocontainers/star:2.7.9a--h9ee0642_0' }" + 'https://depot.galaxyproject.org/singularity/star:2.6.1d--0' : + 'quay.io/biocontainers/star:2.6.1d--0' }" input: tuple val(meta), path(reads) path index path gtf - val star_ignore_sjdbgtf - val seq_platform - val seq_center output: tuple val(meta), path('*d.out.bam') , emit: bam tuple val(meta), path('*Log.final.out') , emit: log_final tuple val(meta), path('*Log.out') , emit: log_out tuple val(meta), path('*Log.progress.out'), emit: log_progress - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions tuple val(meta), path('*sortedByCoord.out.bam') , optional:true, emit: bam_sorted tuple val(meta), path('*toTranscriptome.out.bam'), optional:true, emit: bam_transcript tuple val(meta), path('*Aligned.unsort.out.bam') , optional:true, emit: bam_unsorted tuple val(meta), path('*fastq.gz') , optional:true, emit: fastq tuple val(meta), path('*.tab') , optional:true, emit: tab - tuple val(meta), path('*.out.junction') , optional:true, emit: junction script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def ignore_gtf = star_ignore_sjdbgtf ? '' : "--sjdbGTFfile $gtf" - def seq_platform = seq_platform ? "'PL:$seq_platform'" : "" - def seq_center = seq_center ? "--outSAMattrRGline ID:$prefix 'CN:$seq_center' 'SM:$prefix' $seq_platform " : "--outSAMattrRGline ID:$prefix 'SM:$prefix' $seq_platform " - def out_sam_type = (args.contains('--outSAMtype')) ? '' : '--outSAMtype BAM Unsorted' + def ignore_gtf = params.star_ignore_sjdbgtf ? '' : "--sjdbGTFfile $gtf" + def seq_center = params.seq_center ? "--outSAMattrRGline ID:$prefix 'CN:$params.seq_center' 'SM:$prefix'" : "--outSAMattrRGline ID:$prefix 'SM:$prefix'" + def out_sam_type = (args.contains('--outSAMtype')) ? '' : '--outSAMtype BAM Unsorted' def mv_unsorted_bam = (args.contains('--outSAMtype BAM Unsorted SortedByCoordinate')) ? "mv ${prefix}.Aligned.out.bam ${prefix}.Aligned.unsort.out.bam" : '' """ STAR \\ diff --git a/modules/nf-core/modules/star/genomegenerate/main.nf b/modules/local/star_genomegenerate.nf similarity index 100% rename from modules/nf-core/modules/star/genomegenerate/main.nf rename to modules/local/star_genomegenerate.nf diff --git a/modules/nf-core/modules/star/align/meta.yml b/modules/nf-core/modules/star/align/meta.yml deleted file mode 100644 index 2d78b81ae..000000000 --- a/modules/nf-core/modules/star/align/meta.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: star_align -description: Align reads to a reference genome using STAR -keywords: - - align - - fasta - - genome - - reference -tools: - - star: - description: | - STAR is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: https://github.com/alexdobin/STAR - manual: https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf - doi: 10.1093/bioinformatics/bts635 - licence: ['MIT'] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - index: - type: directory - description: STAR genome index - pattern: "star" -output: - - bam: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" - - log_final: - type: file - description: STAR final log file - pattern: "*Log.final.out" - - log_out: - type: file - description: STAR lot out file - pattern: "*Log.out" - - log_progress: - type: file - description: STAR log progress file - pattern: "*Log.progress.out" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bam_sorted: - type: file - description: Sorted BAM file of read alignments (optional) - pattern: "*sortedByCoord.out.bam" - - bam_transcript: - type: file - description: Output BAM file of transcriptome alignment (optional) - pattern: "*toTranscriptome.out.bam" - - bam_unsorted: - type: file - description: Unsorted BAM file of read alignments (optional) - pattern: "*Aligned.unsort.out.bam" - - fastq: - type: file - description: Unmapped FastQ files (optional) - pattern: "*fastq.gz" - - tab: - type: file - description: STAR output tab file(s) (optional) - pattern: "*.tab" - - junction: - type: file - description: STAR chimeric junction output file (optional) - pattern: "*.out.junction" - -authors: - - "@kevinmenden" - - "@drpatelh" - - "@praveenraj2018" diff --git a/modules/nf-core/modules/star/genomegenerate/meta.yml b/modules/nf-core/modules/star/genomegenerate/meta.yml deleted file mode 100644 index 04ade1957..000000000 --- a/modules/nf-core/modules/star/genomegenerate/meta.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: star_genomegenerate -description: Create index for STAR -keywords: - - index - - fasta - - genome - - reference -tools: - - star: - description: | - STAR is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: https://github.com/alexdobin/STAR - manual: https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf - doi: 10.1093/bioinformatics/bts635 - licence: ['MIT'] -input: - - fasta: - type: file - description: Fasta file of the reference genome - - gtf: - type: file - description: GTF file of the reference genome - -output: - - index: - type: directory - description: Folder containing the star index files - pattern: "star" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@kevinmenden" - - "@drpatelh" From 529783ba86b04334c590c6cd0b6d9f2ca50b67ad Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 19 Jan 2022 14:51:58 +0100 Subject: [PATCH 292/538] Add star as aligner --- subworkflows/local/prepare_genome.nf | 20 ++++++++++++ subworkflows/nf-core/align_star.nf | 48 ++++++++++++++++++++++++++++ workflows/chipseq.nf | 22 ++++++++++++- 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 subworkflows/nf-core/align_star.nf diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 84ee83f22..5d27d756b 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -17,6 +17,7 @@ include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/ind include { GTF2BED } from '../../modules/local/gtf2bed' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' +include { STAR_GENOMEGENERATE } from '../../modules/local/star_genomegenerate' workflow PREPARE_GENOME { take: @@ -166,6 +167,24 @@ workflow PREPARE_GENOME { } } + // + // Uncompress STAR index or generate from scratch if required + // + ch_star_index = Channel.empty() + if (prepare_tool_index == 'star') { + if (params.star_index) { + if (params.star_index.endsWith('.tar.gz')) { + ch_star_index = UNTAR_STAR_INDEX ( params.star_index ).untar + ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) + } else { + ch_star_index = file(params.star_index) + } + } else { + ch_star_index = STAR_GENOMEGENERATE ( ch_fasta, ch_gtf ).index + ch_versions = ch_versions.mix(STAR_GENOMEGENERATE.out.versions) + } + } + emit: fasta = ch_fasta // path: genome.fasta gtf = ch_gtf // path: genome.gtf @@ -175,6 +194,7 @@ workflow PREPARE_GENOME { bwa_index = ch_bwa_index // path: bwa/index/ bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ chromap_index = ch_chromap_index // path: genome.index + star_index = ch_chromap_index // path: star/index/ versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/align_star.nf b/subworkflows/nf-core/align_star.nf new file mode 100644 index 000000000..248efe40f --- /dev/null +++ b/subworkflows/nf-core/align_star.nf @@ -0,0 +1,48 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { STAR_ALIGN } from '../../modules/local/star_align' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow ALIGN_STAR { + take: + reads // channel: [ val(meta), [ reads ] ] + index // channel: /path/to/star/index/ + gtf // channel: /path/to/genome.gtf + + main: + + ch_versions = Channel.empty() + + // + // Map reads with STAR + // + STAR_ALIGN ( reads, index, gtf ) + ch_versions = ch_versions.mix(STAR_ALIGN.out.versions.first()) + + // + // Sort, index BAM file and run samtools stats, flagstat and idxstats + // + BAM_SORT_SAMTOOLS ( STAR_ALIGN.out.bam ) + ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions) + + emit: + orig_bam = STAR_ALIGN.out.bam // channel: [ val(meta), bam ] + log_final = STAR_ALIGN.out.log_final // channel: [ val(meta), log_final ] + log_out = STAR_ALIGN.out.log_out // channel: [ val(meta), log_out ] + log_progress = STAR_ALIGN.out.log_progress // channel: [ val(meta), log_progress ] + bam_sorted = STAR_ALIGN.out.bam_sorted // channel: [ val(meta), bam_sorted ] + bam_transcript = STAR_ALIGN.out.bam_transcript // channel: [ val(meta), bam_transcript ] + fastq = STAR_ALIGN.out.fastq // channel: [ val(meta), fastq ] + tab = STAR_ALIGN.out.tab // channel: [ val(meta), tab ] + + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + // csi = BAM_SORT_SAMTOOLS.out.csi // channel: [ val(meta), [ csi ] ] //TODO + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index b6375d6b5..c8cf7bcc7 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -5,7 +5,7 @@ */ def valid_params = [ - aligners : [ 'bwa', 'bowtie2', 'chromap' ] + aligners : [ 'bwa', 'bowtie2', 'chromap', 'star' ] ] def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -120,6 +120,7 @@ include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalo include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' include { ALIGN_CHROMAP } from '../subworkflows/nf-core/align_chromap' include { ALIGN_BOWTIE2 } from '../subworkflows/nf-core/align_bowtie2' +include { ALIGN_STAR } from '../subworkflows/nf-core/align_star' include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' /* @@ -213,6 +214,25 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) } + if (params.aligner == 'star') { + ALIGN_STAR ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.star_index, + params.save_unaligned + ) + ch_genome_bam = ALIGN_STAR.out.bam + ch_genome_bam_index = ALIGN_STAR.out.bai + ch_transcriptome_bam = ALIGN_STAR.out.bam_transcript + ch_samtools_stats = ALIGN_STAR.out.stats + ch_samtools_flagstat = ALIGN_STAR.out.flagstat + ch_samtools_idxstats = ALIGN_STAR.out.idxstats + ch_star_multiqc = ALIGN_STAR.out.log_final // TODO for the rest of aligners + // if (params.bam_csi_index) { //TODO for the rest of aligners + // ch_genome_bam_index = ALIGN_STAR.out.csi + // } + ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) + } + // // SUBWORKFLOW: Merge resequenced BAM files // From 099d982356053770add66ca192c008ed1a2a7536 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 10:17:20 +0100 Subject: [PATCH 293/538] Update nextflow schema with the new indexes --- nextflow_schema.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index dff464078..615de8bbc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -99,6 +99,24 @@ "description": "Full path to directory containing BWA index including base name. i.e. `/path/to/index/genome.fa`.", "fa_icon": "fas fa-bezier-curve" }, + "bowtie2_index": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory or tar.gz archive for pre-built HISAT2 index." + }, + "chromap_index": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory or tar.gz archive for pre-built Chromap index." + }, + "star_index": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory or tar.gz archive for pre-built STAR index." + }, "gene_bed": { "type": "string", "format": "file-path", From 618cef461f52a7a86ed2bf6d79e518ba086cd038 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 10:41:09 +0100 Subject: [PATCH 294/538] Update nextflow_schema with the new index params --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 615de8bbc..fb677cd35 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -96,14 +96,14 @@ }, "bwa_index": { "type": "string", - "description": "Full path to directory containing BWA index including base name. i.e. `/path/to/index/genome.fa`.", + "description": "Path to directory or tar.gz archive for pre-built BWA index.", "fa_icon": "fas fa-bezier-curve" }, "bowtie2_index": { "type": "string", "format": "path", "fa_icon": "fas fa-bezier-curve", - "description": "Path to directory or tar.gz archive for pre-built HISAT2 index." + "description": "Path to directory or tar.gz archive for pre-built Bowtie2 index." }, "chromap_index": { "type": "string", From 573902523413dd8ae2d5bfca1644a3219087e3fc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 10:41:46 +0100 Subject: [PATCH 295/538] Add star to modules config --- conf/modules.config | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index ebf071458..c332fe249 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -218,6 +218,14 @@ if (params.aligner == 'bowtie2') { if (params.aligner == 'chromap') { process { + withName: CHROMAP_INDEX { + ext.args = '' + publishDir = [ + path: { "${params.outdir}/genome/${params.aligner}/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: CHROMAP_CHROMAP { ext.args = '--preset chip' ext.prefix = { "${meta.id}.Lb" } @@ -230,6 +238,48 @@ if (params.aligner == 'chromap') { } } +if (params.aligner == 'star') { + process { + withName: STAR_GENOMEGENERATE { + ext.args = '' + publishDir = [ + path: { "${params.outdir}/genome/${params.aligner}/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:ALIGN_STAR:STAR_ALIGN' { + ext.args = [ + '--outSAMtype BAM Unsorted', + '--readFilesCommand zcat', + '--runRNGseed 0', + // '--outFilterMultimapNmax 20', //DEL + '--outSAMattributes NH HI AS NM MD' + // params.save_unaligned ? '--outReadsUnmapped Fastx' : '' //TODO + ].join(' ').trim() + publishDir = [ + [ + path: { "${params.outdir}/${params.aligner}/log" }, + mode: 'copy', + pattern: '*.{out,tab}' + ], + [ + path: { "${params.outdir}/${params.aligner}" }, + mode: 'copy', + pattern: '*.bam', + // enabled: params.save_align_intermeds //TODO + ], + [ + path: { "${params.outdir}/${params.aligner}/unmapped" }, + mode: 'copy', + pattern: '*.fastq.gz', + // enabled: params.save_unaligned //TODO + ] + ] + } + } +} + process { withName: PICARD_MERGESAMFILES { ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' From ff4dd74c523860f4253ec4f7fdd6b82cc924e877 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 10:45:16 +0100 Subject: [PATCH 296/538] Add check for params.aligner in initialize function --- lib/WorkflowChipseq.groovy | 9 ++++++++- main.nf | 1 + workflows/chipseq.nf | 5 ++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 9c8c46f8c..45d770f8e 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -7,7 +7,7 @@ class WorkflowChipseq { // // Check and validate parameters // - public static void initialise(params, log) { + public static void initialise(params, log, valid_params) { genomeExistsError(params, log) if (!params.fasta) { @@ -27,6 +27,13 @@ class WorkflowChipseq { if (!params.macs_gsize) { macsGsizeWarn(log) } + + if (!params.aligner) { + if (!valid_params['aligners'].contains(params.aligner)) { + log.error "Invalid option: '${params.aligner}'. Valid options for '--aligner': ${valid_params['aligners'].join(', ')}." + System.exit(1) + } + } } // diff --git a/main.nf b/main.nf index 2ef142eea..a1cd575a4 100755 --- a/main.nf +++ b/main.nf @@ -21,6 +21,7 @@ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.bowtie2_index = WorkflowMain.getGenomeAttribute(params, 'bowtie2') params.chromap_index = WorkflowMain.getGenomeAttribute(params, 'chromap') +params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index c8cf7bcc7..843099a25 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -11,15 +11,14 @@ def valid_params = [ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowChipseq.initialise(params, log) -// WorkflowChipseq.initialise(params, log, valid_params) //TODO include valid_params +WorkflowChipseq.initialise(params, log, valid_params) // Check input path parameters to see if they exist def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, params.gtf, params.gff, params.gene_bed, - params.bwa_index, //TODO change now more aligners + params.bwa_index, params.bowtie2_index, params.chromap_index, params.star_index, params.blacklist, params.bamtools_filter_pe_config, params.bamtools_filter_se_config ] From dc96ba2b4fd5c33d96b7f6bdefaa7c5365bda42b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 22:24:28 +0100 Subject: [PATCH 297/538] Update chromap modules --- modules.json | 4 ++-- modules/nf-core/modules/chromap/chromap/main.nf | 16 ++++++++-------- modules/nf-core/modules/chromap/index/main.nf | 12 +++++------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/modules.json b/modules.json index d247eaf43..d509ccc1d 100644 --- a/modules.json +++ b/modules.json @@ -16,10 +16,10 @@ "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "chromap/chromap": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "9573e7e53de808736ab691ed7f4ed3d9758d62b1" }, "chromap/index": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "4e9cc84514651d5c3d5e13c5bd5ef5fc133e3989" }, "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" diff --git a/modules/nf-core/modules/chromap/chromap/main.nf b/modules/nf-core/modules/chromap/chromap/main.nf index 4a7f00974..67384b0ca 100644 --- a/modules/nf-core/modules/chromap/chromap/main.nf +++ b/modules/nf-core/modules/chromap/chromap/main.nf @@ -1,13 +1,11 @@ -def VERSION = '0.1' // Version information not provided by tool on CLI - process CHROMAP_CHROMAP { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::chromap=0.1 bioconda::samtools=1.13" : null) + conda (params.enable_conda ? "bioconda::chromap=0.1.5 bioconda::samtools=1.14" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' : - 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:724a1037d59f6a19c9d4e7bdba77b52b37de0dc3-0' : + 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:724a1037d59f6a19c9d4e7bdba77b52b37de0dc3-0' }" input: tuple val(meta), path(reads) @@ -45,7 +43,7 @@ process CHROMAP_CHROMAP { args_list << "--pairs-natural-chr-order $pairs_chr_order" } def final_args = args_list.join(' ') - def compression_cmds = "gzip ${prefix}.${file_extension}" + def compression_cmds = "gzip -n ${prefix}.${file_extension}" if (args.contains("--SAM")) { compression_cmds = """ samtools view $args2 -@ $task.cpus -bh \\ @@ -67,7 +65,8 @@ process CHROMAP_CHROMAP { cat <<-END_VERSIONS > versions.yml "${task.process}": - chromap: $VERSION + chromap: \$(echo \$(chromap --version 2>&1)) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } else { @@ -85,7 +84,8 @@ process CHROMAP_CHROMAP { cat <<-END_VERSIONS > versions.yml "${task.process}": - chromap: $VERSION + chromap: \$(echo \$(chromap --version 2>&1)) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/nf-core/modules/chromap/index/main.nf b/modules/nf-core/modules/chromap/index/main.nf index cafeca2fb..61bcee108 100644 --- a/modules/nf-core/modules/chromap/index/main.nf +++ b/modules/nf-core/modules/chromap/index/main.nf @@ -1,13 +1,12 @@ -def VERSION = '0.1' // Version information not provided by tool on CLI - process CHROMAP_INDEX { tag '$fasta' label 'process_medium' - conda (params.enable_conda ? "bioconda::chromap=0.1 bioconda::samtools=1.13" : null) + conda (params.enable_conda ? "bioconda::chromap=0.1.5" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' : - 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:2cad7c5aa775241887eff8714259714a39baf016-0' }" + 'https://depot.galaxyproject.org/singularity/chromap:0.1.5--h9a82719_0' : + 'quay.io/biocontainers/chromap:0.1.5--h9a82719_0' }" + input: path fasta @@ -29,8 +28,7 @@ process CHROMAP_INDEX { cat <<-END_VERSIONS > versions.yml "${task.process}": - chromap: $VERSION - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + chromap: \$(echo \$(chromap --version 2>&1)) END_VERSIONS """ } From 9b7a45c91a86d86b4b4ce1d09de236ce52b7761e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 22:35:11 +0100 Subject: [PATCH 298/538] Add save_unaligned parameter --- conf/modules.config | 10 ++++++---- nextflow.config | 1 + nextflow_schema.json | 7 +++++++ workflows/chipseq.nf | 8 ++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c332fe249..54886e794 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -254,8 +254,8 @@ if (params.aligner == 'star') { '--readFilesCommand zcat', '--runRNGseed 0', // '--outFilterMultimapNmax 20', //DEL - '--outSAMattributes NH HI AS NM MD' - // params.save_unaligned ? '--outReadsUnmapped Fastx' : '' //TODO + '--outSAMattributes NH HI AS NM MD', + params.save_unaligned ? '--outReadsUnmapped Fastx' : '' ].join(' ').trim() publishDir = [ [ @@ -267,13 +267,15 @@ if (params.aligner == 'star') { path: { "${params.outdir}/${params.aligner}" }, mode: 'copy', pattern: '*.bam', - // enabled: params.save_align_intermeds //TODO + // TODO + // enabled: params.save_align_intermeds + enabled: false ], [ path: { "${params.outdir}/${params.aligner}/unmapped" }, mode: 'copy', pattern: '*.fastq.gz', - // enabled: params.save_unaligned //TODO + enabled: params.save_unaligned ] ] } diff --git a/nextflow.config b/nextflow.config index 8f8157fc7..d5683b804 100644 --- a/nextflow.config +++ b/nextflow.config @@ -35,6 +35,7 @@ params { keep_dups = false keep_multi_map = false save_align_intermeds = false + save_unaligned = false // Options: Peaks narrow_peak = false diff --git a/nextflow_schema.json b/nextflow_schema.json index fb677cd35..92fbc23b7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -233,6 +233,12 @@ "help_text": "By default, intermediate BAM files will not be saved. The final BAM files created after the appropriate filtering step are always saved to limit storage usage. Set this parameter to also save other intermediate BAM files.", "fa_icon": "fas fa-save" }, + "save_unaligned": { + "type": "boolean", + "fa_icon": "fas fa-save", + "description": "Where possible, save unaligned reads from either STAR, HISAT2 or Salmon to the results directory.", + "help_text": "This may either be in the form of FastQ or BAM files depending on the options available for that particular tool." + }, "bamtools_filter_pe_config": { "type": "string", "default": "$projectDir/assets/bamtools_filter_pe.json", @@ -247,6 +253,7 @@ "description": "BAMTools JSON file with custom filters for single-end data.", "fa_icon": "fas fa-cog" } + } }, "peak_calling_options": { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 843099a25..b4a18c4b0 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -184,7 +184,7 @@ workflow CHIPSEQ { ch_samtools_idxstats = ALIGN_BWA_MEM.out.idxstats ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) } - params.save_unaligned = false + if (params.aligner == 'bowtie2') { ALIGN_BOWTIE2 ( FASTQC_TRIMGALORE.out.reads, @@ -207,9 +207,9 @@ workflow CHIPSEQ { ) ch_genome_bam = ALIGN_CHROMAP.out.bam ch_genome_bam_index = ALIGN_CHROMAP.out.bai - // ch_samtools_stats = ALIGN_CHROMAP.out.stats //TODO - // ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat - // ch_samtools_idxstats = ALIGN_CHROMAP.out.idxstats + ch_samtools_stats = ALIGN_CHROMAP.out.stats //TODO + ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat + ch_samtools_idxstats = ALIGN_CHROMAP.out.idxstats ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) } From 87243d7718648a35e6ae2d5703abddf680631b80 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 20 Jan 2022 22:58:51 +0100 Subject: [PATCH 299/538] Add --SAM argument to chromap --- conf/modules.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 54886e794..d0fab3fe9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -227,7 +227,10 @@ if (params.aligner == 'chromap') { ] } withName: CHROMAP_CHROMAP { - ext.args = '--preset chip' + ext.args = [ + '--preset chip', + '--SAM' + ].join(' ').trim() ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, From a57d582808112bdc26cfa018cf4be8e49ecf3f03 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 21 Jan 2022 10:12:26 +0100 Subject: [PATCH 300/538] Fix typo in checking valid aligners --- lib/WorkflowChipseq.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 45d770f8e..7e3954648 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -28,7 +28,7 @@ class WorkflowChipseq { macsGsizeWarn(log) } - if (!params.aligner) { + if (params.aligner) { if (!valid_params['aligners'].contains(params.aligner)) { log.error "Invalid option: '${params.aligner}'. Valid options for '--aligner': ${valid_params['aligners'].join(', ')}." System.exit(1) From 56b07830029ce5a09b8e6007b1e6d121f43ab67e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 09:33:47 +0100 Subject: [PATCH 301/538] Update star align config --- conf/modules.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d0fab3fe9..3e8edb876 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -253,10 +253,12 @@ if (params.aligner == 'star') { } withName: '.*:ALIGN_STAR:STAR_ALIGN' { ext.args = [ + '--runMode alignReads', + '--alignIntronMax 1', + '--alignEndsType EndToEnd', '--outSAMtype BAM Unsorted', '--readFilesCommand zcat', '--runRNGseed 0', - // '--outFilterMultimapNmax 20', //DEL '--outSAMattributes NH HI AS NM MD', params.save_unaligned ? '--outReadsUnmapped Fastx' : '' ].join(' ').trim() From c2e9e680e165b6bf6b6f6d0db93317cfb5d2d2b2 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 10:10:59 +0100 Subject: [PATCH 302/538] Fix typo in star_index emission --- subworkflows/local/prepare_genome.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 5d27d756b..98da8e23e 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -17,7 +17,7 @@ include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/ind include { GTF2BED } from '../../modules/local/gtf2bed' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' -include { STAR_GENOMEGENERATE } from '../../modules/local/star_genomegenerate' +include { STAR_GENOMEGENERATE } from '../../modules/local/star_genomegenerate' workflow PREPARE_GENOME { take: @@ -194,7 +194,7 @@ workflow PREPARE_GENOME { bwa_index = ch_bwa_index // path: bwa/index/ bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ chromap_index = ch_chromap_index // path: genome.index - star_index = ch_chromap_index // path: star/index/ + star_index = ch_star_index // path: star/index/ versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] } From 8b387ce6d5558044993b089cf7eb9d627f3d3fa1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 11:40:09 +0100 Subject: [PATCH 303/538] Update star modules --- modules/local/star_align.nf | 3 --- modules/local/star_genomegenerate.nf | 28 ++++++++++------------------ workflows/chipseq.nf | 2 +- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/modules/local/star_align.nf b/modules/local/star_align.nf index 5a67b1716..0eef958db 100644 --- a/modules/local/star_align.nf +++ b/modules/local/star_align.nf @@ -43,9 +43,7 @@ process STAR_ALIGN { $ignore_gtf \\ $seq_center \\ $args - $mv_unsorted_bam - if [ -f ${prefix}.Unmapped.out.mate1 ]; then mv ${prefix}.Unmapped.out.mate1 ${prefix}.unmapped_1.fastq gzip ${prefix}.unmapped_1.fastq @@ -54,7 +52,6 @@ process STAR_ALIGN { mv ${prefix}.Unmapped.out.mate2 ${prefix}.unmapped_2.fastq gzip ${prefix}.unmapped_2.fastq fi - cat <<-END_VERSIONS > versions.yml "${task.process}": star: \$(STAR --version | sed -e "s/STAR_//g") diff --git a/modules/local/star_genomegenerate.nf b/modules/local/star_genomegenerate.nf index ad32c0dd8..3cd4ff20c 100644 --- a/modules/local/star_genomegenerate.nf +++ b/modules/local/star_genomegenerate.nf @@ -3,24 +3,23 @@ process STAR_GENOMEGENERATE { label 'process_high' // Note: 2.7X indices incompatible with AWS iGenomes. - conda (params.enable_conda ? "bioconda::star=2.7.9a bioconda::samtools=1.13 conda-forge::gawk=5.1.0" : null) + conda (params.enable_conda ? "bioconda::star=2.6.1d bioconda::samtools=1.10 conda-forge::gawk=5.1.0" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:a7908dfb0485a80ca94e4d17b0ac991532e4e989-0' : - 'quay.io/biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:a7908dfb0485a80ca94e4d17b0ac991532e4e989-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' : + 'quay.io/biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:59cdd445419f14abac76b31dd0d71217994cbcc9-0' }" input: path fasta path gtf output: - path "star" , emit: index - path "versions.yml" , emit: versions + path "star" , emit: index + path "versions.yml", emit: versions script: - def args = task.ext.args ?: '' - def args_list = args.tokenize() - def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' - if (args_list.contains('--genomeSAindexNbases')) { + def args = (task.ext.args ?: '').tokenize() + def memory = task.memory ? "--limitGenomeGenerateRAM ${task.memory.toBytes() - 100000000}" : '' + if (args.contains('--genomeSAindexNbases')) { """ mkdir star STAR \\ @@ -30,20 +29,16 @@ process STAR_GENOMEGENERATE { --sjdbGTFfile $gtf \\ --runThreadN $task.cpus \\ $memory \\ - $args - + ${args.join(' ')} cat <<-END_VERSIONS > versions.yml "${task.process}": star: \$(STAR --version | sed -e "s/STAR_//g") - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') END_VERSIONS """ } else { """ samtools faidx $fasta NUM_BASES=`gawk '{sum = sum + \$2}END{if ((log(sum)/log(2))/2 - 1 > 14) {printf "%.0f", 14} else {printf "%.0f", (log(sum)/log(2))/2 - 1}}' ${fasta}.fai` - mkdir star STAR \\ --runMode genomeGenerate \\ @@ -53,13 +48,10 @@ process STAR_GENOMEGENERATE { --runThreadN $task.cpus \\ --genomeSAindexNbases \$NUM_BASES \\ $memory \\ - $args - + ${args.join(' ')} cat <<-END_VERSIONS > versions.yml "${task.process}": star: \$(STAR --version | sed -e "s/STAR_//g") - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') END_VERSIONS """ } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index b4a18c4b0..621613a78 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -217,7 +217,7 @@ workflow CHIPSEQ { ALIGN_STAR ( FASTQC_TRIMGALORE.out.reads, PREPARE_GENOME.out.star_index, - params.save_unaligned + [] ) ch_genome_bam = ALIGN_STAR.out.bam ch_genome_bam_index = ALIGN_STAR.out.bai From ec806d21a194005b419d1eb26c1221380516e7cc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 12:18:10 +0100 Subject: [PATCH 304/538] Remove gtf from star --- modules/local/star_align.nf | 3 --- workflows/chipseq.nf | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/local/star_align.nf b/modules/local/star_align.nf index 0eef958db..f960045f3 100644 --- a/modules/local/star_align.nf +++ b/modules/local/star_align.nf @@ -11,7 +11,6 @@ process STAR_ALIGN { input: tuple val(meta), path(reads) path index - path gtf output: tuple val(meta), path('*d.out.bam') , emit: bam @@ -29,7 +28,6 @@ process STAR_ALIGN { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def ignore_gtf = params.star_ignore_sjdbgtf ? '' : "--sjdbGTFfile $gtf" def seq_center = params.seq_center ? "--outSAMattrRGline ID:$prefix 'CN:$params.seq_center' 'SM:$prefix'" : "--outSAMattrRGline ID:$prefix 'SM:$prefix'" def out_sam_type = (args.contains('--outSAMtype')) ? '' : '--outSAMtype BAM Unsorted' def mv_unsorted_bam = (args.contains('--outSAMtype BAM Unsorted SortedByCoordinate')) ? "mv ${prefix}.Aligned.out.bam ${prefix}.Aligned.unsort.out.bam" : '' @@ -40,7 +38,6 @@ process STAR_ALIGN { --runThreadN $task.cpus \\ --outFileNamePrefix $prefix. \\ $out_sam_type \\ - $ignore_gtf \\ $seq_center \\ $args $mv_unsorted_bam diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 621613a78..b83884883 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -216,8 +216,7 @@ workflow CHIPSEQ { if (params.aligner == 'star') { ALIGN_STAR ( FASTQC_TRIMGALORE.out.reads, - PREPARE_GENOME.out.star_index, - [] + PREPARE_GENOME.out.star_index ) ch_genome_bam = ALIGN_STAR.out.bam ch_genome_bam_index = ALIGN_STAR.out.bai From 67b45fd3a2aa5b85ed5c09ac6b2e6656c98ef19c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 12:20:28 +0100 Subject: [PATCH 305/538] Remove gtf file from align_star --- subworkflows/nf-core/align_star.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/nf-core/align_star.nf b/subworkflows/nf-core/align_star.nf index 248efe40f..568889b33 100644 --- a/subworkflows/nf-core/align_star.nf +++ b/subworkflows/nf-core/align_star.nf @@ -9,7 +9,6 @@ workflow ALIGN_STAR { take: reads // channel: [ val(meta), [ reads ] ] index // channel: /path/to/star/index/ - gtf // channel: /path/to/genome.gtf main: From f6a8e56e0cad4901262a7e4c560b7a059db68f9a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 24 Jan 2022 12:24:31 +0100 Subject: [PATCH 306/538] Remove gtf from call to star_align argggg! --- subworkflows/nf-core/align_star.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/align_star.nf b/subworkflows/nf-core/align_star.nf index 568889b33..2f3527e05 100644 --- a/subworkflows/nf-core/align_star.nf +++ b/subworkflows/nf-core/align_star.nf @@ -17,7 +17,7 @@ workflow ALIGN_STAR { // // Map reads with STAR // - STAR_ALIGN ( reads, index, gtf ) + STAR_ALIGN ( reads, index ) ch_versions = ch_versions.mix(STAR_ALIGN.out.versions.first()) // From 0c3e7c453c5d92339348084af9aeedaf676456e2 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 25 Jan 2022 16:14:16 +0100 Subject: [PATCH 307/538] Remove chromap modules --- modules.json | 6 -- .../nf-core/modules/chromap/chromap/main.nf | 92 ------------------- .../nf-core/modules/chromap/chromap/meta.yml | 88 ------------------ modules/nf-core/modules/chromap/index/main.nf | 34 ------- .../nf-core/modules/chromap/index/meta.yml | 33 ------- 5 files changed, 253 deletions(-) delete mode 100644 modules/nf-core/modules/chromap/chromap/main.nf delete mode 100644 modules/nf-core/modules/chromap/chromap/meta.yml delete mode 100644 modules/nf-core/modules/chromap/index/main.nf delete mode 100644 modules/nf-core/modules/chromap/index/meta.yml diff --git a/modules.json b/modules.json index d509ccc1d..135a6859f 100644 --- a/modules.json +++ b/modules.json @@ -15,12 +15,6 @@ "bwa/mem": { "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, - "chromap/chromap": { - "git_sha": "9573e7e53de808736ab691ed7f4ed3d9758d62b1" - }, - "chromap/index": { - "git_sha": "4e9cc84514651d5c3d5e13c5bd5ef5fc133e3989" - }, "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" }, diff --git a/modules/nf-core/modules/chromap/chromap/main.nf b/modules/nf-core/modules/chromap/chromap/main.nf deleted file mode 100644 index 67384b0ca..000000000 --- a/modules/nf-core/modules/chromap/chromap/main.nf +++ /dev/null @@ -1,92 +0,0 @@ -process CHROMAP_CHROMAP { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::chromap=0.1.5 bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:724a1037d59f6a19c9d4e7bdba77b52b37de0dc3-0' : - 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:724a1037d59f6a19c9d4e7bdba77b52b37de0dc3-0' }" - - input: - tuple val(meta), path(reads) - path fasta - path index - path barcodes - path whitelist - path chr_order - path pairs_chr_order - - output: - tuple val(meta), path("*.bed.gz") , optional:true, emit: bed - tuple val(meta), path("*.bam") , optional:true, emit: bam - tuple val(meta), path("*.tagAlign.gz"), optional:true, emit: tagAlign - tuple val(meta), path("*.pairs.gz") , optional:true, emit: pairs - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def args_list = args.tokenize() - - def file_extension = args.contains("--SAM") ? 'sam' : args.contains("--TagAlign")? 'tagAlign' : args.contains("--pairs")? 'pairs' : 'bed' - if (barcodes) { - args_list << "-b ${barcodes.join(',')}" - if (whitelist) { - args_list << "--barcode-whitelist $whitelist" - } - } - if (chr_order) { - args_list << "--chr-order $chr_order" - } - if (pairs_chr_order){ - args_list << "--pairs-natural-chr-order $pairs_chr_order" - } - def final_args = args_list.join(' ') - def compression_cmds = "gzip -n ${prefix}.${file_extension}" - if (args.contains("--SAM")) { - compression_cmds = """ - samtools view $args2 -@ $task.cpus -bh \\ - -o ${prefix}.bam ${prefix}.${file_extension} - rm ${prefix}.${file_extension} - """ - } - if (meta.single_end) { - """ - chromap \\ - $final_args \\ - -t $task.cpus \\ - -x $index \\ - -r $fasta \\ - -1 ${reads.join(',')} \\ - -o ${prefix}.${file_extension} - - $compression_cmds - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ - } else { - """ - chromap \\ - $final_args \\ - -t $task.cpus \\ - -x $index \\ - -r $fasta \\ - -1 ${reads[0]} \\ - -2 ${reads[1]} \\ - -o ${prefix}.${file_extension} - - $compression_cmds - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ - } -} diff --git a/modules/nf-core/modules/chromap/chromap/meta.yml b/modules/nf-core/modules/chromap/chromap/meta.yml deleted file mode 100644 index 57936c673..000000000 --- a/modules/nf-core/modules/chromap/chromap/meta.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: chromap_chromap -description: | - Performs preprocessing and alignment of chromatin fastq files to - fasta reference files using chromap. -keywords: - - chromap - - alignment - - map - - fastq - - bam - - sam - - hi-c - - atac-seq - - chip-seq - - trimming - - duplicate removal -tools: - - chromap: - description: Fast alignment and preprocessing of chromatin profiles - homepage: https://github.com/haowenz/chromap - documentation: https://github.com/haowenz/chromap - tool_dev_url: https://github.com/haowenz/chromap - doi: "" - licence: ['GPL v3'] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - fasta: - type: file - description: | - The fasta reference file. - - index: - type: file - description: | - Chromap genome index files (*.index) - - barcodes: - type: file - description: | - Cell barcode files - - whitelist: - type: file - description: | - Cell barcode whitelist file - - chr_order: - type: file - description: | - Custom chromosome order - - pairs_chr_order: - type: file - description: | - Natural chromosome order for pairs flipping -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - bed: - type: file - description: BED file - pattern: "*.bed.gz" - - bam: - type: file - description: BAM file - pattern: "*.bam" - - tagAlign: - type: file - description: tagAlign file - pattern: "*.tagAlign.gz" - - pairs: - type: file - description: pairs file - pattern: "*.pairs.gz" - -authors: - - "@mahesh-panchal" diff --git a/modules/nf-core/modules/chromap/index/main.nf b/modules/nf-core/modules/chromap/index/main.nf deleted file mode 100644 index 61bcee108..000000000 --- a/modules/nf-core/modules/chromap/index/main.nf +++ /dev/null @@ -1,34 +0,0 @@ -process CHROMAP_INDEX { - tag '$fasta' - label 'process_medium' - - conda (params.enable_conda ? "bioconda::chromap=0.1.5" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/chromap:0.1.5--h9a82719_0' : - 'quay.io/biocontainers/chromap:0.1.5--h9a82719_0' }" - - - input: - path fasta - - output: - path "*.index" , emit: index - path "versions.yml", emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = fasta.baseName - """ - chromap \\ - -i \\ - $args \\ - -t $task.cpus \\ - -r $fasta \\ - -o ${prefix}.index - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - chromap: \$(echo \$(chromap --version 2>&1)) - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/chromap/index/meta.yml b/modules/nf-core/modules/chromap/index/meta.yml deleted file mode 100644 index a6a18fe9d..000000000 --- a/modules/nf-core/modules/chromap/index/meta.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: chromap_index -description: Indexes a fasta reference genome ready for chromatin profiling. -keywords: - - index - - fasta - - genome - - reference -tools: - - chromap: - description: Fast alignment and preprocessing of chromatin profiles - homepage: https://github.com/haowenz/chromap - documentation: https://github.com/haowenz/chromap - tool_dev_url: https://github.com/haowenz/chromap - doi: "" - licence: ['GPL v3'] - -input: - - fasta: - type: file - description: Fasta reference file. - -output: - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - index: - type: file - description: Index file of the reference genome - pattern: "*.{index}" - -authors: - - "@mahesh-panchal" From 2e81cdcd4844379203c4f7068ab995f3b52c5108 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 25 Jan 2022 16:26:15 +0100 Subject: [PATCH 308/538] Discard by the moment chromap --- conf/modules.config | 25 ------------------ main.nf | 1 - nextflow_schema.json | 6 ----- subworkflows/local/prepare_genome.nf | 20 -------------- subworkflows/nf-core/align_chromap.nf | 38 --------------------------- workflows/chipseq.nf | 19 ++------------ 6 files changed, 2 insertions(+), 107 deletions(-) delete mode 100644 subworkflows/nf-core/align_chromap.nf diff --git a/conf/modules.config b/conf/modules.config index 3e8edb876..9aaacdf05 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -216,31 +216,6 @@ if (params.aligner == 'bowtie2') { } } -if (params.aligner == 'chromap') { - process { - withName: CHROMAP_INDEX { - ext.args = '' - publishDir = [ - path: { "${params.outdir}/genome/${params.aligner}/index" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: CHROMAP_CHROMAP { - ext.args = [ - '--preset chip', - '--SAM' - ].join(' ').trim() - ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } -} - if (params.aligner == 'star') { process { withName: STAR_GENOMEGENERATE { diff --git a/main.nf b/main.nf index a1cd575a4..ec4dc6471 100755 --- a/main.nf +++ b/main.nf @@ -20,7 +20,6 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.bowtie2_index = WorkflowMain.getGenomeAttribute(params, 'bowtie2') -params.chromap_index = WorkflowMain.getGenomeAttribute(params, 'chromap') params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') diff --git a/nextflow_schema.json b/nextflow_schema.json index 92fbc23b7..78ebbd4bb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -105,12 +105,6 @@ "fa_icon": "fas fa-bezier-curve", "description": "Path to directory or tar.gz archive for pre-built Bowtie2 index." }, - "chromap_index": { - "type": "string", - "format": "path", - "fa_icon": "fas fa-bezier-curve", - "description": "Path to directory or tar.gz archive for pre-built Chromap index." - }, "star_index": { "type": "string", "format": "path", diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 98da8e23e..a4e1be85f 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -13,7 +13,6 @@ include { GFFREAD } from '../../modules/nf-core/modules/gffread/mai include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' include { BOWTIE2_BUILD } from '../../modules/nf-core/modules/bowtie2/build/main' -include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/index/main' include { GTF2BED } from '../../modules/local/gtf2bed' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' @@ -149,24 +148,6 @@ workflow PREPARE_GENOME { } } - // - // Uncompress CHROMAP index or generate from scratch if required - // - ch_chromap_index = Channel.empty() - if (prepare_tool_index == 'chromap') { - if (params.chromap_index) { - if (params.chromap_index.endsWith('.tar.gz')) { - ch_chromap_index = UNTAR ( params.chromap_index ).untar - ch_versions = ch_versions.mix(UNTAR.out.versions) - } else { - ch_chromap_index = file(params.chromap_index) - } - } else { - ch_chromap_index = CHROMAP_INDEX ( ch_fasta ).index - ch_versions = ch_versions.mix(CHROMAP_INDEX.out.versions) - } - } - // // Uncompress STAR index or generate from scratch if required // @@ -193,7 +174,6 @@ workflow PREPARE_GENOME { blacklist = ch_blacklist // path: blacklist.bed bwa_index = ch_bwa_index // path: bwa/index/ bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ - chromap_index = ch_chromap_index // path: genome.index star_index = ch_star_index // path: star/index/ versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] diff --git a/subworkflows/nf-core/align_chromap.nf b/subworkflows/nf-core/align_chromap.nf deleted file mode 100644 index 5afa99bc2..000000000 --- a/subworkflows/nf-core/align_chromap.nf +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -include { CHROMAP_CHROMAP } from '../../modules/nf-core/modules/chromap/chromap/main' -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' - -workflow ALIGN_CHROMAP { - take: - reads // channel: [ val(meta), [ reads ] ] - index // path: /path/to/index - fasta // path: /path/to/fasta - - main: - - ch_versions = Channel.empty() - - // - // Map reads with CHROMAP - // - CHROMAP_CHROMAP(reads, fasta, index, [], [], [], []) - ch_versions = ch_versions.mix(CHROMAP_CHROMAP.out.versions.first()) - - // - // Sort, index BAM file and run samtools stats, flagstat and idxstats - // - BAM_SORT_SAMTOOLS(CHROMAP_CHROMAP.out.bam) - ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first()) - - emit: - bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] - bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] - flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] - idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] - - versions = ch_versions // path: versions.yml -} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index b83884883..92c0f747e 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -5,7 +5,7 @@ */ def valid_params = [ - aligners : [ 'bwa', 'bowtie2', 'chromap', 'star' ] + aligners : [ 'bwa', 'bowtie2', 'star' ] ] def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,7 +18,7 @@ def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, params.gtf, params.gff, params.gene_bed, - params.bwa_index, params.bowtie2_index, params.chromap_index, params.star_index, + params.bwa_index, params.bowtie2_index, params.star_index, params.blacklist, params.bamtools_filter_pe_config, params.bamtools_filter_se_config ] @@ -117,7 +117,6 @@ include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../module include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' -include { ALIGN_CHROMAP } from '../subworkflows/nf-core/align_chromap' include { ALIGN_BOWTIE2 } from '../subworkflows/nf-core/align_bowtie2' include { ALIGN_STAR } from '../subworkflows/nf-core/align_star' include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' @@ -199,20 +198,6 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ALIGN_BOWTIE2.out.versions.first()) } - if (params.aligner == 'chromap') { - ALIGN_CHROMAP ( - FASTQC_TRIMGALORE.out.reads, - PREPARE_GENOME.out.chromap_index, - PREPARE_GENOME.out.fasta - ) - ch_genome_bam = ALIGN_CHROMAP.out.bam - ch_genome_bam_index = ALIGN_CHROMAP.out.bai - ch_samtools_stats = ALIGN_CHROMAP.out.stats //TODO - ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat - ch_samtools_idxstats = ALIGN_CHROMAP.out.idxstats - ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) - } - if (params.aligner == 'star') { ALIGN_STAR ( FASTQC_TRIMGALORE.out.reads, From e69c3dac651707fd926e74bfabe6f4528df76190 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 26 Jan 2022 08:38:37 +0100 Subject: [PATCH 309/538] Add aligner parameter to schema --- nextflow_schema.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 78ebbd4bb..b3d1750fb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -206,6 +206,17 @@ "fa_icon": "fas fa-map-signs", "description": "Options to adjust parameters and filtering criteria for read alignments.", "properties": { + "aligner": { + "type": "string", + "default": "bwa", + "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", + "fa_icon": "fas fa-map-signs", + "enum": [ + "bwa", + "bowtie2", + "star" + ] + }, "keep_dups": { "type": "boolean", "description": "Duplicate reads are not filtered from alignments.", From 145c163b9149a387bc6e78fb13fb35f8aa14f9bd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 26 Jan 2022 10:16:11 +0100 Subject: [PATCH 310/538] Separate outputs by aligner --- conf/modules.config | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9aaacdf05..70d654a65 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -140,7 +140,7 @@ process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/library" }, + path: { "${params.outdir}/${params.aligner}/library" }, mode: 'copy', pattern: "*.bam", enabled: params.save_align_intermeds @@ -150,7 +150,7 @@ process { // ext.args = params.bam_csi_index ? '-c' : '' ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/library" }, + path: { "${params.outdir}/${params.aligner}/library" }, mode: 'copy', pattern: '*.{bai,csi}', enabled: params.save_align_intermeds @@ -160,7 +160,7 @@ process { // ext.args = params.bam_csi_index ? '-c' : '' ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/library" }, + path: { "${params.outdir}/${params.aligner}/library" }, mode: 'copy', pattern: "*.{stats,flagstat,idxstats}", enabled: params.save_align_intermeds @@ -267,7 +267,7 @@ process { ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -277,12 +277,12 @@ process { ext.prefix = { "${meta.id}.mLb.mkD.sorted" } publishDir = [ [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: '*metrics.txt' ], [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: '*.bam' ] @@ -292,14 +292,14 @@ process { // ext.args = params.bam_csi_index ? '-c' : '' // TODO implement it ext.prefix = { "${meta.id}.mkD.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: '*.{bai,csi}' ] } withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { publishDir = [ - path: { "${params.outdir}/bwa/samtools_stats" }, + path: { "${params.outdir}/${params.aligner}/samtools_stats" }, mode: 'copy', pattern: '*.{stats,flagstat,idxstats}' ] @@ -307,7 +307,7 @@ process { withName: BAM_FILTER { ext.prefix = { "${meta.id}.mLb.flT.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -316,7 +316,7 @@ process { ext.args = '--only_fr_pairs' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -324,7 +324,7 @@ process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: '*.{bai,csi}' ] @@ -332,7 +332,7 @@ process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: "*.bam" ] @@ -340,7 +340,7 @@ process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/library" }, + path: { "${params.outdir}/${params.aligner}/library" }, mode: 'copy', pattern: "*.{stats,flagstat,idxstats}" ] @@ -348,7 +348,7 @@ process { withName: PHANTOMPEAKQUALTOOLS { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/phantompeakqualtools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -362,7 +362,7 @@ process { withName: BEDTOOLS_GENOMECOV { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/bigwig" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -370,7 +370,7 @@ process { withName: UCSC_BEDGRAPHTOBIGWIG { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/bigwig" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -383,7 +383,7 @@ if (!params.skip_picard_metrics) { ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/picard_metrics" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -397,7 +397,7 @@ if (!params.skip_preseq) { ext.args = '-verbose -bam -seed 1' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/preseq" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/preseq" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -411,7 +411,7 @@ if (!params.skip_plot_profile) { ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -419,7 +419,7 @@ if (!params.skip_plot_profile) { withName: DEEPTOOLS_PLOTPROFILE { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -427,7 +427,7 @@ if (!params.skip_plot_profile) { withName: DEEPTOOLS_PLOTHEATMAP { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -444,7 +444,7 @@ if (!params.skip_plot_fingerprint) { ].join(' ').trim() ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/bwa/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -464,7 +464,7 @@ if (params.macs_gsize) { ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -492,7 +492,7 @@ if (params.macs_gsize) { ext.args = '-o ./ -p macs2_peak' publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -504,7 +504,7 @@ if (params.macs_gsize) { // ext.prefix = 'peaks' publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -515,7 +515,7 @@ if (params.macs_gsize) { ext.args = '-o ./ -p macs2_annotatePeaks' publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -531,7 +531,7 @@ if (params.macs_gsize) { ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -542,7 +542,7 @@ if (params.macs_gsize) { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -559,7 +559,7 @@ if (params.macs_gsize) { ext.prefix = 'consensus_peaks' publishDir = [ path: { [ - "${params.outdir}/bwa/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: 'copy', @@ -573,7 +573,7 @@ if (params.macs_gsize) { // process { // withName: DESEQ2_FEATURECOUNTS { // publishDir = [ - // path: { "${params.outdir}/bwa/mergedLibrary/macs2" }, + // path: { "${params.outdir}/${params.aligner}/mergedLibrary/macs2" }, // mode: 'copy', // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // ] From 3b94ec5a5b6e1933a13f97f190f7860925b33374 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 26 Jan 2022 10:37:28 +0100 Subject: [PATCH 311/538] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27d0d4867..2d9aa7044 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` * Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) * Added `python3` shebang to appropriate scripts in `bin/` directory +* [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, +via the `--aligner` parameter ### Other enhancements & fixes * Update pipeline template to nf-core/tools `2.1` +* Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) ### Parameters @@ -25,6 +28,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `--conda` | `--enable_conda` | | `--single_end` | | | | `--skip_qc` | +| | `--aligner` | +| | `--save_unaligned` | > **NB:** Parameter has been __updated__ if both old and new parameter information is present. > **NB:** Parameter has been __added__ if just the new parameter information is present. From 744a4ca69fb2da9df96e3c4e29d55427e93cb4df Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 26 Jan 2022 10:37:48 +0100 Subject: [PATCH 312/538] Add tests for aligners --- .github/workflows/ci.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9cbd18562..b07666f23 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,3 +67,25 @@ jobs: - name: Run pipeline with various parameters run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} + + aligners: + name: Test available aligners + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} + runs-on: ubuntu-latest + strategy: + matrix: + aligner: + - "bowtie2" + - "star" + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + + - name: Run pipeline with the different aligners available + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --aligner ${{ matrix.aligner }} From 83829b2bb5933114d33dfff09dcdcfd24213c7a5 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 31 Jan 2022 23:01:15 +0100 Subject: [PATCH 313/538] Rearrange output directories and fix errors --- conf/modules.config | 271 ++++++++++++++++++++++++++++---------------- 1 file changed, 175 insertions(+), 96 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 70d654a65..b46fa0930 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -51,8 +51,12 @@ process { enabled: params.save_reference ] } - // withName: 'UNTAR_.*' { - withName: 'UNTAR' { + + withName: 'UNTAR_.*' { + ext.args2 = '--no-same-owner' + } + + withName: 'UNTAR_.*|BWA_INDEX|BOWTIE2_BUILD|STAR_GENOMEGENERATE' { publishDir = [ path: { "${params.outdir}/genome/index" }, mode: 'copy', @@ -60,6 +64,7 @@ process { enabled: params.save_reference ] } + withName: GFFREAD { ext.args = '--keep-exon-attrs -F -T' publishDir = [ @@ -69,6 +74,7 @@ process { enabled: params.save_reference ] } + withName: GTF2BED { publishDir = [ path: { "${params.outdir}/genome" }, @@ -77,6 +83,7 @@ process { enabled: params.save_reference ] } + withName: CUSTOM_GETCHROMSIZES { publishDir = [ path: { "${params.outdir}/genome" }, @@ -85,6 +92,7 @@ process { enabled: params.save_reference ] } + withName: GENOME_BLACKLIST_REGIONS { publishDir = [ path: { "${params.outdir}/genome" }, @@ -103,6 +111,18 @@ if (!(params.skip_fastqc || params.skip_qc)) { process { withName: '.*:FASTQC_TRIMGALORE:FASTQC' { ext.args = '--quiet' + publishDir = [ + [ + path: { "${params.outdir}/fastqc" }, + mode: 'copy', + pattern: "*.{html}" + ], + [ + path: { "${params.outdir}/fastqc/zips" }, + mode: 'copy', + pattern: "*.{zip}" + ] + ] } } } @@ -118,18 +138,23 @@ if (!params.skip_trimming) { [ path: { "${params.outdir}/trimgalore/fastqc" }, mode: 'copy', - pattern: "*.{html,zip}" + pattern: "*.{html}" ], [ - path: { "${params.outdir}/trimgalore" }, + path: { "${params.outdir}/trimgalore/fastqc/zips" }, mode: 'copy', - pattern: "*.fq.gz", - enabled: params.save_trimmed + pattern: "*.{zip}" ], [ - path: { "${params.outdir}/trimgalore" }, + path: { "${params.outdir}/trimgalore/logs" }, mode: 'copy', pattern: "*.txt" + ], + [ + path: { "${params.outdir}/trimgalore" }, + mode: 'copy', + pattern: "*.fq.gz", + enabled: params.save_trimmed ] ] } @@ -140,44 +165,54 @@ process { withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', - pattern: "*.bam", - enabled: params.save_align_intermeds + path: { "${params.outdir}/${params.aligner}/samtools" }, + // enabled: params.save_align_intermeds ] } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - // ext.args = params.bam_csi_index ? '-c' : '' ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', - pattern: '*.{bai,csi}', - enabled: params.save_align_intermeds + path: { "${params.outdir}/${params.aligner}/samtools" }, + // enabled: params.save_align_intermeds ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_STATS' { - // ext.args = params.bam_csi_index ? '-c' : '' + + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', - pattern: "*.{stats,flagstat,idxstats}", - enabled: params.save_align_intermeds + path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, + // enabled: false ] } + + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_FLAGSTAT' { + // ext.prefix = { "${meta.id}.Lb.sorted" } + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/library/samtools_stats_flagstat" }, + // // enabled: false + // ] + // } + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_IDXSTATS' { + // ext.prefix = { "${meta.id}.Lb.sorted" } + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/samtools_idxstats" }, + // // enabled: false + // ] + // } } if (params.aligner == 'bwa') { process { - withName: BWA_INDEX { - ext.args = '-a bwtsw' - publishDir = [ - path: { "${params.outdir}/genome/${params.aligner}/index" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + // withName: BWA_INDEX { + // ext.args = '-a bwtsw' + // publishDir = [ + // path: { "${params.outdir}/genome/index" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // enable: params.save_reference + // ] + // } withName: BWA_MEM { ext.args = [ '-M', @@ -196,15 +231,15 @@ if (params.aligner == 'bwa') { if (params.aligner == 'bowtie2') { process { - withName: BOWTIE2_BUILD { - ext.args = '' - publishDir = [ - path: { "${params.outdir}/genome/${params.aligner}/index" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: BOWTIE2_ALIGN { + // withName: 'BOWTIE2_BUILD' { + // ext.args = '' + // publishDir = [ + // path: { "${params.outdir}/genome/index" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + withName: 'BOWTIE2_ALIGN' { ext.args = '' ext.prefix = { "${meta.id}.Lb" } publishDir = [ @@ -218,14 +253,14 @@ if (params.aligner == 'bowtie2') { if (params.aligner == 'star') { process { - withName: STAR_GENOMEGENERATE { - ext.args = '' - publishDir = [ - path: { "${params.outdir}/genome/${params.aligner}/index" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + // withName: STAR_GENOMEGENERATE { + // ext.args = '' + // publishDir = [ + // path: { "${params.outdir}/genome/index" }, + // mode: 'copy', + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } withName: '.*:ALIGN_STAR:STAR_ALIGN' { ext.args = [ '--runMode alignReads', @@ -244,12 +279,9 @@ if (params.aligner == 'star') { pattern: '*.{out,tab}' ], [ - path: { "${params.outdir}/${params.aligner}" }, + path: { "${params.outdir}/${params.aligner}/library" }, mode: 'copy', pattern: '*.bam', - // TODO - // enabled: params.save_align_intermeds - enabled: false ], [ path: { "${params.outdir}/${params.aligner}/unmapped" }, @@ -272,6 +304,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.mkD.sorted" } @@ -288,8 +321,8 @@ process { ] ] } + withName: '.*:MARK_DUPLICATES_PICARD:SAMTOOLS_INDEX' { - // ext.args = params.bam_csi_index ? '-c' : '' // TODO implement it ext.prefix = { "${meta.id}.mkD.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, @@ -297,13 +330,15 @@ process { pattern: '*.{bai,csi}' ] } + withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools_stats" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, mode: 'copy', pattern: '*.{stats,flagstat,idxstats}' ] } + withName: BAM_FILTER { ext.prefix = { "${meta.id}.mLb.flT.sorted" } publishDir = [ @@ -312,6 +347,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: BAM_REMOVE_ORPHANS { ext.args = '--only_fr_pairs' ext.prefix = { "${meta.id}.mLb.clN" } @@ -321,6 +357,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -329,6 +366,7 @@ process { pattern: '*.{bai,csi}' ] } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -337,14 +375,16 @@ process { pattern: "*.bam" ] } + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, mode: 'copy', pattern: "*.{stats,flagstat,idxstats}" ] } + withName: PHANTOMPEAKQUALTOOLS { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ @@ -353,26 +393,38 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { publishDir = [ path: { "${params.outdir}/multiqc" }, enabled: false ] } + withName: BEDTOOLS_GENOMECOV { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + [ + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ], + [ + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig/scale" }, + mode: 'copy', + pattern: "*.txt" + ] ] } + withName: UCSC_BEDGRAPHTOBIGWIG { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + [ + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, + mode: 'copy', + pattern: "*.bigWig" + ] ] } } @@ -383,9 +435,16 @@ if (!params.skip_picard_metrics) { ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + [ + path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, + mode: 'copy', + pattern: "*.{alignment_summary_metrics,base_distribution_by_cycle_metrics,insert_size_metrics,quality_by_cycle_metrics,quality_distribution_metrics,txt}" + ], + [ + path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics/pdf" }, + mode: 'copy', + pattern: "*.pdf" + ] ] } } @@ -407,27 +466,27 @@ if (!params.skip_preseq) { if (!params.skip_plot_profile) { process { - withName: DEEPTOOLS_COMPUTEMATRIX { + withName: 'DEEPTOOLS_COMPUTEMATRIX' { ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, ] } - withName: DEEPTOOLS_PLOTPROFILE { + + withName: 'DEEPTOOLS_PLOTPROFILE' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: DEEPTOOLS_PLOTHEATMAP { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -444,7 +503,7 @@ if (!params.skip_plot_fingerprint) { ].join(' ').trim() ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotFingerprint" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -454,7 +513,7 @@ if (!params.skip_plot_fingerprint) { if (params.macs_gsize) { process { - withName: MACS2_CALLPEAK { + withName: 'MACS2_CALLPEAK' { ext.args = [ '--keep-dup all', params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", @@ -471,13 +530,19 @@ if (params.macs_gsize) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: FRIP_SCORE { ext.args = '-bed -c -f 0.20' publishDir = [ - path: { "${params.outdir}/frip" }, + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, enable: false ] } + withName: MULTIQC_CUSTOM_PEAKS { publishDir = [ path: { "${params.outdir}/multiqc" }, @@ -492,32 +557,35 @@ if (params.macs_gsize) { ext.args = '-o ./ -p macs2_peak' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: HOMER_ANNOTATEPEAKS_MACS2 { ext.args = '-gid' // ext.prefix = 'peaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: PLOT_HOMER_ANNOTATEPEAKS { ext.args = '-o ./ -p macs2_annotatePeaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -531,20 +599,23 @@ if (params.macs_gsize) { ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: SUBREAD_FEATURECOUNTS { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -559,9 +630,10 @@ if (params.macs_gsize) { ext.prefix = 'consensus_peaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -573,7 +645,11 @@ if (params.macs_gsize) { // process { // withName: DESEQ2_FEATURECOUNTS { // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/mergedLibrary/macs2" }, + // path: { [ + // "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + // params.narrow_peak? '/narrowPeak' : '/broadPeak', + // '/consensus/deseq2' + // ].join('') }, // mode: 'copy', // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // ] @@ -586,9 +662,9 @@ if (params.macs_gsize) { withName: IGV { publishDir = [ path: { [ - "${params.outdir}/igv", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -602,7 +678,10 @@ if (!params.skip_multiqc) { withName: MULTIQC { ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' publishDir = [ - path: { "${params.outdir}/multiqc" }, + path: { [ + "${params.outdir}/multiqc", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From b63137de39da28a57b154a0b7966dff93f997bc4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 31 Jan 2022 23:01:51 +0100 Subject: [PATCH 314/538] Add bowtie2 and star to citation and order citations alphabetically --- CITATIONS.md | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 8d0bbf55b..3c62c91f3 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -16,44 +16,50 @@ * [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. -* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) - > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. - * [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. -* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) - > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. - -* [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) - > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. +* [Bowtie2](https:/dx.doi.org/10.1038/nmeth.1923) + > Langmead, B. and Salzberg, S. L. 2012 Fast gapped-read alignment with Bowtie 2. Nature methods, 9(4), p. 357–359. doi: 10.1038/nmeth.1923. * [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. -* [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) - > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. +* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + +* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) + > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. * [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. -* [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) - > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. - -* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) - > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. +* [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) + > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. * [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - -* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) +* [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) + > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. * [picard-tools](http://broadinstitute.github.io/picard) +* [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) + > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. + * [pysam](https://github.com/pysam-developers/pysam) +* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +* [STAR](https://pubmed.ncbi.nlm.nih.gov/23104886/) + > Dobin A, Davis CA, Schlesinger F, Drenkow J, Zaleski C, Jha S, Batut P, Chaisson M, Gingeras TR. STAR: ultrafast universal RNA-seq aligner Bioinformatics. 2013 Jan 1;29(1):15-21. doi: 10.1093/bioinformatics/bts635. Epub 2012 Oct 25. PubMed PMID: 23104886; PubMed Central PMCID: PMC3530905. + +* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) + +* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. + ## R packages * [R](https://www.R-project.org/) From 188feef2d0a208f080f573a09b927dfb1f5df46d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 31 Jan 2022 23:03:39 +0100 Subject: [PATCH 315/538] Fix untar calls --- subworkflows/local/prepare_genome.nf | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a4e1be85f..3c3df3e90 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -8,7 +8,12 @@ include { GUNZIP as GUNZIP_GFF GUNZIP as GUNZIP_GENE_BED GUNZIP as GUNZIP_BLACKLIST } from '../../modules/nf-core/modules/gunzip/main' -include { UNTAR } from '../../modules/nf-core/modules/untar/main' + +include { + UNTAR as UNTAR_BWA_INDEX + UNTAR as UNTAR_BOWTIE2_INDEX + UNTAR as UNTAR_STAR_INDEX } from '../../modules/nf-core/modules/untar/main' + include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' @@ -119,8 +124,8 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bwa') { if (params.bwa_index) { if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR ( params.bwa_index ).untar - ch_versions = ch_versions.mix(UNTAR.out.versions) + ch_bwa_index = UNTAR_BWA_INDEX ( params.bwa_index ).untar + ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) } else { ch_bwa_index = file(params.bwa_index) } @@ -137,8 +142,8 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bowtie2') { if (params.bowtie2_index) { if (params.bowtie2_index.endsWith('.tar.gz')) { - ch_bowtie2_index = UNTAR ( params.bowtie2_index ).untar - ch_versions = ch_versions.mix(UNTAR.out.versions) + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( params.bowtie2_index ).untar + ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) } else { ch_bowtie2_index = file(params.bowtie2_index) } From 2076a2f5f5fa3a1d71d8c55ab8fc3591c0cd4209 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 10:56:11 +0100 Subject: [PATCH 316/538] Clean scripts --- subworkflows/nf-core/align_star.nf | 1 - workflows/chipseq.nf | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/align_star.nf b/subworkflows/nf-core/align_star.nf index 2f3527e05..474621824 100644 --- a/subworkflows/nf-core/align_star.nf +++ b/subworkflows/nf-core/align_star.nf @@ -38,7 +38,6 @@ workflow ALIGN_STAR { bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - // csi = BAM_SORT_SAMTOOLS.out.csi // channel: [ val(meta), [ csi ] ] //TODO stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 92c0f747e..912e2ff39 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -209,10 +209,8 @@ workflow CHIPSEQ { ch_samtools_stats = ALIGN_STAR.out.stats ch_samtools_flagstat = ALIGN_STAR.out.flagstat ch_samtools_idxstats = ALIGN_STAR.out.idxstats - ch_star_multiqc = ALIGN_STAR.out.log_final // TODO for the rest of aligners - // if (params.bam_csi_index) { //TODO for the rest of aligners - // ch_genome_bam_index = ALIGN_STAR.out.csi - // } + ch_star_multiqc = ALIGN_STAR.out.log_final + ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) } @@ -427,8 +425,6 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) - // HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}.view() - PLOT_HOMER_ANNOTATEPEAKS ( HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, ch_peak_annotation_header, From 5317628e7319686624ff83210dfc7b72b2f471f7 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 16:19:12 +0100 Subject: [PATCH 317/538] Clean script --- workflows/chipseq.nf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 912e2ff39..2bddc7689 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -210,17 +210,14 @@ workflow CHIPSEQ { ch_samtools_flagstat = ALIGN_STAR.out.flagstat ch_samtools_idxstats = ALIGN_STAR.out.idxstats ch_star_multiqc = ALIGN_STAR.out.log_final - + ch_versions = ch_versions.mix(ALIGN_STAR.out.versions) } // // SUBWORKFLOW: Merge resequenced BAM files // - // ALIGN_BWA_MEM //DEL ch_genome_bam - // .out //DEL - // .bam //DEL .map { meta, bam -> fmeta = meta.findAll { it.key != 'read_group' } @@ -238,6 +235,7 @@ workflow CHIPSEQ { // // SUBWORKFLOW: Mark duplicates & filter BAM files after merging // + ch_markduplicates_multiqc = Channel.empty() MARK_DUPLICATES_PICARD ( PICARD_MERGESAMFILES.out.bam ) @@ -580,7 +578,7 @@ workflow CHIPSEQ { ch_custompeaks_frip_multiqc.collect{it[1]}.ifEmpty([]), ch_custompeaks_count_multiqc.collect{it[1]}.ifEmpty([]), ch_plothomerannotatepeaks_multiqc.collect{it[1]}.ifEmpty([]), - ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([]), + ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([])//, // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() From 99aedd3b7e5adaff830c6687e9f0568bcd7d6b40 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 16:21:54 +0100 Subject: [PATCH 318/538] Update modules configuration --- conf/modules.config | 85 ++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 55 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b46fa0930..b270e4f12 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -166,7 +166,8 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - // enabled: params.save_align_intermeds + mode: 'copy' + // enabled: params.save_align_intermeds // CHECK ] } @@ -174,7 +175,9 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - // enabled: params.save_align_intermeds + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // CHECK + // enabled: params.save_align_intermeds // CHECK ] } @@ -182,37 +185,14 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, - // enabled: false + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_FLAGSTAT' { - // ext.prefix = { "${meta.id}.Lb.sorted" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/library/samtools_stats_flagstat" }, - // // enabled: false - // ] - // } - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_IDXSTATS' { - // ext.prefix = { "${meta.id}.Lb.sorted" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/samtools_idxstats" }, - // // enabled: false - // ] - // } } if (params.aligner == 'bwa') { process { - // withName: BWA_INDEX { - // ext.args = '-a bwtsw' - // publishDir = [ - // path: { "${params.outdir}/genome/index" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // enable: params.save_reference - // ] - // } withName: BWA_MEM { ext.args = [ '-M', @@ -231,14 +211,6 @@ if (params.aligner == 'bwa') { if (params.aligner == 'bowtie2') { process { - // withName: 'BOWTIE2_BUILD' { - // ext.args = '' - // publishDir = [ - // path: { "${params.outdir}/genome/index" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } withName: 'BOWTIE2_ALIGN' { ext.args = '' ext.prefix = { "${meta.id}.Lb" } @@ -253,14 +225,6 @@ if (params.aligner == 'bowtie2') { if (params.aligner == 'star') { process { - // withName: STAR_GENOMEGENERATE { - // ext.args = '' - // publishDir = [ - // path: { "${params.outdir}/genome/index" }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } withName: '.*:ALIGN_STAR:STAR_ALIGN' { ext.args = [ '--runMode alignReads', @@ -310,14 +274,15 @@ process { ext.prefix = { "${meta.id}.mLb.mkD.sorted" } publishDir = [ [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, mode: 'copy', - pattern: '*metrics.txt' + pattern: '*.metrics.txt' ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', pattern: '*.bam' + enabled: params.save_align_intermeds ] ] } @@ -345,6 +310,7 @@ process { path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: params.save_align_intermeds ] } @@ -390,14 +356,15 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: "*.{out,pdf}" ] } withName: MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { publishDir = [ - path: { "${params.outdir}/multiqc" }, - enabled: false + path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -407,7 +374,7 @@ process { [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: "*.bigWig" ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig/scale" }, @@ -438,7 +405,7 @@ if (!params.skip_picard_metrics) { [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, mode: 'copy', - pattern: "*.{alignment_summary_metrics,base_distribution_by_cycle_metrics,insert_size_metrics,quality_by_cycle_metrics,quality_distribution_metrics,txt}" + pattern: "*_metrics" ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics/pdf" }, @@ -471,6 +438,8 @@ if (!params.skip_plot_profile) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -539,14 +508,19 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, - enable: false + enabled: false ] } withName: MULTIQC_CUSTOM_PEAKS { publishDir = [ - path: { "${params.outdir}/multiqc" }, - enabled: false + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } @@ -558,8 +532,9 @@ if (params.macs_gsize) { publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 7110276838923a52646031f27058d983220e0a81 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 16:22:29 +0100 Subject: [PATCH 319/538] Update output for indexes (bowtie2 and star added) --- docs/output.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 6b53cd0af..d36e879df 100644 --- a/docs/output.md +++ b/docs/output.md @@ -300,7 +300,11 @@ Once installed, open IGV, go to `File > Open Session` and select the `igv_sessio * `genome/` * A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. -* `genome/BWAIndex/` +* `genome/index/` + * `bwa/`: Directory containing BWA indices. + * `bowtie2/`: Directory containing BOWTIE2 indices. + * `star/`: Directory containing STAR indices. + * If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes. From a5d0ad65e7ee7156f9de3dbda54d12bd856a491c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 16:33:24 +0100 Subject: [PATCH 320/538] Fix tyops in modules.config --- conf/modules.config | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b270e4f12..06d3ceb8d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -167,7 +167,6 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, mode: 'copy' - // enabled: params.save_align_intermeds // CHECK ] } @@ -177,7 +176,6 @@ process { path: { "${params.outdir}/${params.aligner}/samtools" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // CHECK - // enabled: params.save_align_intermeds // CHECK ] } @@ -281,7 +279,7 @@ process { [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', - pattern: '*.bam' + pattern: '*.bam', enabled: params.save_align_intermeds ] ] @@ -309,7 +307,7 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_align_intermeds ] } From ebb30c78abe42b7ab8022ab75150fa85068700d4 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 1 Feb 2022 16:34:11 +0100 Subject: [PATCH 321/538] Change outputs description (macs to macs2) --- docs/output.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/output.md b/docs/output.md index d36e879df..e633ce4b8 100644 --- a/docs/output.md +++ b/docs/output.md @@ -157,10 +157,10 @@ The results from deepTools plotProfile gives you a quick visualisation for the g

Output files -* `bwa/mergedLibrary/macs//` +* `bwa/mergedLibrary/macs2//` * `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in *narrowPeak* or *broadPeak* mode. * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. -* `bwa/mergedLibrary/macs//qc/` +* `bwa/mergedLibrary/macs2//qc/` * `macs_peak.plots.pdf`: QC plots for MACS2 peaks. * `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. * `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. @@ -186,7 +186,7 @@ Various QC plots per sample including number of peaks, fold-change distribution,
Output files -* `bwa/mergedLibrary/macs//consensus/` +* `bwa/mergedLibrary/macs2//consensus/` * `*.bed`: Consensus peak-set across all samples in BED format. * `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. * `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. @@ -214,18 +214,18 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -* `bwa/mergedLibrary/macs//consensus//deseq2/` +* `bwa/mergedLibrary/macs2//consensus//deseq2/` * `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. * `*.plots.pdf`: File containing PCA and hierarchical clustering plots. * `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. * `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. - * `bwa/mergedLibrary/macs//consensus///` + * `bwa/mergedLibrary/macs2//consensus///` * `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. * `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. * `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. * `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. - * `bwa/mergedLibrary/macs//consensus//sizeFactors/` + * `bwa/mergedLibrary/macs2//consensus//sizeFactors/` * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
From 240db7ddfbdeb4350234be8e2854f04be55b1e8e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 2 Feb 2022 14:55:11 +0100 Subject: [PATCH 322/538] Add quotes to withName selectors in modules config --- conf/modules.config | 54 ++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 06d3ceb8d..9b4e17b44 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -65,7 +65,7 @@ process { ] } - withName: GFFREAD { + withName: 'GFFREAD' { ext.args = '--keep-exon-attrs -F -T' publishDir = [ path: { "${params.outdir}/genome" }, @@ -75,7 +75,7 @@ process { ] } - withName: GTF2BED { + withName: 'GTF2BED' { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', @@ -84,7 +84,7 @@ process { ] } - withName: CUSTOM_GETCHROMSIZES { + withName: 'CUSTOM_GETCHROMSIZES' { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', @@ -93,7 +93,7 @@ process { ] } - withName: GENOME_BLACKLIST_REGIONS { + withName: 'GENOME_BLACKLIST_REGIONS' { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', @@ -175,7 +175,7 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } // CHECK + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -191,7 +191,7 @@ process { if (params.aligner == 'bwa') { process { - withName: BWA_MEM { + withName: 'BWA_MEM' { ext.args = [ '-M', params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' @@ -257,7 +257,7 @@ if (params.aligner == 'star') { } process { - withName: PICARD_MERGESAMFILES { + withName: 'PICARD_MERGESAMFILES' { ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.sorted" } publishDir = [ @@ -302,7 +302,7 @@ process { ] } - withName: BAM_FILTER { + withName: 'BAM_FILTER' { ext.prefix = { "${meta.id}.mLb.flT.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, @@ -312,7 +312,7 @@ process { ] } - withName: BAM_REMOVE_ORPHANS { + withName: 'BAM_REMOVE_ORPHANS' { ext.args = '--only_fr_pairs' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ @@ -349,7 +349,7 @@ process { ] } - withName: PHANTOMPEAKQUALTOOLS { + withName: 'PHANTOMPEAKQUALTOOLS' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, @@ -358,7 +358,7 @@ process { ] } - withName: MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { + withName: 'MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS' { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, mode: 'copy', @@ -366,7 +366,7 @@ process { ] } - withName: BEDTOOLS_GENOMECOV { + withName: 'BEDTOOLS_GENOMECOV' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ [ @@ -382,7 +382,7 @@ process { ] } - withName: UCSC_BEDGRAPHTOBIGWIG { + withName: 'UCSC_BEDGRAPHTOBIGWIG' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ [ @@ -396,7 +396,7 @@ process { if (!params.skip_picard_metrics) { process { - withName: PICARD_COLLECTMULTIPLEMETRICS { + withName: 'PICARD_COLLECTMULTIPLEMETRICS' { ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ @@ -417,7 +417,7 @@ if (!params.skip_picard_metrics) { if (!params.skip_preseq) { process { - withName: PRESEQ_LCEXTRAP { + withName: 'PRESEQ_LCEXTRAP' { ext.args = '-verbose -bam -seed 1' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ @@ -450,7 +450,7 @@ if (!params.skip_plot_profile) { ] } - withName: DEEPTOOLS_PLOTHEATMAP { + withName: 'DEEPTOOLS_PLOTHEATMAP' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, @@ -463,7 +463,7 @@ if (!params.skip_plot_profile) { if (!params.skip_plot_fingerprint) { process { - withName: DEEPTOOLS_PLOTFINGERPRINT { + withName: 'DEEPTOOLS_PLOTFINGERPRINT' { ext.args = [ '--skipZeros', "--numberOfSamples $params.fingerprint_bins" @@ -498,7 +498,7 @@ if (params.macs_gsize) { ] } - withName: FRIP_SCORE { + withName: 'FRIP_SCORE' { ext.args = '-bed -c -f 0.20' publishDir = [ path: { [ @@ -510,7 +510,7 @@ if (params.macs_gsize) { ] } - withName: MULTIQC_CUSTOM_PEAKS { + withName: 'MULTIQC_CUSTOM_PEAKS' { publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", @@ -525,7 +525,7 @@ if (params.macs_gsize) { if (!params.skip_peak_annotation && !params.skip_peak_qc) { process { - withName: PLOT_MACS2_QC { + withName: 'PLOT_MACS2_QC' { ext.args = '-o ./ -p macs2_peak' publishDir = [ path: { [ @@ -538,7 +538,7 @@ if (params.macs_gsize) { ] } - withName: HOMER_ANNOTATEPEAKS_MACS2 { + withName: 'HOMER_ANNOTATEPEAKS_MACS2' { ext.args = '-gid' // ext.prefix = 'peaks' publishDir = [ @@ -551,7 +551,7 @@ if (params.macs_gsize) { ] } - withName: PLOT_HOMER_ANNOTATEPEAKS { + withName: 'PLOT_HOMER_ANNOTATEPEAKS' { ext.args = '-o ./ -p macs2_annotatePeaks' publishDir = [ path: { [ @@ -568,7 +568,7 @@ if (params.macs_gsize) { if (!params.skip_consensus_peaks) { process { - withName: MACS2_CONSENSUS { + withName: 'MACS2_CONSENSUS' { ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ @@ -581,7 +581,7 @@ if (params.macs_gsize) { ] } - withName: SUBREAD_FEATURECOUNTS { + withName: 'SUBREAD_FEATURECOUNTS' { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ @@ -598,7 +598,7 @@ if (params.macs_gsize) { if (!params.skip_peak_annotation) { process { - withName: HOMER_ANNOTATEPEAKS_CONSENSUS { + withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { ext.args = '-gid' ext.prefix = 'consensus_peaks' publishDir = [ @@ -632,7 +632,7 @@ if (params.macs_gsize) { if (!params.skip_igv) { process { - withName: IGV { + withName: 'IGV' { publishDir = [ path: { [ "${params.outdir}/igv", @@ -648,7 +648,7 @@ if (params.macs_gsize) { if (!params.skip_multiqc) { process { - withName: MULTIQC { + withName: 'MULTIQC' { ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' publishDir = [ path: { [ From f69b7fdf0ae181b19f94297522458bd7678ebf49 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 2 Feb 2022 16:16:22 +0100 Subject: [PATCH 323/538] Add DESEQ2_QC back (before CONSENSUS_PEAKS_DESEQ2) --- conf/modules.config | 36 +++++++++------- modules/local/deseq2_featurecounts.nf | 60 --------------------------- modules/local/deseq2_qc.nf | 57 +++++++++++++++++++++++++ workflows/chipseq.nf | 35 +++++++++------- 4 files changed, 98 insertions(+), 90 deletions(-) delete mode 100644 modules/local/deseq2_featurecounts.nf create mode 100644 modules/local/deseq2_qc.nf diff --git a/conf/modules.config b/conf/modules.config index 9b4e17b44..154b11c4a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -614,21 +614,27 @@ if (params.macs_gsize) { } } - // if (!params.skip_diff_analysis) { - // process { - // withName: DESEQ2_FEATURECOUNTS { - // publishDir = [ - // path: { [ - // "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - // params.narrow_peak? '/narrowPeak' : '/broadPeak', - // '/consensus/deseq2' - // ].join('') }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } - // } - // } + if (!params.skip_diff_analysis) { + process { + withName: DESEQ2_QC { + ext.args = [ + '--id_col 1', + '--sample_suffix \'.mLb.clN.sorted.bam\'', + '--count_col 7', + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus/deseq2' + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } if (!params.skip_igv) { process { diff --git a/modules/local/deseq2_featurecounts.nf b/modules/local/deseq2_featurecounts.nf deleted file mode 100644 index 120e12ce7..000000000 --- a/modules/local/deseq2_featurecounts.nf +++ /dev/null @@ -1,60 +0,0 @@ -conda (params.enable_conda ? "${baseDir}/environment.yml" : null) - -process CONSENSUS_PEAKS_DESEQ2 { - script: - echo "Avoid nf-core lint to crash for process name being commented" -} - -// /* -// * STEP 7.4: Differential analysis with DESeq2 -// */ -// process CONSENSUS_PEAKS_DESEQ2 { -// tag "${antibody}" -// label 'process_medium' -// publishDir "${params.outdir}/bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2", mode: params.publish_dir_mode, -// saveAs: { filename -> -// if (filename.endsWith('.igv.txt')) null -// else filename -// } -// -// when: -// params.macs_gsize && replicatesExist && multipleGroups && !params.skip_consensus_peaks && !params.skip_diff_analysis -// -// input: -// tuple val(antibody), val(replicatesExist), val(multipleGroups), path(counts) from ch_macs_consensus_counts -// path deseq2_pca_header from ch_deseq2_pca_header -// path deseq2_clustering_header from ch_deseq2_clustering_header -// -// output: -// path '*.tsv' into ch_macs_consensus_deseq_mqc -// path '*igv.txt' into ch_macs_consensus_deseq_comp_igv -// path '*.{RData,results.txt,pdf,log}' -// path 'sizeFactors' -// path '*vs*/*.{pdf,txt}' -// path '*vs*/*.bed' -// -// script: -// prefix = "${antibody}.consensus_peaks" -// bam_ext = params.single_end ? '.mLb.clN.sorted.bam' : '.mLb.clN.bam' -// vst = params.deseq2_vst ? '--vst TRUE' : '' -// """ -// featurecounts_deseq2.r \\ -// --featurecount_file $counts \\ -// --bam_suffix '$bam_ext' \\ -// --outdir ./ \\ -// --outprefix $prefix \\ -// --outsuffix '' \\ -// --cores $task.cpus \\ -// $vst -// -// sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv -// -// sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt -// sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt -// cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv -// -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt -// """ -// } diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf new file mode 100644 index 000000000..dcc933c4f --- /dev/null +++ b/modules/local/deseq2_qc.nf @@ -0,0 +1,57 @@ +process DESEQ2_QC { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "conda-forge::r-base=4.0 bioconda::bioconductor-deseq2=1.28.0 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' : + 'quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' }" + + input: + tuple val(meta), path(counts) + path deseq2_pca_header + path deseq2_clustering_header + + output: + path "*.pdf" , optional:true, emit: pdf + path "*.RData" , optional:true, emit: rdata + path "*pca.vals.txt" , optional:true, emit: pca_txt + path "*pca.vals_mqc.tsv" , optional:true, emit: pca_multiqc + path "*sample.dists.txt" , optional:true, emit: dists_txt + path "*sample.dists_mqc.tsv", optional:true, emit: dists_multiqc + path "*.log" , optional:true, emit: log + path "size_factors" , optional:true, emit: size_factors + path "versions.yml" , emit: versions + + script: + if (meta.multiple_groups || meta.replicates_exist) { + def args = task.ext.args ?: '' + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def antibody = meta.antibody + def prefix = "${antibody}.consensus_peaks" + """ + deseq2_qc.r \\ + --count_file $counts \\ + --outdir ./ \\ + --outprefix $prefix \\ + --cores $task.cpus \\ + $args + + sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt + sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv + + sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt + sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv + + find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${peak_type}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") + END_VERSIONS + """ + } +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 2bddc7689..d2eabec25 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -71,8 +71,8 @@ include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_ include { FRIP_SCORE } from '../modules/local/frip_score' include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' -include { MACS2_CONSENSUS } from '../modules/local//macs2_consensus' -//include { DESEQ2_QC } from '../modules/local/deseq2_qc' +include { MACS2_CONSENSUS } from '../modules/local/macs2_consensus' +include { DESEQ2_QC } from '../modules/local/deseq2_qc' include { IGV } from '../modules/local/igv' include { MULTIQC } from '../modules/local/multiqc' include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools' @@ -81,8 +81,8 @@ include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_c // // 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 { INPUT_CHECK } from '../subworkflows/local/input_check' +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' include { FILTER_BAM_BAMTOOLS } from '../subworkflows/local/filter_bam_bamtools' /* @@ -484,13 +484,16 @@ workflow CHIPSEQ { ch_ip_control_bam .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .combine(ch_ip_saf) + .groupTuple() + .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } + .join(ch_ip_saf) .map { it -> fmeta = it[1] - fmeta['replicates_exist'] = it[4]['replicates_exist'] - fmeta['multiple_groups'] = it[4]['multiple_groups'] - [ fmeta, it[2], it[5] ] } + fmeta['id'] = it[3]['id'] + fmeta['replicates_exist'] = it[3]['replicates_exist'] + fmeta['multiple_groups'] = it[3]['multiple_groups'] + [ fmeta, it[2], it[4] ] } .set { ch_ip_bam } SUBREAD_FEATURECOUNTS ( @@ -499,13 +502,15 @@ workflow CHIPSEQ { ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - // if (!params.skip_diff_analysis) { - // // DESEQ2_FEATURECOUNTS ( - // // params.modules['deseq2_featurecounts'] - // // ) - // // ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - // // ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - // } + ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) + ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) + if (!params.skip_diff_analysis) { + DESEQ2_QC ( + SUBREAD_FEATURECOUNTS.out.counts, + ch_deseq2_pca_header, + ch_deseq2_clustering_header + ) + } // // Create IGV session From 650c0b2efa1f803f5bab661fa43f573221109719 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 2 Feb 2022 16:17:12 +0100 Subject: [PATCH 324/538] Fix problems with points in sample names --- bin/deseq2_qc.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/deseq2_qc.r b/bin/deseq2_qc.r index edb487143..e8c2617f5 100755 --- a/bin/deseq2_qc.r +++ b/bin/deseq2_qc.r @@ -53,7 +53,7 @@ if (is.null(opt$count_file)){ ################################################ ################################################ -count.table <- read.delim(file=opt$count_file,header=TRUE, row.names=NULL) +count.table <- read.delim(file=opt$count_file,header=TRUE, row.names=NULL, skip=1, check.names=FALSE) rownames(count.table) <- count.table[,opt$id_col] count.table <- count.table[,opt$count_col:ncol(count.table),drop=FALSE] colnames(count.table) <- gsub(opt$sample_suffix,"",colnames(count.table)) From 0435144fc0dfa8ff9e276c581249abeabc252c20 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 2 Feb 2022 22:40:04 +0100 Subject: [PATCH 325/538] Change param skip_diff_analysis by skip_deseq2_qc --- CHANGELOG.md | 1 + conf/modules.config | 2 +- nextflow.config | 4 ++-- nextflow_schema.json | 10 +++++----- workflows/chipseq.nf | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d9aa7044..18ad17afe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ via the `--aligner` parameter | | `--skip_qc` | | | `--aligner` | | | `--save_unaligned` | +| `--skip_diff_analysis` | `--skip_deseq2_qc` | > **NB:** Parameter has been __updated__ if both old and new parameter information is present. > **NB:** Parameter has been __added__ if just the new parameter information is present. diff --git a/conf/modules.config b/conf/modules.config index 154b11c4a..b1f091632 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -614,7 +614,7 @@ if (params.macs_gsize) { } } - if (!params.skip_diff_analysis) { + if (!params.skip_deseq2_qc) { process { withName: DESEQ2_QC { ext.args = [ diff --git a/nextflow.config b/nextflow.config index d5683b804..a26796469 100644 --- a/nextflow.config +++ b/nextflow.config @@ -49,9 +49,9 @@ params { skip_peak_annotation = false skip_consensus_peaks = false - // Options: Differential analysis + // Options: DESeq2 QC deseq2_vst = false - skip_diff_analysis = false + skip_deseq2_qc = false // Options: QC skip_qc = false diff --git a/nextflow_schema.json b/nextflow_schema.json index b3d1750fb..44adb97dd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -318,7 +318,7 @@ } } }, - "differential_analysis_options": { + "deseq_qc_options": { "title": "Differential analysis options", "type": "object", "fa_icon": "fas fa-not-equal", @@ -330,10 +330,10 @@ "help_text": "See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization).", "fa_icon": "fas fa-dolly" }, - "skip_diff_analysis": { + "skip_deseq2_qc": { "type": "boolean", - "description": "Skip differential accessibility analysis.", - "fa_icon": "fas fa-fast-forward" + "fa_icon": "fas fa-fast-forward", + "description": "Skip DESeq2 PCA and heatmap plotting." } } }, @@ -574,7 +574,7 @@ "$ref": "#/definitions/peak_calling_options" }, { - "$ref": "#/definitions/differential_analysis_options" + "$ref": "#/definitions/deseq_qc_options" }, { "$ref": "#/definitions/process_skipping_options" diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index d2eabec25..3de89848c 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -504,7 +504,7 @@ workflow CHIPSEQ { ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) - if (!params.skip_diff_analysis) { + if (!params.skip_deseq2_qc) { DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, ch_deseq2_pca_header, From 1017d46edd3ee684f1be04e7482843a568d8192f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 4 Feb 2022 10:30:22 +0100 Subject: [PATCH 326/538] Update path of BWAIndex to fetch all the files --- conf/igenomes.config | 76 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 855948def..f0b8e1676 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -13,7 +13,7 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" @@ -26,7 +26,7 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" @@ -38,7 +38,7 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" @@ -51,7 +51,7 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" @@ -62,7 +62,7 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" @@ -72,7 +72,7 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" @@ -83,7 +83,7 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" @@ -94,7 +94,7 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" @@ -105,7 +105,7 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" @@ -115,7 +115,7 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" @@ -126,7 +126,7 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" @@ -137,7 +137,7 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" @@ -147,7 +147,7 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" @@ -157,7 +157,7 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" @@ -167,7 +167,7 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" @@ -178,7 +178,7 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" @@ -188,7 +188,7 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" @@ -199,7 +199,7 @@ params { } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" @@ -209,7 +209,7 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" @@ -219,7 +219,7 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" @@ -230,7 +230,7 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" @@ -242,7 +242,7 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" @@ -252,7 +252,7 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" @@ -263,7 +263,7 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" @@ -273,7 +273,7 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" @@ -285,7 +285,7 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" @@ -298,7 +298,7 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" @@ -311,7 +311,7 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" @@ -321,7 +321,7 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" @@ -333,7 +333,7 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" @@ -344,7 +344,7 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" @@ -355,7 +355,7 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" @@ -366,7 +366,7 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" @@ -377,7 +377,7 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" @@ -388,7 +388,7 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" @@ -399,7 +399,7 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" @@ -409,7 +409,7 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" @@ -419,7 +419,7 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" From 99fbf2e3e5248d1ed82a4cb996df9362289c6153 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 4 Feb 2022 11:17:58 +0100 Subject: [PATCH 327/538] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18ad17afe..b42ead40f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ via the `--aligner` parameter * Update pipeline template to nf-core/tools `2.1` * Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) +* Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder ### Parameters From 7c446821c4a170b5b432ff3b3c3e7dd72f9837c1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:20:27 +0100 Subject: [PATCH 328/538] Update blacklist files --- .../blacklists/{ => old}/GRCm38-blacklist.bed | 0 .../blacklists/{ => old}/hg38-blacklist.bed | 0 .../blacklists/{ => old}/mm10-blacklist.bed | 0 .../{ => v1.0}/GRCh37-blacklist.bed | 0 .../hg19-blacklist.v1.bed} | 0 assets/blacklists/v2.0/ce10-blacklist.v2.bed | 100 + assets/blacklists/v2.0/ce11-blacklist.v2.bed | 97 + assets/blacklists/v2.0/dm3-blacklist.v2.bed | 271 ++ assets/blacklists/v2.0/dm6-blacklist.v2.bed | 182 + assets/blacklists/v2.0/hg19-blacklist.v2.bed | 834 ++++ assets/blacklists/v2.0/hg38-blacklist.v2.bed | 636 +++ assets/blacklists/v2.0/mm10-blacklist.v2.bed | 3435 +++++++++++++++++ assets/blacklists/v3.0/hg38-blacklist.v3.bed | 910 +++++ 13 files changed, 6465 insertions(+) rename assets/blacklists/{ => old}/GRCm38-blacklist.bed (100%) rename assets/blacklists/{ => old}/hg38-blacklist.bed (100%) rename assets/blacklists/{ => old}/mm10-blacklist.bed (100%) rename assets/blacklists/{ => v1.0}/GRCh37-blacklist.bed (100%) mode change 100755 => 100644 rename assets/blacklists/{hg19-blacklist.bed => v1.0/hg19-blacklist.v1.bed} (100%) mode change 100755 => 100644 create mode 100644 assets/blacklists/v2.0/ce10-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/ce11-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/dm3-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/dm6-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/hg19-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/hg38-blacklist.v2.bed create mode 100644 assets/blacklists/v2.0/mm10-blacklist.v2.bed create mode 100644 assets/blacklists/v3.0/hg38-blacklist.v3.bed diff --git a/assets/blacklists/GRCm38-blacklist.bed b/assets/blacklists/old/GRCm38-blacklist.bed similarity index 100% rename from assets/blacklists/GRCm38-blacklist.bed rename to assets/blacklists/old/GRCm38-blacklist.bed diff --git a/assets/blacklists/hg38-blacklist.bed b/assets/blacklists/old/hg38-blacklist.bed similarity index 100% rename from assets/blacklists/hg38-blacklist.bed rename to assets/blacklists/old/hg38-blacklist.bed diff --git a/assets/blacklists/mm10-blacklist.bed b/assets/blacklists/old/mm10-blacklist.bed similarity index 100% rename from assets/blacklists/mm10-blacklist.bed rename to assets/blacklists/old/mm10-blacklist.bed diff --git a/assets/blacklists/GRCh37-blacklist.bed b/assets/blacklists/v1.0/GRCh37-blacklist.bed old mode 100755 new mode 100644 similarity index 100% rename from assets/blacklists/GRCh37-blacklist.bed rename to assets/blacklists/v1.0/GRCh37-blacklist.bed diff --git a/assets/blacklists/hg19-blacklist.bed b/assets/blacklists/v1.0/hg19-blacklist.v1.bed old mode 100755 new mode 100644 similarity index 100% rename from assets/blacklists/hg19-blacklist.bed rename to assets/blacklists/v1.0/hg19-blacklist.v1.bed diff --git a/assets/blacklists/v2.0/ce10-blacklist.v2.bed b/assets/blacklists/v2.0/ce10-blacklist.v2.bed new file mode 100644 index 000000000..99566cec9 --- /dev/null +++ b/assets/blacklists/v2.0/ce10-blacklist.v2.bed @@ -0,0 +1,100 @@ +chrIII 449300 453600 High Signal Region +chrIII 930200 932600 High Signal Region +chrIII 1016500 1021400 Low Mappability +chrIII 1293500 1303900 High Signal Region +chrIII 5352200 5359400 High Signal Region +chrIII 7404700 7452200 High Signal Region +chrIII 7593800 7603300 High Signal Region +chrIII 8861100 8864700 High Signal Region +chrIII 10215600 10228400 High Signal Region +chrIII 13775100 14905900 High Signal Region +chrII 0 1300 High Signal Region +chrII 2569700 2571600 High Signal Region +chrII 3464700 3469600 High Signal Region +chrII 3795600 3798100 High Signal Region +chrII 3993700 3995700 High Signal Region +chrII 4640300 4645900 High Signal Region +chrII 5143800 5147500 High Signal Region +chrII 6504400 6509800 High Signal Region +chrII 8286700 8293600 High Signal Region +chrII 8975300 8977400 High Signal Region +chrII 9631400 9633700 High Signal Region +chrII 10335100 10339700 High Signal Region +chrII 11527100 11530900 High Signal Region +chrII 12842800 12846900 Low Mappability +chrII 13597700 13600700 Low Mappability +chrII 13983900 13987500 Low Mappability +chrII 14323700 14340100 High Signal Region +chrII 14992100 14994300 High Signal Region +chrI 669000 679400 High Signal Region +chrI 931700 935600 High Signal Region +chrI 3170700 3173300 High Signal Region +chrI 3989200 3991600 High Signal Region +chrI 4535300 4549400 High Signal Region +chrI 5151000 5154700 High Signal Region +chrI 10203200 10220100 High Signal Region +chrI 10265700 10277700 High Signal Region +chrI 10945100 10953900 High Signal Region +chrI 15059400 15373800 High Signal Region +chrIV 2821200 2831500 High Signal Region +chrIV 3205500 3210300 High Signal Region +chrIV 3365800 3368900 Low Mappability +chrIV 4415600 4422900 High Signal Region +chrIV 6357100 6361700 High Signal Region +chrIV 6468100 6470600 Low Mappability +chrIV 6682800 6704100 High Signal Region +chrIV 6709900 6734000 High Signal Region +chrIV 7590900 7600100 High Signal Region +chrIV 8563000 8582700 High Signal Region +chrIV 9045100 9049600 High Signal Region +chrIV 10942600 10951900 High Signal Region +chrIV 11070000 11076700 High Signal Region +chrIV 12313600 12325600 High Signal Region +chrIV 12637100 12639400 Low Mappability +chrIV 13359700 13362800 High Signal Region +chrIV 13548500 13550400 High Signal Region +chrIV 14056400 14059900 High Signal Region +chrIV 14775600 14782300 Low Mappability +chrIV 15408400 15424900 Low Mappability +chrV 264100 268100 High Signal Region +chrV 1103700 1106100 Low Mappability +chrV 1637000 1639900 High Signal Region +chrV 3098000 3100300 High Signal Region +chrV 3434000 3441600 High Signal Region +chrV 5072400 5084800 High Signal Region +chrV 5278300 5286700 High Signal Region +chrV 6171000 6183700 High Signal Region +chrV 6936700 6943800 High Signal Region +chrV 7442400 7445100 High Signal Region +chrV 7912200 7925700 High Signal Region +chrV 7988100 7993900 High Signal Region +chrV 8698600 8715600 High Signal Region +chrV 9423500 9436100 High Signal Region +chrV 10604900 10613200 High Signal Region +chrV 12509100 12511300 High Signal Region +chrV 14765800 14770600 High Signal Region +chrV 15425800 15436300 High Signal Region +chrV 16706300 16710300 High Signal Region +chrV 17114500 17133000 High Signal Region +chrV 17307700 17312400 High Signal Region +chrV 17383300 17395200 Low Mappability +chrV 18399500 18402500 High Signal Region +chrX 108300 115100 High Signal Region +chrX 273800 296200 High Signal Region +chrX 1635300 1645200 High Signal Region +chrX 1747400 1755900 High Signal Region +chrX 3006400 3008800 High Signal Region +chrX 4025200 4056900 High Signal Region +chrX 5045000 5058100 High Signal Region +chrX 7076500 7081700 High Signal Region +chrX 9184100 9189500 High Signal Region +chrX 9437700 9440000 High Signal Region +chrX 10360200 10369900 High Signal Region +chrX 11784800 11790300 High Signal Region +chrX 11885600 11889600 High Signal Region +chrX 12275900 12280400 High Signal Region +chrX 14384000 14390400 High Signal Region +chrX 14907200 14910200 High Signal Region +chrX 15226100 15229500 High Signal Region +chrX 15806300 15812000 Low Mappability +chrX 16757900 16761600 High Signal Region diff --git a/assets/blacklists/v2.0/ce11-blacklist.v2.bed b/assets/blacklists/v2.0/ce11-blacklist.v2.bed new file mode 100644 index 000000000..66f9d730b --- /dev/null +++ b/assets/blacklists/v2.0/ce11-blacklist.v2.bed @@ -0,0 +1,97 @@ +chrIII 449400 453600 High Signal Region +chrIII 930300 932600 High Signal Region +chrIII 1016500 1021500 Low Mappability +chrIII 1293500 1303900 High Signal Region +chrIII 5352200 5359400 High Signal Region +chrIII 7404700 7452200 High Signal Region +chrIII 7593800 7598100 High Signal Region +chrIII 8861200 8864800 High Signal Region +chrIII 10216000 10228500 High Signal Region +chrIII 13775200 13783800 High Signal Region +chrII 0 1300 High Signal Region +chrII 2569700 2571800 High Signal Region +chrII 3464700 3469600 High Signal Region +chrII 3795600 3798100 High Signal Region +chrII 3993700 3995700 High Signal Region +chrII 4640300 4645900 High Signal Region +chrII 5143800 5147500 High Signal Region +chrII 6504500 6509800 High Signal Region +chrII 8286700 8293600 High Signal Region +chrII 8975300 8977500 High Signal Region +chrII 9631500 9633800 High Signal Region +chrII 10335100 10339700 High Signal Region +chrII 11527200 11530900 High Signal Region +chrII 12842900 12846900 Low Mappability +chrII 13597800 13600800 High Signal Region +chrII 13984000 13987600 Low Mappability +chrII 14323700 14340100 High Signal Region +chrII 14992200 14994400 High Signal Region +chrI 669000 679200 High Signal Region +chrI 931700 935600 High Signal Region +chrI 3170700 3173300 High Signal Region +chrI 3989200 3991600 High Signal Region +chrI 4535300 4549400 High Signal Region +chrI 5151000 5154700 High Signal Region +chrI 10203200 10220100 High Signal Region +chrI 10265700 10277700 High Signal Region +chrI 10945100 10953900 High Signal Region +chrI 15059400 15072400 High Signal Region +chrIV 2821100 2831500 High Signal Region +chrIV 3205500 3210300 High Signal Region +chrIV 3365800 3368800 Low Mappability +chrIV 4415600 4422800 High Signal Region +chrIV 6357100 6361700 High Signal Region +chrIV 6468100 6470600 Low Mappability +chrIV 6682700 6704200 High Signal Region +chrIV 7590800 7600100 High Signal Region +chrIV 8563000 8582600 High Signal Region +chrIV 9045100 9049600 High Signal Region +chrIV 10942600 10951900 High Signal Region +chrIV 11070000 11076700 High Signal Region +chrIV 12023000 12025800 High Signal Region +chrIV 12313600 12325600 High Signal Region +chrIV 12637100 12639500 Low Mappability +chrIV 13359700 13362800 High Signal Region +chrIV 13548500 13550500 High Signal Region +chrIV 14056400 14059900 High Signal Region +chrIV 14775600 14782300 Low Mappability +chrIV 15076800 15082900 High Signal Region +chrIV 15408500 15424900 Low Mappability +chrV 264100 268100 High Signal Region +chrV 1103700 1106100 Low Mappability +chrV 1637000 1639900 High Signal Region +chrV 3098000 3100400 High Signal Region +chrV 3434100 3441600 High Signal Region +chrV 5278300 5286800 High Signal Region +chrV 6171000 6183700 High Signal Region +chrV 6936700 6943900 High Signal Region +chrV 7912300 7925700 High Signal Region +chrV 7988100 7993700 High Signal Region +chrV 8698700 8715700 High Signal Region +chrV 9423500 9436100 High Signal Region +chrV 10604900 10613200 High Signal Region +chrV 12509100 12511300 High Signal Region +chrV 14765800 14770600 High Signal Region +chrV 16706300 16710300 High Signal Region +chrV 17114600 17133000 High Signal Region +chrV 17307800 17312400 High Signal Region +chrV 17383300 17395200 High Signal Region +chrV 18399500 18402500 High Signal Region +chrX 108300 115100 High Signal Region +chrX 273800 296200 High Signal Region +chrX 1635300 1645200 High Signal Region +chrX 1747400 1755900 High Signal Region +chrX 3006400 3008800 High Signal Region +chrX 4025200 4056900 High Signal Region +chrX 5045000 5058200 High Signal Region +chrX 7076600 7081600 High Signal Region +chrX 9184200 9189600 High Signal Region +chrX 9437700 9440000 High Signal Region +chrX 10360300 10370000 High Signal Region +chrX 11784800 11790400 High Signal Region +chrX 11885700 11889700 High Signal Region +chrX 12275900 12280400 High Signal Region +chrX 14907200 14910300 High Signal Region +chrX 15226200 15229600 High Signal Region +chrX 15806400 15812100 Low Mappability +chrX 16758000 16761600 High Signal Region diff --git a/assets/blacklists/v2.0/dm3-blacklist.v2.bed b/assets/blacklists/v2.0/dm3-blacklist.v2.bed new file mode 100644 index 000000000..45f1a2017 --- /dev/null +++ b/assets/blacklists/v2.0/dm3-blacklist.v2.bed @@ -0,0 +1,271 @@ +chr2LHet 43400 150800 High Signal Region +chr2LHet 350800 368800 Low Mappability +chr2L 47200 52500 High Signal Region +chr2L 66000 74500 High Signal Region +chr2L 154400 167500 High Signal Region +chr2L 221100 223300 High Signal Region +chr2L 471400 491700 High Signal Region +chr2L 2191400 2201000 High Signal Region +chr2L 2749200 2756400 High Signal Region +chr2L 2884100 2889800 High Signal Region +chr2L 3161500 3164300 High Signal Region +chr2L 4937900 4941000 High Signal Region +chr2L 5206500 5210500 High Signal Region +chr2L 5943200 5949200 High Signal Region +chr2L 5976600 5987500 High Signal Region +chr2L 6991400 6998500 Low Mappability +chr2L 7343400 7350800 High Signal Region +chr2L 9898700 9903100 High Signal Region +chr2L 9973800 9980900 Low Mappability +chr2L 10333600 10335600 High Signal Region +chr2L 11992000 12013100 High Signal Region +chr2L 12558300 12565400 Low Mappability +chr2L 13522100 13527800 Low Mappability +chr2L 14489600 14491600 High Signal Region +chr2L 16267500 16271800 High Signal Region +chr2L 16283800 16289200 High Signal Region +chr2L 16512100 16526900 Low Mappability +chr2L 18942900 18945500 High Signal Region +chr2L 19570700 19588100 High Signal Region +chr2L 20647200 20649100 High Signal Region +chr2L 21019900 21024300 Low Mappability +chr2L 21236700 21238800 High Signal Region +chr2L 21416300 21544000 High Signal Region +chr2L 22378300 22389200 High Signal Region +chr2L 22657900 22670900 High Signal Region +chr2RHet 674900 692100 Low Mappability +chr2RHet 1142300 1263300 Low Mappability +chr2RHet 1422500 1435900 High Signal Region +chr2RHet 2823000 2830800 High Signal Region +chr2RHet 2924700 2989000 High Signal Region +chr2RHet 3179900 3183800 High Signal Region +chr2RHet 3269500 3288700 Low Mappability +chr2R 101000 118400 High Signal Region +chr2R 201300 207900 High Signal Region +chr2R 934100 944600 High Signal Region +chr2R 992900 997600 High Signal Region +chr2R 2217200 2303300 High Signal Region +chr2R 2548500 2551600 High Signal Region +chr2R 3123000 3137600 High Signal Region +chr2R 3322500 3326700 Low Mappability +chr2R 3495700 3501600 Low Mappability +chr2R 3692900 3720700 High Signal Region +chr2R 3902800 3905600 Low Mappability +chr2R 4552800 4555900 High Signal Region +chr2R 5367700 5378100 Low Mappability +chr2R 5430900 5442200 High Signal Region +chr2R 5615200 5621600 High Signal Region +chr2R 6311300 6318700 High Signal Region +chr2R 6364800 6368500 High Signal Region +chr2R 6420800 6430300 High Signal Region +chr2R 6835600 6843000 High Signal Region +chr2R 7538100 7540600 High Signal Region +chr2R 8473600 8481800 High Signal Region +chr2R 8706700 8712000 Low Mappability +chr2R 8867500 8873800 High Signal Region +chr2R 8883000 8885600 High Signal Region +chr2R 9981000 9997000 Low Mappability +chr2R 10076400 10082900 High Signal Region +chr2R 10776800 10785300 Low Mappability +chr2R 11985200 11992700 High Signal Region +chr2R 13034800 13040100 Low Mappability +chr2R 13344900 13346800 High Signal Region +chr2R 13569800 13571700 High Signal Region +chr2R 14243000 14260400 High Signal Region +chr2R 14463000 14469700 Low Mappability +chr2R 14745600 14747800 Low Mappability +chr2R 15616900 15653700 High Signal Region +chr2R 15663700 15667500 Low Mappability +chr2R 16667200 16675500 Low Mappability +chr2R 16882700 16885400 High Signal Region +chr2R 17038700 17049200 High Signal Region +chr2R 17532800 17535100 High Signal Region +chr2R 18413300 18417100 Low Mappability +chr2R 19865400 19867600 High Signal Region +chr2R 20897600 20900500 High Signal Region +chr2R 21144900 21146700 Low Mappability +chr3LHet 1345100 1347600 High Signal Region +chr3LHet 2162700 2187800 High Signal Region +chr3LHet 2202300 2209300 Low Mappability +chr3LHet 2244300 2253000 Low Mappability +chr3L 130400 133100 High Signal Region +chr3L 223200 226000 High Signal Region +chr3L 270300 272600 High Signal Region +chr3L 318400 320800 High Signal Region +chr3L 539500 544400 High Signal Region +chr3L 748200 750200 High Signal Region +chr3L 1334000 1336300 High Signal Region +chr3L 1545400 1547500 High Signal Region +chr3L 1567700 1570700 High Signal Region +chr3L 1793900 1796200 High Signal Region +chr3L 2063400 2069800 High Signal Region +chr3L 2585300 2590700 High Signal Region +chr3L 3059100 3071600 High Signal Region +chr3L 3147900 3150300 High Signal Region +chr3L 3218400 3227200 High Signal Region +chr3L 3896400 3905700 High Signal Region +chr3L 4133100 4139800 High Signal Region +chr3L 5104000 5117900 Low Mappability +chr3L 7349700 7355100 High Signal Region +chr3L 7662100 7684600 High Signal Region +chr3L 7972100 7981100 Low Mappability +chr3L 8012400 8017600 High Signal Region +chr3L 8784200 8790000 Low Mappability +chr3L 9385600 9395900 High Signal Region +chr3L 9415500 9424500 High Signal Region +chr3L 9569100 9574400 Low Mappability +chr3L 10729500 10731200 High Signal Region +chr3L 11238800 11246200 High Signal Region +chr3L 11479900 11481800 High Signal Region +chr3L 11545300 11547300 High Signal Region +chr3L 11605800 11612700 High Signal Region +chr3L 11955900 11966000 High Signal Region +chr3L 14747500 14755700 High Signal Region +chr3L 14773500 14784000 High Signal Region +chr3L 15134000 15138400 High Signal Region +chr3L 15818200 15820000 High Signal Region +chr3L 16038000 16046600 High Signal Region +chr3L 16639900 16641900 High Signal Region +chr3L 16653500 16655400 High Signal Region +chr3L 17003800 17006300 High Signal Region +chr3L 17636700 17638700 High Signal Region +chr3L 18827000 18834000 High Signal Region +chr3L 19887800 19909000 High Signal Region +chr3L 20391900 20395600 High Signal Region +chr3L 20466800 20477400 High Signal Region +chr3L 20510900 20513100 High Signal Region +chr3L 20808600 20818200 High Signal Region +chr3L 21000400 21022000 High Signal Region +chr3L 21358800 21371300 Low Mappability +chr3L 22092600 22099100 Low Mappability +chr3L 22734700 22738400 Low Mappability +chr3L 22754300 22760100 Low Mappability +chr3L 23817900 23833100 High Signal Region +chr3L 23935400 23941300 Low Mappability +chr3L 24447200 24484400 Low Mappability +chr3RHet 43700 62000 High Signal Region +chr3RHet 1342700 1348400 Low Mappability +chr3RHet 1508900 1524800 Low Mappability +chr3RHet 1816700 1834500 High Signal Region +chr3RHet 1947200 1958800 High Signal Region +chr3RHet 2307400 2309300 Low Mappability +chr3R 228600 238600 Low Mappability +chr3R 509000 510400 High Signal Region +chr3R 564200 566200 High Signal Region +chr3R 777000 779000 High Signal Region +chr3R 828100 833700 High Signal Region +chr3R 871500 878800 Low Mappability +chr3R 911600 914500 High Signal Region +chr3R 1076200 1078200 High Signal Region +chr3R 1424600 1427600 High Signal Region +chr3R 1448500 1451200 High Signal Region +chr3R 2230300 2234000 High Signal Region +chr3R 2645100 2649200 High Signal Region +chr3R 2899200 2916800 High Signal Region +chr3R 2933000 2935200 High Signal Region +chr3R 3176400 3180900 High Signal Region +chr3R 3917000 3932800 Low Mappability +chr3R 4396100 4400900 Low Mappability +chr3R 4872100 4884300 High Signal Region +chr3R 5242900 5245900 High Signal Region +chr3R 5335200 5343100 High Signal Region +chr3R 5376200 5378000 High Signal Region +chr3R 5415800 5418000 High Signal Region +chr3R 5454700 5457000 High Signal Region +chr3R 5510100 5537700 High Signal Region +chr3R 5697900 5701200 High Signal Region +chr3R 6080700 6091100 Low Mappability +chr3R 6167400 6182800 High Signal Region +chr3R 6207000 6215100 High Signal Region +chr3R 7583800 7590800 High Signal Region +chr3R 7779600 7786900 High Signal Region +chr3R 8228800 8230500 High Signal Region +chr3R 8290300 8337000 High Signal Region +chr3R 8452400 8454700 High Signal Region +chr3R 9509100 9511200 High Signal Region +chr3R 10109000 10113200 High Signal Region +chr3R 10548800 10550700 High Signal Region +chr3R 10920100 10922000 High Signal Region +chr3R 10956400 10966900 High Signal Region +chr3R 11112800 11118600 High Signal Region +chr3R 11798100 11800500 High Signal Region +chr3R 12054400 12069200 High Signal Region +chr3R 12074500 12081400 High Signal Region +chr3R 12813500 12821900 High Signal Region +chr3R 13506900 13509400 High Signal Region +chr3R 13542200 13544300 High Signal Region +chr3R 13751200 13753400 Low Mappability +chr3R 14022000 14025900 High Signal Region +chr3R 14962500 14964700 Low Mappability +chr3R 17121500 17134300 High Signal Region +chr3R 17173800 17176100 High Signal Region +chr3R 17430600 17445700 Low Mappability +chr3R 17456100 17459600 High Signal Region +chr3R 18275900 18279300 High Signal Region +chr3R 19358600 19360500 High Signal Region +chr3R 19383900 19386200 Low Mappability +chr3R 19715100 19717300 High Signal Region +chr3R 19902300 19904500 Low Mappability +chr3R 19929900 19934800 High Signal Region +chr3R 20407300 20409000 High Signal Region +chr3R 20874800 20877200 High Signal Region +chr3R 22922500 22923900 High Signal Region +chr3R 22966200 22977000 High Signal Region +chr3R 23406600 23408200 High Signal Region +chr3R 23551000 23556900 Low Mappability +chr3R 23682500 23694400 Low Mappability +chr3R 23894000 23899900 Low Mappability +chr3R 24151200 24153300 High Signal Region +chr3R 24889000 24891200 High Signal Region +chr3R 25563700 25565800 Low Mappability +chr3R 25910200 25912400 Low Mappability +chr3R 26900000 26906600 High Signal Region +chr3R 27041200 27048400 High Signal Region +chr3R 27238900 27243600 High Signal Region +chr3R 27433400 27437700 High Signal Region +chr3R 27572500 27575000 High Signal Region +chr3R 27893200 27905000 High Signal Region +chr4 97100 102500 Low Mappability +chr4 1278500 1351800 High Signal Region +chrXHet 32400 43100 Low Mappability +chrXHet 87400 132300 High Signal Region +chrX 0 18800 High Signal Region +chrX 322300 328700 Low Mappability +chrX 1251600 1275300 High Signal Region +chrX 2012900 2033200 High Signal Region +chrX 2504400 2514500 Low Mappability +chrX 2683600 2687100 High Signal Region +chrX 2964000 2975200 Low Mappability +chrX 3308900 3315500 Low Mappability +chrX 3620500 3624500 Low Mappability +chrX 3684200 3699100 High Signal Region +chrX 3834600 3844200 High Signal Region +chrX 4812700 4831100 High Signal Region +chrX 4884100 4891200 High Signal Region +chrX 6065700 6073000 High Signal Region +chrX 7019400 7028400 High Signal Region +chrX 7374800 7376400 High Signal Region +chrX 7791300 7793200 High Signal Region +chrX 7949800 7957700 High Signal Region +chrX 8186900 8190800 High Signal Region +chrX 8821300 8824300 Low Mappability +chrX 9517700 9520200 High Signal Region +chrX 10657000 10663600 High Signal Region +chrX 10990100 10997200 Low Mappability +chrX 11206200 11212900 High Signal Region +chrX 11473900 11494400 High Signal Region +chrX 11527500 11542700 Low Mappability +chrX 11607000 11609700 High Signal Region +chrX 12824600 12831700 Low Mappability +chrX 15705000 15706900 High Signal Region +chrX 15907200 15953600 High Signal Region +chrX 18323300 18329000 Low Mappability +chrX 18676100 18682200 High Signal Region +chrX 18757000 18759500 High Signal Region +chrX 19247000 19252800 Low Mappability +chrX 20070100 20101800 High Signal Region +chrX 21611900 21630800 High Signal Region +chrX 21833900 21835900 High Signal Region +chrX 21924100 21927700 Low Mappability +chrYHet 125600 138300 Low Mappability +chrYHet 195300 225100 High Signal Region diff --git a/assets/blacklists/v2.0/dm6-blacklist.v2.bed b/assets/blacklists/v2.0/dm6-blacklist.v2.bed new file mode 100644 index 000000000..65a220b82 --- /dev/null +++ b/assets/blacklists/v2.0/dm6-blacklist.v2.bed @@ -0,0 +1,182 @@ +chr2L 154500 167500 High Signal Region +chr2L 348000 365800 High Signal Region +chr2L 471400 482200 High Signal Region +chr2L 2191400 2200900 High Signal Region +chr2L 2749200 2756400 High Signal Region +chr2L 3161500 3164200 High Signal Region +chr2L 4536500 4544800 High Signal Region +chr2L 4938100 4941000 High Signal Region +chr2L 5206500 5210500 High Signal Region +chr2L 5827800 5836700 High Signal Region +chr2L 5976700 5987500 High Signal Region +chr2L 7343400 7349300 High Signal Region +chr2L 9898700 9902900 High Signal Region +chr2L 11316200 11317600 High Signal Region +chr2L 11992200 12013200 High Signal Region +chr2L 16267500 16271800 High Signal Region +chr2L 16283900 16289200 High Signal Region +chr2L 18942900 18945600 High Signal Region +chr2L 20647200 20649100 High Signal Region +chr2L 21236600 21238800 High Signal Region +chr2L 21415900 21544200 High Signal Region +chr2L 21653300 21656300 High Signal Region +chr2L 22409400 22479400 High Signal Region +chr2L 22488500 22506800 High Signal Region +chr2L 22765200 22909700 High Signal Region +chr2L 23096400 23122300 High Signal Region +chr2L 23353200 23387900 High Signal Region +chr2L 23511900 23513700 High Signal Region +chr2R 0 14900 High Signal Region +chr2R 744200 878700 Low Mappability +chr2R 1492900 1530200 High Signal Region +chr2R 1818200 1840700 Low Mappability +chr2R 1931800 1949300 Low Mappability +chr2R 2158800 2169900 High Signal Region +chr2R 2218200 2238300 High Signal Region +chr2R 2652000 2665400 High Signal Region +chr2R 3601600 3603200 High Signal Region +chr2R 3718500 3775000 High Signal Region +chr2R 3943700 3998100 High Signal Region +chr2R 4274200 4275400 High Signal Region +chr2R 4863000 4884000 Low Mappability +chr2R 5046600 5057100 High Signal Region +chr2R 5105500 5110000 High Signal Region +chr2R 7235700 7250000 High Signal Region +chr2R 8015400 8018000 Low Mappability +chr2R 10177000 10186000 High Signal Region +chr2R 10948100 10955500 High Signal Region +chr2R 12586100 12594400 High Signal Region +chr2R 14188900 14195500 High Signal Region +chr2R 18575400 18582400 High Signal Region +chr2R 19715900 19766800 High Signal Region +chr2R 21151200 21153700 High Signal Region +chr2R 24177300 24184700 High Signal Region +chr2R 25257500 25286800 High Signal Region +chr3L 2063300 2069900 High Signal Region +chr3L 2447600 2456600 High Signal Region +chr3L 3899000 3903000 High Signal Region +chr3L 7669000 7691700 High Signal Region +chr3L 7978900 7987800 Low Mappability +chr3L 8019300 8024500 High Signal Region +chr3L 11968300 11972800 High Signal Region +chr3L 16596900 16607900 High Signal Region +chr3L 18833900 18840800 High Signal Region +chr3L 20473700 20484300 High Signal Region +chr3L 20815500 20825000 High Signal Region +chr3L 22099400 22106200 Low Mappability +chr3L 22761300 22767100 High Signal Region +chr3L 23111800 23118300 High Signal Region +chr3L 23825700 23839600 High Signal Region +chr3L 24384500 24445600 High Signal Region +chr3L 24576600 24669400 High Signal Region +chr3L 25051000 25054100 High Signal Region +chr3L 25129300 25135900 High Signal Region +chr3L 25962100 25964900 High Signal Region +chr3L 26877500 27082600 High Signal Region +chr3L 27137300 27140300 Low Mappability +chr3L 27471600 27649900 High Signal Region +chr3R 0 32600 High Signal Region +chr3R 43000 82600 High Signal Region +chr3R 236900 285000 High Signal Region +chr3R 499300 529400 High Signal Region +chr3R 1271100 1279000 Low Mappability +chr3R 1369500 1390500 Low Mappability +chr3R 2619300 2623900 High Signal Region +chr3R 2749700 2768300 High Signal Region +chr3R 2775800 2782000 Low Mappability +chr3R 3032500 3058100 High Signal Region +chr3R 3087400 3136500 High Signal Region +chr3R 3168900 3171300 Low Mappability +chr3R 3697900 3702100 High Signal Region +chr3R 4738400 4740500 High Signal Region +chr3R 4951200 4953300 High Signal Region +chr3R 5002300 5009200 High Signal Region +chr3R 5045500 5053200 Low Mappability +chr3R 5085900 5088400 High Signal Region +chr3R 5598800 5602000 High Signal Region +chr3R 5622700 5625500 High Signal Region +chr3R 6404600 6408200 High Signal Region +chr3R 6819500 6823400 High Signal Region +chr3R 7073500 7076300 High Signal Region +chr3R 7107300 7109400 High Signal Region +chr3R 8091300 8107100 Low Mappability +chr3R 8570200 8575500 Low Mappability +chr3R 9046400 9058600 High Signal Region +chr3R 9351800 9354100 High Signal Region +chr3R 9417100 9420200 High Signal Region +chr3R 9509400 9517300 High Signal Region +chr3R 9550400 9552400 High Signal Region +chr3R 9590000 9592300 High Signal Region +chr3R 9629000 9631300 High Signal Region +chr3R 9684500 9712000 High Signal Region +chr3R 10255100 10265400 Low Mappability +chr3R 10341700 10357100 High Signal Region +chr3R 10377600 10389400 High Signal Region +chr3R 11758100 11765200 High Signal Region +chr3R 11948900 11961000 High Signal Region +chr3R 12464500 12511200 High Signal Region +chr3R 12626600 12629000 High Signal Region +chr3R 13683300 13685500 High Signal Region +chr3R 14283200 14287500 High Signal Region +chr3R 14696300 14698100 High Signal Region +chr3R 14723000 14725100 High Signal Region +chr3R 15094300 15096400 High Signal Region +chr3R 15130700 15135000 High Signal Region +chr3R 15286000 15292900 High Signal Region +chr3R 15972300 15974800 High Signal Region +chr3R 16224000 16243500 High Signal Region +chr3R 16248800 16255800 High Signal Region +chr3R 16987900 16996000 High Signal Region +chr3R 17681200 17683700 High Signal Region +chr3R 17716400 17718700 High Signal Region +chr3R 17925400 17927800 High Signal Region +chr3R 18196300 18200300 High Signal Region +chr3R 21295600 21308400 High Signal Region +chr3R 21348100 21350400 High Signal Region +chr3R 21604900 21620100 Low Mappability +chr3R 21630200 21633900 High Signal Region +chr3R 22450200 22453500 High Signal Region +chr3R 23889300 23891600 High Signal Region +chr3R 24076500 24078900 Low Mappability +chr3R 24104200 24109100 High Signal Region +chr3R 24581500 24590000 High Signal Region +chr3R 25049000 25051400 High Signal Region +chr3R 27140500 27151400 High Signal Region +chr3R 27580600 27582500 High Signal Region +chr3R 27856800 27868700 Low Mappability +chr3R 28325400 28327600 High Signal Region +chr3R 29063200 29065500 High Signal Region +chr3R 29737800 29740200 Low Mappability +chr3R 30084400 30086800 Low Mappability +chr3R 31215500 31222700 High Signal Region +chr3R 31413100 31417800 High Signal Region +chr3R 31607700 31611900 High Signal Region +chr3R 31746800 31749300 High Signal Region +chr3R 32067500 32079300 Low Mappability +chr4 1274800 1348100 High Signal Region +chrX 0 122400 High Signal Region +chrX 201200 246300 High Signal Region +chrX 2610300 2617700 High Signal Region +chrX 4921800 4937000 High Signal Region +chrX 4990100 4997200 High Signal Region +chrX 7125300 7134300 High Signal Region +chrX 8292900 8296800 High Signal Region +chrX 11487700 11494000 High Signal Region +chrX 16013200 16059600 High Signal Region +chrX 19907800 19958400 High Signal Region +chrX 22257600 22401900 High Signal Region +chrX 22432100 22434100 High Signal Region +chrX 22996400 23003500 High Signal Region +chrX 23019600 23022700 Low Mappability +chrX 23204900 23285000 High Signal Region +chrX 23290700 23442900 High Signal Region +chrX 23450200 23465000 Low Mappability +chrX 23471400 23489900 Low Mappability +chrX 23512700 23539400 Low Mappability +chrY 113900 125600 High Signal Region +chrY 131500 155700 High Signal Region +chrY 199800 248700 High Signal Region +chrY 313600 325400 High Signal Region +chrY 641400 654100 Low Mappability +chrY 1456900 1693500 High Signal Region +chrY 3641100 3667300 High Signal Region diff --git a/assets/blacklists/v2.0/hg19-blacklist.v2.bed b/assets/blacklists/v2.0/hg19-blacklist.v2.bed new file mode 100644 index 000000000..03688d91e --- /dev/null +++ b/assets/blacklists/v2.0/hg19-blacklist.v2.bed @@ -0,0 +1,834 @@ +chr10 38726200 42489100 High Signal Region +chr10 42524900 42819200 High Signal Region +chr10 98560400 98562500 High Signal Region +chr10 135437600 135534700 High Signal Region +chr11 0 196300 High Signal Region +chr11 584400 586500 High Signal Region +chr11 964000 966100 Low Mappability +chr11 1015700 1019100 High Signal Region +chr11 1088800 1094300 High Signal Region +chr11 1141100 1214300 High Signal Region +chr11 3674100 3676900 Low Mappability +chr11 6830800 6832700 High Signal Region +chr11 10528500 10532700 Low Mappability +chr11 11267200 11269500 High Signal Region +chr11 48700000 48964800 High Signal Region +chr11 50505600 50523400 High Signal Region +chr11 50635500 51200100 High Signal Region +chr11 51244400 51289000 High Signal Region +chr11 51566300 54834600 High Signal Region +chr11 54876800 55028400 High Signal Region +chr11 62606300 62651300 High Signal Region +chr11 77596600 77601800 High Signal Region +chr11 85172700 85196400 High Signal Region +chr11 93965500 93984500 High Signal Region +chr11 100156600 100162500 High Signal Region +chr11 102239800 102246000 High Signal Region +chr11 129208700 129234600 High Signal Region +chr12 0 187000 High Signal Region +chr12 479900 531700 High Signal Region +chr12 2364000 2366100 High Signal Region +chr12 2628700 2649700 Low Mappability +chr12 4618500 4624000 High Signal Region +chr12 6037400 6042400 Low Mappability +chr12 7705200 7717600 High Signal Region +chr12 19881600 19887000 High Signal Region +chr12 20703400 20705400 High Signal Region +chr12 20921400 20928000 High Signal Region +chr12 34371700 34400000 High Signal Region +chr12 34574500 34576400 Low Mappability +chr12 34761600 37887400 High Signal Region +chr12 37989200 38259900 High Signal Region +chr12 38330900 38375800 Low Mappability +chr12 38443400 38503500 High Signal Region +chr12 38534900 38537700 High Signal Region +chr12 41756500 41758400 Low Mappability +chr12 54205000 54206900 High Signal Region +chr12 66867700 66872600 High Signal Region +chr12 69385000 69391000 High Signal Region +chr12 70167100 70204100 High Signal Region +chr12 75903800 75916900 High Signal Region +chr12 93771900 93808100 High Signal Region +chr12 97117400 97122300 High Signal Region +chr12 101540100 101549000 High Signal Region +chr12 113517400 113519300 High Signal Region +chr12 125394300 125426400 Low Mappability +chr12 126072900 126074800 Low Mappability +chr12 127649500 127651900 High Signal Region +chr12 130863600 130878600 High Signal Region +chr12 132060500 132074200 High Signal Region +chr12 133343000 133345000 High Signal Region +chr12 133825400 133851800 Low Mappability +chr13 0 19194200 High Signal Region +chr13 19344200 19447900 High Signal Region +chr13 19641600 19652000 High Signal Region +chr13 19677800 19683400 High Signal Region +chr13 19711000 19713300 High Signal Region +chr13 20051500 20077000 Low Mappability +chr13 20150200 20228600 High Signal Region +chr13 20352400 20372400 High Signal Region +chr13 20966500 20984700 High Signal Region +chr13 21068500 21072900 High Signal Region +chr13 21816000 21826300 High Signal Region +chr13 21950600 21952600 High Signal Region +chr13 22125500 22129800 High Signal Region +chr13 22429700 22436000 High Signal Region +chr13 23095400 23108300 Low Mappability +chr13 24900500 24932100 High Signal Region +chr13 25122300 25128600 High Signal Region +chr13 26467000 26472000 Low Mappability +chr13 27977100 28035000 High Signal Region +chr13 28710500 28733700 High Signal Region +chr13 29767400 29769600 High Signal Region +chr13 30215700 30247400 Low Mappability +chr13 30397900 30426100 High Signal Region +chr13 30787000 30790100 High Signal Region +chr13 30819100 30845000 High Signal Region +chr13 31412800 31440600 High Signal Region +chr13 31521900 31523400 High Signal Region +chr13 31916200 31920700 High Signal Region +chr13 31970100 31971800 High Signal Region +chr13 33109900 33114000 High Signal Region +chr13 33149400 33182100 High Signal Region +chr13 33441700 33443500 Low Mappability +chr13 34163100 34164900 High Signal Region +chr13 34558900 34565000 High Signal Region +chr13 35054300 35073100 High Signal Region +chr13 35656000 35664300 High Signal Region +chr13 35977500 36001800 High Signal Region +chr13 36531200 36553700 High Signal Region +chr13 36582200 36588400 High Signal Region +chr13 37723900 37730200 High Signal Region +chr13 38396200 38402300 Low Mappability +chr13 38640900 38645800 High Signal Region +chr13 38687300 38721000 High Signal Region +chr13 40422400 40427800 High Signal Region +chr13 40560400 40580700 Low Mappability +chr13 40920400 40936600 Low Mappability +chr13 41309000 41315200 Low Mappability +chr13 41343800 41416000 High Signal Region +chr13 41438500 41477300 High Signal Region +chr13 41530500 41640400 High Signal Region +chr13 42108700 42114800 High Signal Region +chr13 42165400 42243300 High Signal Region +chr13 42321000 42324400 High Signal Region +chr13 42445300 42448800 High Signal Region +chr13 42479700 42497900 High Signal Region +chr13 42928200 42961000 Low Mappability +chr13 42999000 43005200 Low Mappability +chr13 43128800 43132300 High Signal Region +chr13 43734900 43740400 High Signal Region +chr13 44391900 44409800 Low Mappability +chr13 44540800 44550400 High Signal Region +chr13 45491200 45494100 High Signal Region +chr13 46190900 46244300 High Signal Region +chr13 47322400 47347500 Low Mappability +chr13 47795600 47799800 Low Mappability +chr13 48288000 48379400 High Signal Region +chr13 48551900 48636200 High Signal Region +chr13 48776900 48781200 High Signal Region +chr13 48955700 49045800 High Signal Region +chr13 49587600 49593700 High Signal Region +chr13 49726300 49750700 High Signal Region +chr13 50655600 50674000 High Signal Region +chr13 50739500 50760400 High Signal Region +chr13 50804000 50831700 High Signal Region +chr13 51045000 51047900 Low Mappability +chr13 51069400 51148800 High Signal Region +chr13 51538700 51562300 High Signal Region +chr13 51643200 51654900 High Signal Region +chr13 52056600 52177400 High Signal Region +chr13 52209900 52311100 High Signal Region +chr13 52628400 52634200 Low Mappability +chr13 52767000 52908600 High Signal Region +chr13 53056600 53198500 High Signal Region +chr13 53667700 53672500 Low Mappability +chr13 54170800 54195600 High Signal Region +chr13 55314400 55316200 Low Mappability +chr13 55924900 55928900 Low Mappability +chr13 56386000 56387700 Low Mappability +chr13 57149500 57152400 High Signal Region +chr13 57613800 57615800 Low Mappability +chr13 57713200 57748000 High Signal Region +chr13 57793400 57794800 High Signal Region +chr13 57929500 57933400 Low Mappability +chr13 58055700 58068300 High Signal Region +chr13 58756200 58759000 High Signal Region +chr13 59246600 59252600 Low Mappability +chr13 60399100 60401600 Low Mappability +chr13 60558600 60561900 Low Mappability +chr13 60819900 60825800 High Signal Region +chr13 60868000 60870400 Low Mappability +chr13 61508300 61510400 High Signal Region +chr13 62142000 62143900 Low Mappability +chr13 62379800 62381800 High Signal Region +chr13 62407700 62419700 High Signal Region +chr13 63602300 63649700 High Signal Region +chr13 64291000 64343600 Low Mappability +chr13 64395200 64410800 Low Mappability +chr13 66567000 66569000 Low Mappability +chr13 66827800 66833700 High Signal Region +chr13 67311600 67317700 Low Mappability +chr13 67350200 67352500 High Signal Region +chr13 68136600 68139600 Low Mappability +chr13 68254200 68260100 High Signal Region +chr13 68566600 68570000 High Signal Region +chr13 68901600 68915400 High Signal Region +chr13 70357600 70362900 Low Mappability +chr13 70783800 70789000 High Signal Region +chr13 71751300 71752700 High Signal Region +chr13 71958500 71963800 High Signal Region +chr13 72799900 72802600 High Signal Region +chr13 73184400 73190500 High Signal Region +chr13 74027000 74033300 High Signal Region +chr13 74202200 74220800 High Signal Region +chr13 74809900 74816100 High Signal Region +chr13 75111000 75116700 High Signal Region +chr13 75606300 75608100 Low Mappability +chr13 75653600 75655800 High Signal Region +chr13 75815200 75821400 High Signal Region +chr13 76251800 76322500 High Signal Region +chr13 76528000 76532300 High Signal Region +chr13 76841900 76843700 High Signal Region +chr13 77119100 77122400 Low Mappability +chr13 77179200 77192700 Low Mappability +chr13 77773200 77779300 High Signal Region +chr13 78250500 78260900 Low Mappability +chr13 78453800 78455300 High Signal Region +chr13 78857200 78859700 High Signal Region +chr13 79087100 79105000 High Signal Region +chr13 79590600 79592200 High Signal Region +chr13 79809800 79811600 High Signal Region +chr13 80391100 80420000 High Signal Region +chr13 80726100 80730600 Low Mappability +chr13 81490500 81492700 Low Mappability +chr13 81638000 81651500 High Signal Region +chr13 82132700 82135500 Low Mappability +chr13 82322400 82327400 High Signal Region +chr13 82619500 82625600 Low Mappability +chr13 82805900 82809300 High Signal Region +chr13 83315600 83317200 Low Mappability +chr13 84095600 84097700 High Signal Region +chr13 84535300 84540600 High Signal Region +chr13 85075900 85078300 Low Mappability +chr13 85299500 85302300 High Signal Region +chr13 85695400 85703500 High Signal Region +chr13 86143500 86147200 Low Mappability +chr13 86485900 86502200 Low Mappability +chr13 86572000 86573600 High Signal Region +chr13 87297900 87303700 High Signal Region +chr13 88351600 88353900 High Signal Region +chr13 89335000 89337000 Low Mappability +chr13 89482500 89486800 Low Mappability +chr13 89740300 89746300 Low Mappability +chr13 91181200 91182800 Low Mappability +chr13 91305800 91322300 Low Mappability +chr13 92256000 92259400 High Signal Region +chr13 92622900 92628600 High Signal Region +chr13 93127200 93129400 Low Mappability +chr13 93170900 93175000 High Signal Region +chr13 94140200 94148600 High Signal Region +chr13 95024400 95030600 Low Mappability +chr13 95471000 95472500 Low Mappability +chr13 95561600 95563600 High Signal Region +chr13 96217900 96220200 High Signal Region +chr13 96377900 96393100 High Signal Region +chr13 96481000 96493700 High Signal Region +chr13 96556500 96572100 High Signal Region +chr13 96616700 96633300 Low Mappability +chr13 96699300 96705200 High Signal Region +chr13 97807500 97812400 High Signal Region +chr13 97873500 98016000 High Signal Region +chr13 98083600 98086200 High Signal Region +chr13 98256400 98266100 Low Mappability +chr13 99386700 99407200 High Signal Region +chr13 100970400 100973100 High Signal Region +chr13 101327900 101356500 Low Mappability +chr13 102191500 102196900 High Signal Region +chr13 102250800 102254200 High Signal Region +chr13 102293700 102296000 High Signal Region +chr13 102560800 102562600 High Signal Region +chr13 103174700 103180600 High Signal Region +chr13 103770000 103772400 High Signal Region +chr13 104155400 104159600 High Signal Region +chr13 105306100 105307700 Low Mappability +chr13 105609500 105613300 High Signal Region +chr13 105951400 105953800 Low Mappability +chr13 106035100 106040800 Low Mappability +chr13 106536800 106542400 High Signal Region +chr13 106651900 106669100 High Signal Region +chr13 106866200 106872100 High Signal Region +chr13 107430500 107436700 High Signal Region +chr13 108868800 108909300 Low Mappability +chr13 109162700 109168900 High Signal Region +chr13 110075500 110098100 Low Mappability +chr13 110691900 110705300 High Signal Region +chr13 111036900 111039000 High Signal Region +chr13 111107500 111163000 High Signal Region +chr13 111512100 111527200 High Signal Region +chr13 111959100 111964000 High Signal Region +chr13 111992000 111994500 Low Mappability +chr13 112148400 112153300 High Signal Region +chr13 112628400 112630400 High Signal Region +chr13 112668600 112670300 High Signal Region +chr13 112931200 112973400 High Signal Region +chr13 113179900 113244400 High Signal Region +chr13 113319400 113321900 High Signal Region +chr13 113440500 113444300 High Signal Region +chr13 113526200 113540600 High Signal Region +chr13 113765500 113767700 High Signal Region +chr13 113916300 113951000 Low Mappability +chr13 114089500 114102600 High Signal Region +chr13 114191600 114218700 High Signal Region +chr13 114247100 114280800 High Signal Region +chr13 114452900 114520000 High Signal Region +chr13 114553300 114571100 High Signal Region +chr13 114601800 114772500 High Signal Region +chr13 114848900 114852600 High Signal Region +chr14 0 20303800 High Signal Region +chr14 27098600 27104100 High Signal Region +chr14 32263100 32280800 High Signal Region +chr14 32350600 32352500 High Signal Region +chr14 32934800 32955200 Low Mappability +chr14 35006400 35031800 Low Mappability +chr14 36416700 36419200 High Signal Region +chr14 39980200 39995800 High Signal Region +chr14 54700600 54706600 High Signal Region +chr14 67508000 67534600 High Signal Region +chr14 80556900 80561000 High Signal Region +chr14 86540300 86577300 High Signal Region +chr14 87058300 87078200 High Signal Region +chr14 87879900 87894500 High Signal Region +chr14 88236600 88243300 High Signal Region +chr14 90340400 90342300 High Signal Region +chr14 102140800 102142700 High Signal Region +chr14 105681400 105707200 High Signal Region +chr14 106034900 106185200 High Signal Region +chr14 107151000 107176900 High Signal Region +chr15 0 20166200 High Signal Region +chr15 20200400 22365100 High Signal Region +chr15 22387400 22749100 Low Mappability +chr15 23266700 23612800 High Signal Region +chr15 26002700 26004600 Low Mappability +chr15 28538400 28956300 High Signal Region +chr15 30358500 30919300 High Signal Region +chr15 31136500 31143800 Low Mappability +chr15 32445900 32915200 High Signal Region +chr15 56603300 56608500 High Signal Region +chr15 69255900 69257800 High Signal Region +chr15 72085400 72090500 High Signal Region +chr15 72923800 72979000 Low Mappability +chr15 74357800 74398000 High Signal Region +chr15 75546200 75592100 High Signal Region +chr15 77991000 77993000 High Signal Region +chr15 82582300 83213900 High Signal Region +chr15 84835000 85142500 High Signal Region +chr15 85732700 85814600 High Signal Region +chr15 102283600 102305300 Low Mappability +chr15 102411600 102531300 High Signal Region +chr16 32923000 33427100 High Signal Region +chr16 33726300 34197900 High Signal Region +chr16 35191100 46501300 High Signal Region +chr16 90155800 90354700 Low Mappability +chr17 66700 167600 High Signal Region +chr17 964700 969400 High Signal Region +chr17 1210900 1236400 Low Mappability +chr17 4734800 4736700 Low Mappability +chr17 18928600 19140800 High Signal Region +chr17 21492100 21686000 High Signal Region +chr17 21901400 21908600 High Signal Region +chr17 22019700 22024900 High Signal Region +chr17 22207000 25341300 High Signal Region +chr17 30264500 30277600 High Signal Region +chr17 31148500 31150800 High Signal Region +chr17 33477200 33479300 High Signal Region +chr17 34476000 34812200 Low Mappability +chr17 36253600 36406900 High Signal Region +chr17 41378900 41402100 High Signal Region +chr17 41432200 41467700 High Signal Region +chr17 43588700 43718700 High Signal Region +chr17 45108700 45130400 Low Mappability +chr17 45211900 45283300 High Signal Region +chr17 45612500 45671300 Low Mappability +chr17 51182300 51184600 Low Mappability +chr17 64794200 64796200 Low Mappability +chr17 78717100 78719200 Low Mappability +chr17 81151700 81195200 Low Mappability +chr18 0 127000 High Signal Region +chr18 952000 976900 High Signal Region +chr18 2247200 2253300 High Signal Region +chr18 2841300 2866100 Low Mappability +chr18 6687500 6705800 High Signal Region +chr18 12134400 12227800 High Signal Region +chr18 14163200 14270800 High Signal Region +chr18 15139700 15271400 High Signal Region +chr18 15293900 18552900 High Signal Region +chr18 19792100 19813600 High Signal Region +chr18 20109800 20115600 High Signal Region +chr18 20388600 20400600 High Signal Region +chr18 27088800 27090300 High Signal Region +chr18 28927900 28933700 High Signal Region +chr18 30436500 30442100 High Signal Region +chr18 32114600 32137900 High Signal Region +chr18 32924100 32938700 High Signal Region +chr18 33196300 33213600 High Signal Region +chr18 33342300 33346200 High Signal Region +chr18 38424600 38428200 High Signal Region +chr18 42024800 42028200 High Signal Region +chr18 42607900 42611000 High Signal Region +chr18 44125300 44127400 High Signal Region +chr18 44503000 44515000 High Signal Region +chr18 44541400 44558200 High Signal Region +chr18 45378700 45380700 Low Mappability +chr18 46175800 46204100 High Signal Region +chr18 46572200 46634900 High Signal Region +chr18 47297100 47302900 High Signal Region +chr18 50318200 50320200 High Signal Region +chr18 52710600 52712900 High Signal Region +chr18 53382700 53388400 High Signal Region +chr18 54391800 54393600 High Signal Region +chr18 60853700 60886800 High Signal Region +chr18 61530100 61533700 High Signal Region +chr18 68386500 68419400 High Signal Region +chr18 74678000 74695900 High Signal Region +chr18 76196600 76198900 Low Mappability +chr18 76272400 76275200 High Signal Region +chr18 76773800 76800400 High Signal Region +chr18 77031200 77124400 High Signal Region +chr18 77233300 77236000 High Signal Region +chr18 77377700 77394500 High Signal Region +chr18 77679100 77681700 High Signal Region +chr18 77772000 77796400 High Signal Region +chr19 7514300 7516900 High Signal Region +chr19 8850900 8910700 High Signal Region +chr19 24182700 24198600 High Signal Region +chr19 24501500 27995100 High Signal Region +chr19 35349800 35357000 High Signal Region +chr19 36065600 36067700 High Signal Region +chr19 37756400 37795100 High Signal Region +chr19 44912700 44921200 High Signal Region +chr19 44958200 44964700 Low Mappability +chr19 48406200 48463100 High Signal Region +chr19 50593500 50643700 High Signal Region +chr1 0 750100 High Signal Region +chr1 814500 845200 High Signal Region +chr1 2052400 2056000 High Signal Region +chr1 2582800 2693900 High Signal Region +chr1 4362200 4364300 High Signal Region +chr1 5714800 5736800 High Signal Region +chr1 16821600 17301500 High Signal Region +chr1 38076400 38078300 Low Mappability +chr1 91836500 91854100 High Signal Region +chr1 120531600 120896300 High Signal Region +chr1 120926100 121149300 High Signal Region +chr1 121341500 145396500 High Signal Region +chr1 147424800 147731700 High Signal Region +chr1 147832000 149058800 High Signal Region +chr1 152185700 152191100 High Signal Region +chr1 156185300 156187600 High Signal Region +chr1 161392300 161442700 High Signal Region +chr1 168317300 168322800 High Signal Region +chr1 203888700 203890700 High Signal Region +chr1 224175500 224213600 High Signal Region +chr1 228743700 228782800 High Signal Region +chr1 236876100 236879100 Low Mappability +chr1 237765500 237767500 High Signal Region +chr1 246980600 246982700 High Signal Region +chr1 249225300 249250600 High Signal Region +chr20 25733100 25945000 Low Mappability +chr20 25984200 26150000 Low Mappability +chr20 26184300 29519700 High Signal Region +chr20 29546800 29853000 High Signal Region +chr20 46521400 46531600 High Signal Region +chr20 47130700 47133900 High Signal Region +chr20 62887700 63025500 Low Mappability +chr21 9594900 10366000 High Signal Region +chr21 10491900 10494000 Low Mappability +chr21 10646000 10861500 High Signal Region +chr21 11004200 14370200 High Signal Region +chr22 0 16962100 High Signal Region +chr22 17348200 17393500 Low Mappability +chr22 17494600 17519200 Low Mappability +chr22 18358700 18361200 High Signal Region +chr22 18657400 18889800 High Signal Region +chr22 20304800 20708400 High Signal Region +chr22 21466100 21916600 High Signal Region +chr22 23826900 23829900 Low Mappability +chr22 33517600 33519500 High Signal Region +chr22 36280800 36282700 Low Mappability +chr22 51058600 51083400 High Signal Region +chr22 51220000 51304500 High Signal Region +chr2 2298400 2300500 Low Mappability +chr2 3183400 3185800 High Signal Region +chr2 13858600 13877800 High Signal Region +chr2 33140400 33143500 High Signal Region +chr2 49455800 49457900 Low Mappability +chr2 62956900 62981700 High Signal Region +chr2 70656600 70659500 High Signal Region +chr2 86882000 86896800 High Signal Region +chr2 87441300 88290400 High Signal Region +chr2 89534800 89985900 High Signal Region +chr2 90267000 95326200 High Signal Region +chr2 95471500 95565900 Low Mappability +chr2 97718400 98232300 High Signal Region +chr2 109814800 109817200 High Signal Region +chr2 114147600 114441900 High Signal Region +chr2 132763200 132836700 Low Mappability +chr2 132946300 133122100 High Signal Region +chr2 149638400 149640300 Low Mappability +chr2 162134100 162148700 High Signal Region +chr2 230044500 230046500 High Signal Region +chr2 243052100 243199300 High Signal Region +chr3 612200 662600 Low Mappability +chr3 3762200 3767100 High Signal Region +chr3 4958300 4964200 High Signal Region +chr3 8414500 8434100 High Signal Region +chr3 15009100 15010800 Low Mappability +chr3 15228200 15245300 High Signal Region +chr3 16995500 17013700 Low Mappability +chr3 25740700 25759100 Low Mappability +chr3 26426200 26445700 High Signal Region +chr3 39913800 39931100 High Signal Region +chr3 43527700 43530900 Low Mappability +chr3 51490400 51496100 High Signal Region +chr3 63719200 63725000 High Signal Region +chr3 73159000 73161500 High Signal Region +chr3 75678100 75917700 High Signal Region +chr3 75982800 75999500 High Signal Region +chr3 78995600 78999800 High Signal Region +chr3 80490200 80492100 Low Mappability +chr3 80916400 80946200 High Signal Region +chr3 90205400 90224700 High Signal Region +chr3 90312300 93518500 High Signal Region +chr3 93957200 93959600 Low Mappability +chr3 96335200 96338100 Low Mappability +chr3 96457300 96459000 High Signal Region +chr3 98184700 98186900 High Signal Region +chr3 100827300 100833600 Low Mappability +chr3 107053900 107058800 Low Mappability +chr3 118633600 118639100 Low Mappability +chr3 135154400 135158200 High Signal Region +chr3 135304100 135329200 High Signal Region +chr3 139309800 139333000 High Signal Region +chr3 155996600 156002700 High Signal Region +chr3 157599200 157620600 High Signal Region +chr3 160658900 160666400 Low Mappability +chr3 169397300 169454100 High Signal Region +chr3 173977500 173983300 Low Mappability +chr3 175499400 175504900 High Signal Region +chr3 182734900 182736900 Low Mappability +chr3 183673200 183676500 High Signal Region +chr3 183796800 183798700 High Signal Region +chr3 185265900 185305500 Low Mappability +chr3 189237500 189238900 Low Mappability +chr3 195201400 195233900 Low Mappability +chr3 195341900 195476900 High Signal Region +chr3 195502200 195519800 High Signal Region +chr3 195640700 195745500 High Signal Region +chr3 196624700 196639200 High Signal Region +chr3 196757600 196762600 High Signal Region +chr3 197110400 197187600 High Signal Region +chr3 197325200 197407700 High Signal Region +chr3 197798000 198022400 High Signal Region +chr4 0 69600 High Signal Region +chr4 1420500 1478600 High Signal Region +chr4 9199300 9371400 High Signal Region +chr4 40293300 40341800 High Signal Region +chr4 49073900 52683800 High Signal Region +chr4 68263300 68273300 High Signal Region +chr4 70294400 70297700 High Signal Region +chr4 76806200 76808200 High Signal Region +chr4 80272500 80275600 High Signal Region +chr4 114909000 114911500 High Signal Region +chr4 120158500 120222800 High Signal Region +chr4 153843200 153846400 High Signal Region +chr4 167475600 167502500 Low Mappability +chr4 190153700 190157200 High Signal Region +chr4 190190600 190230500 High Signal Region +chr4 190469400 190685100 High Signal Region +chr4 190756300 190770700 High Signal Region +chr4 190795300 191154200 High Signal Region +chr5 0 85500 High Signal Region +chr5 629900 651800 High Signal Region +chr5 1326400 1334600 High Signal Region +chr5 2144800 2147800 High Signal Region +chr5 2490000 2491700 High Signal Region +chr5 3322200 3325200 High Signal Region +chr5 6967500 6971800 High Signal Region +chr5 14633500 14653400 Low Mappability +chr5 16335700 16341500 High Signal Region +chr5 17516900 17600400 High Signal Region +chr5 17631100 17633300 Low Mappability +chr5 21458600 21581100 High Signal Region +chr5 25360400 25384600 High Signal Region +chr5 32369500 32391600 High Signal Region +chr5 34177800 34246500 High Signal Region +chr5 45523000 45550600 High Signal Region +chr5 45932400 45978600 High Signal Region +chr5 46072400 46096800 High Signal Region +chr5 46239900 46241800 Low Mappability +chr5 46265500 49594200 High Signal Region +chr5 60055500 60058300 Low Mappability +chr5 68830000 70669400 High Signal Region +chr5 71145800 71149800 High Signal Region +chr5 73981300 74008300 High Signal Region +chr5 79945000 79949100 High Signal Region +chr5 80324700 80351700 High Signal Region +chr5 84936300 84958500 High Signal Region +chr5 90445100 90458900 High Signal Region +chr5 93283200 93284600 High Signal Region +chr5 93903700 93906100 Low Mappability +chr5 99381200 99426800 High Signal Region +chr5 113477000 113496900 High Signal Region +chr5 126439200 126461500 High Signal Region +chr5 130208300 130210400 High Signal Region +chr5 134258200 134265100 High Signal Region +chr5 136835200 136886000 High Signal Region +chr5 137304800 137310300 High Signal Region +chr5 138341100 138347500 High Signal Region +chr5 142677200 142690000 Low Mappability +chr5 143013900 143015800 High Signal Region +chr5 155138700 155189100 High Signal Region +chr5 156085200 156093100 High Signal Region +chr5 170510900 170517200 High Signal Region +chr5 173440700 173444600 High Signal Region +chr5 174540800 174565800 High Signal Region +chr5 175331400 175545200 High Signal Region +chr5 176017900 176019800 Low Mappability +chr5 177061900 177360500 High Signal Region +chr5 177387600 177408100 Low Mappability +chr5 178011600 178013600 High Signal Region +chr5 180599700 180915200 High Signal Region +chr6 0 162100 Low Mappability +chr6 256600 382800 High Signal Region +chr6 519000 521400 Low Mappability +chr6 851500 864200 High Signal Region +chr6 1428700 1434800 Low Mappability +chr6 2200300 2202700 Low Mappability +chr6 4809700 4840300 Low Mappability +chr6 5886400 5892500 Low Mappability +chr6 6141100 6143900 Low Mappability +chr6 6212500 6217900 Low Mappability +chr6 8770600 8776400 Low Mappability +chr6 9966100 9971700 High Signal Region +chr6 10984500 10987800 Low Mappability +chr6 14480600 14486400 Low Mappability +chr6 15189400 15190800 High Signal Region +chr6 20079900 20093100 Low Mappability +chr6 20615000 20619200 Low Mappability +chr6 22166500 22181200 Low Mappability +chr6 23232900 23235900 Low Mappability +chr6 26668800 26830200 High Signal Region +chr6 26850500 26925900 Low Mappability +chr6 30027900 30071800 Low Mappability +chr6 31783300 31806300 Low Mappability +chr6 33451700 33454300 High Signal Region +chr6 34038400 34041700 High Signal Region +chr6 37096000 37117300 High Signal Region +chr6 38241900 38269500 High Signal Region +chr6 44011400 44047700 High Signal Region +chr6 44148500 44150800 High Signal Region +chr6 45637100 45683300 Low Mappability +chr6 45814800 45817800 Low Mappability +chr6 45963800 45965300 Low Mappability +chr6 48331100 48336800 Low Mappability +chr6 48705800 48711100 Low Mappability +chr6 49759100 49764900 Low Mappability +chr6 50999100 51004700 High Signal Region +chr6 51531300 51535800 Low Mappability +chr6 54270500 54273400 High Signal Region +chr6 54364700 54372500 Low Mappability +chr6 54826700 54832300 Low Mappability +chr6 56911200 56913200 Low Mappability +chr6 56954700 56956700 Low Mappability +chr6 57133300 57608800 High Signal Region +chr6 57671300 57673300 Low Mappability +chr6 58061300 58288100 High Signal Region +chr6 58724800 58738300 Low Mappability +chr6 58772700 61920700 High Signal Region +chr6 62283100 62285000 Low Mappability +chr6 62371500 62383900 Low Mappability +chr6 62770600 62781900 High Signal Region +chr6 63265300 63298700 Low Mappability +chr6 65966100 65967700 Low Mappability +chr6 70193400 70231500 Low Mappability +chr6 71454100 71514000 Low Mappability +chr6 71981600 71986300 High Signal Region +chr6 72027300 72029200 Low Mappability +chr6 72875000 72876900 High Signal Region +chr6 73680200 73704400 Low Mappability +chr6 74417700 74420300 Low Mappability +chr6 74707400 74738700 Low Mappability +chr6 77455300 77457000 Low Mappability +chr6 77670600 77687700 Low Mappability +chr6 77752900 77797700 Low Mappability +chr6 78426700 78455800 Low Mappability +chr6 78508100 78509800 Low Mappability +chr6 79681400 79687300 Low Mappability +chr6 80401000 80403400 High Signal Region +chr6 81193300 81207500 Low Mappability +chr6 83257400 83275700 Low Mappability +chr6 86694600 86736600 Low Mappability +chr6 87552300 87637100 Low Mappability +chr6 89091200 89122300 Low Mappability +chr6 90764500 90769800 High Signal Region +chr6 91272000 91298000 High Signal Region +chr6 94341300 94347000 High Signal Region +chr6 95516600 95540000 Low Mappability +chr6 96310100 96313200 Low Mappability +chr6 97430400 97437100 Low Mappability +chr6 97824400 97828600 High Signal Region +chr6 99151500 99156200 Low Mappability +chr6 99314300 99316400 Low Mappability +chr6 100802600 100817600 High Signal Region +chr6 101028300 101034500 Low Mappability +chr6 101633800 101663000 Low Mappability +chr6 102617900 102623600 High Signal Region +chr6 102983200 102985100 Low Mappability +chr6 103200700 103206700 High Signal Region +chr6 104937300 104943400 Low Mappability +chr6 105185700 105210800 Low Mappability +chr6 107045300 107046900 Low Mappability +chr6 109454700 109471400 Low Mappability +chr6 109566300 109571600 Low Mappability +chr6 112224100 112229600 Low Mappability +chr6 112853400 112873000 Low Mappability +chr6 114754200 114756900 Low Mappability +chr6 115121100 115123800 Low Mappability +chr6 115496600 115502400 Low Mappability +chr6 115575100 115578000 High Signal Region +chr6 116960800 116966000 High Signal Region +chr6 117134700 117144000 Low Mappability +chr6 117413300 117429300 Low Mappability +chr6 119557600 119559600 High Signal Region +chr6 121732200 121734100 Low Mappability +chr6 121887100 121892400 Low Mappability +chr6 123793600 123799300 Low Mappability +chr6 125028000 125052900 High Signal Region +chr6 125126000 125131800 Low Mappability +chr6 129226700 129244600 Low Mappability +chr6 131556000 131561800 Low Mappability +chr6 132019100 132037100 Low Mappability +chr6 132177400 132179000 Low Mappability +chr6 133341700 133347800 Low Mappability +chr6 133593100 133595000 High Signal Region +chr6 136492700 136494600 Low Mappability +chr6 138120400 138136600 Low Mappability +chr6 142456500 142469200 Low Mappability +chr6 144117700 144122900 High Signal Region +chr6 145393200 145395000 Low Mappability +chr6 145824200 145826400 Low Mappability +chr6 145984700 146002900 Low Mappability +chr6 146291400 146318300 Low Mappability +chr6 148276600 148278600 Low Mappability +chr6 148480500 148484700 Low Mappability +chr6 150782100 150797500 Low Mappability +chr6 156062900 156064800 High Signal Region +chr6 156355300 156361300 High Signal Region +chr6 156646100 156651900 High Signal Region +chr6 156803000 156804800 Low Mappability +chr6 157730500 157736300 High Signal Region +chr6 160073000 160134300 Low Mappability +chr6 161032400 161068500 Low Mappability +chr6 165716800 165720000 Low Mappability +chr6 165782200 165787800 Low Mappability +chr6 166828700 166843000 Low Mappability +chr6 167196600 167208400 Low Mappability +chr6 167745800 167752500 Low Mappability +chr6 167786100 167802900 Low Mappability +chr6 168635100 168638700 Low Mappability +chr6 168961200 168963300 Low Mappability +chr6 169054200 169061300 High Signal Region +chr6 169239700 169241700 Low Mappability +chr6 170460500 170462500 Low Mappability +chr6 170528700 170531000 Low Mappability +chr6 170686000 170710200 High Signal Region +chr6 170774700 170777400 Low Mappability +chr6 170803900 170839700 Low Mappability +chr6 170915300 171115000 Low Mappability +chr7 0 49700 High Signal Region +chr7 1311000 1313200 High Signal Region +chr7 45290700 45292600 Low Mappability +chr7 56437000 56447500 High Signal Region +chr7 57544900 57557600 High Signal Region +chr7 57597800 57782700 High Signal Region +chr7 57884200 62120800 High Signal Region +chr7 62403000 62404900 High Signal Region +chr7 64929600 65063200 High Signal Region +chr7 84878700 84884900 High Signal Region +chr7 100549000 100611600 High Signal Region +chr7 100634800 100648100 High Signal Region +chr7 101981900 102013400 High Signal Region +chr7 102114900 102445700 High Signal Region +chr7 121919200 121925000 High Signal Region +chr7 140761800 140784200 High Signal Region +chr7 142373000 142376300 Low Mappability +chr7 145693500 145735200 Low Mappability +chr7 152072600 152132400 High Signal Region +chr7 157924100 157945100 High Signal Region +chr7 158387000 158388900 High Signal Region +chr7 158685900 158710600 High Signal Region +chr8 0 185300 High Signal Region +chr8 7012600 8066200 High Signal Region +chr8 11994400 12230100 High Signal Region +chr8 12252000 12466300 High Signal Region +chr8 13501500 13503800 High Signal Region +chr8 43091800 43118200 High Signal Region +chr8 43758900 46908900 High Signal Region +chr8 46946900 46959100 High Signal Region +chr8 47367600 47369500 High Signal Region +chr8 48792700 48794600 High Signal Region +chr8 51581600 51584700 High Signal Region +chr8 52729900 52737900 High Signal Region +chr8 58117400 58128700 High Signal Region +chr8 59283300 59288700 High Signal Region +chr8 60782300 60800500 High Signal Region +chr8 70600600 70603500 High Signal Region +chr8 82753700 82764200 High Signal Region +chr8 86554300 86841600 High Signal Region +chr8 100501000 100509100 High Signal Region +chr8 104795400 104807700 High Signal Region +chr8 106801200 106807000 High Signal Region +chr8 127325400 127331100 High Signal Region +chr8 142501600 142503600 High Signal Region +chr8 144743300 144752700 High Signal Region +chr9 6593800 6595700 High Signal Region +chr9 35903000 35915300 High Signal Region +chr9 40815000 43489000 High Signal Region +chr9 43684600 44102400 High Signal Region +chr9 44852100 44881200 High Signal Region +chr9 44908300 66250200 High Signal Region +chr9 66344100 68143800 High Signal Region +chr9 68306800 69121200 High Signal Region +chr9 69141700 70957900 High Signal Region +chr9 72652100 72654500 High Signal Region +chr9 78789200 78791100 High Signal Region +chr9 79185700 79187900 High Signal Region +chr9 87779800 87780900 High Signal Region +chr9 140221300 140223800 High Signal Region +chr9 141053300 141213400 Low Mappability +chrX 0 290100 High Signal Region +chrX 392200 529200 Low Mappability +chrX 1006400 1334000 High Signal Region +chrX 7505600 7509900 High Signal Region +chrX 9371800 9400200 High Signal Region +chrX 49164900 49386300 High Signal Region +chrX 55207100 55210900 Low Mappability +chrX 58329700 58433500 High Signal Region +chrX 58461000 61920100 High Signal Region +chrX 62005100 62007000 High Signal Region +chrX 78057800 78060000 High Signal Region +chrX 99512200 99516600 High Signal Region +chrX 101446100 101744100 High Signal Region +chrX 108258600 108312300 High Signal Region +chrX 111555900 111595100 High Signal Region +chrX 114959100 115006100 High Signal Region +chrX 125595300 125608200 Low Mappability +chrX 132242600 132250600 High Signal Region +chrX 134852300 134971100 High Signal Region +chrX 136518800 136521500 High Signal Region +chrX 154528900 154616300 High Signal Region +chrX 155038500 155270500 High Signal Region +chrY 7432700 13491000 High Signal Region +chrY 13633400 14289000 High Signal Region +chrY 28783400 59373500 High Signal Region diff --git a/assets/blacklists/v2.0/hg38-blacklist.v2.bed b/assets/blacklists/v2.0/hg38-blacklist.v2.bed new file mode 100644 index 000000000..3852ac0c5 --- /dev/null +++ b/assets/blacklists/v2.0/hg38-blacklist.v2.bed @@ -0,0 +1,636 @@ +chr10 0 45700 Low Mappability +chr10 38481300 38596500 High Signal Region +chr10 38782600 38967900 High Signal Region +chr10 39901300 41712900 High Signal Region +chr10 41838900 42107300 High Signal Region +chr10 42279400 42322500 High Signal Region +chr10 126946300 126953400 Low Mappability +chr10 133625800 133797400 High Signal Region +chr11 0 194500 Low Mappability +chr11 518900 520700 Low Mappability +chr11 584400 586500 High Signal Region +chr11 964100 966000 Low Mappability +chr11 1015700 1019300 High Signal Region +chr11 1091000 1098200 Low Mappability +chr11 3652800 3655600 High Signal Region +chr11 10506900 10511100 High Signal Region +chr11 28206300 28236700 High Signal Region +chr11 50813600 54383000 High Signal Region +chr11 61084500 61130400 High Signal Region +chr11 70370400 70372400 High Signal Region +chr11 73509800 73511700 High Signal Region +chr11 77885600 77887600 High Signal Region +chr11 93417500 93427700 High Signal Region +chr11 94232700 94240400 High Signal Region +chr11 103408700 103410600 High Signal Region +chr11 121175000 121187000 High Signal Region +chr11 131679500 131681500 High Signal Region +chr11 135075600 135086600 High Signal Region +chr12 0 77800 High Signal Region +chr12 371800 422400 High Signal Region +chr12 2254900 2257000 High Signal Region +chr12 2519800 2540500 Low Mappability +chr12 5928900 5933000 Low Mappability +chr12 20550500 20552400 Low Mappability +chr12 20768400 20770300 High Signal Region +chr12 29790400 29834600 High Signal Region +chr12 34715400 37269100 High Signal Region +chr12 41362700 41364600 High Signal Region +chr12 61471100 61473000 High Signal Region +chr12 66473900 66475800 High Signal Region +chr12 101147000 101155000 High Signal Region +chr12 113079600 113081500 High Signal Region +chr12 124430500 124440300 High Signal Region +chr12 124905900 124941800 High Signal Region +chr12 130386400 130394100 High Signal Region +chr12 131475300 131478600 High Signal Region +chr12 131576000 131589700 High Signal Region +chr12 132223300 132243400 High Signal Region +chr12 132455100 132465200 High Signal Region +chr12 133249000 133275300 High Signal Region +chr13 16087600 16165300 High Signal Region +chr13 16226300 18171400 High Signal Region +chr13 18211000 18216100 High Signal Region +chr13 57140500 57172500 High Signal Region +chr13 109423200 109425200 High Signal Region +chr13 114353300 114364300 Low Mappability +chr14 0 18670900 High Signal Region +chr14 18695400 19724300 High Signal Region +chr14 23033300 23098600 High Signal Region +chr14 26629300 26634900 High Signal Region +chr14 31793800 31798100 High Signal Region +chr14 32483400 32486000 High Signal Region +chr14 34537100 34562600 High Signal Region +chr14 35947200 35950000 High Signal Region +chr14 37351000 37356700 High Signal Region +chr14 44025100 44027200 High Signal Region +chr14 44705100 44709900 High Signal Region +chr14 45477100 45482500 High Signal Region +chr14 46865300 46866500 High Signal Region +chr14 54235600 54240000 High Signal Region +chr14 57112100 57118100 High Signal Region +chr14 74711700 74729000 High Signal Region +chr14 86074000 86076000 High Signal Region +chr14 86593300 86595200 High Signal Region +chr14 88443700 88458100 High Signal Region +chr14 100525900 100527800 High Signal Region +chr14 101267600 101272200 High Signal Region +chr14 101674400 101676400 High Signal Region +chr14 104288100 104290200 High Signal Region +chr14 105215000 105240900 High Signal Region +chr14 105568500 105583900 High Signal Region +chr14 105616500 105618600 High Signal Region +chr14 106326900 106367700 High Signal Region +chr15 0 17035000 High Signal Region +chr15 17058500 19790100 High Signal Region +chr15 20005600 22606300 High Signal Region +chr15 23125400 23357400 High Signal Region +chr15 25757700 25759100 Low Mappability +chr15 28304900 28683400 High Signal Region +chr15 30066300 30627500 High Signal Region +chr15 30844100 30859900 High Signal Region +chr15 32153700 32626200 High Signal Region +chr15 54925700 54932200 High Signal Region +chr15 56311200 56314600 High Signal Region +chr15 72635200 72687100 High Signal Region +chr15 74068100 74102000 High Signal Region +chr15 75254100 75299800 High Signal Region +chr15 77698600 77700600 High Signal Region +chr15 82321000 82374600 High Signal Region +chr15 82421200 82541700 High Signal Region +chr15 84405300 84524700 High Signal Region +chr15 101752300 101764800 Low Mappability +chr15 101892700 101991100 High Signal Region +chr16 29430800 29566900 Low Mappability +chr16 34061400 34121400 High Signal Region +chr16 34272000 34633100 High Signal Region +chr16 34657200 34672500 High Signal Region +chr16 34694600 34772000 High Signal Region +chr16 34832600 34922100 High Signal Region +chr16 34945600 35072500 Low Mappability +chr16 36166300 36202400 High Signal Region +chr16 36225200 46423000 High Signal Region +chr16 46449700 46467000 High Signal Region +chr16 90100500 90338300 Low Mappability +chr17 0 137600 High Signal Region +chr17 294900 317900 High Signal Region +chr17 448200 510900 High Signal Region +chr17 1061500 1066100 High Signal Region +chr17 1307700 1312000 Low Mappability +chr17 19025700 19237400 High Signal Region +chr17 21783300 22054000 High Signal Region +chr17 22520400 22527300 High Signal Region +chr17 22745200 26629800 High Signal Region +chr17 26766800 26987200 High Signal Region +chr17 43227600 43324300 High Signal Region +chr17 45511500 45641300 Low Mappability +chr17 53104900 53107300 High Signal Region +chr18 0 64600 High Signal Region +chr18 105200 113200 High Signal Region +chr18 971000 976500 High Signal Region +chr18 2841300 2861500 High Signal Region +chr18 15367200 20940300 High Signal Region +chr18 46961600 47031700 High Signal Region +chr18 47852300 47854300 Low Mappability +chr18 52791800 52793800 High Signal Region +chr18 74615900 74618100 High Signal Region +chr18 76966200 76968500 High Signal Region +chr18 78436900 78438700 Low Mappability +chr18 79013800 79040300 High Signal Region +chr18 79617800 79621500 High Signal Region +chr18 80257400 80373200 High Signal Region +chr19 0 271200 High Signal Region +chr19 7019100 7061300 High Signal Region +chr19 7449400 7452000 High Signal Region +chr19 8740100 8800500 High Signal Region +chr19 24330100 27274500 High Signal Region +chr19 27337600 27427400 High Signal Region +chr19 34386800 34393500 High Signal Region +chr19 34860600 34866200 High Signal Region +chr19 36267900 36313700 High Signal Region +chr19 37264900 37304300 High Signal Region +chr19 44393300 44416700 High Signal Region +chr19 47903000 47959700 High Signal Region +chr19 50090500 50140400 High Signal Region +chr19 58538700 58617600 High Signal Region +chr1 0 792500 High Signal Region +chr1 91386300 91388400 Low Mappability +chr1 103594400 103760600 High Signal Region +chr1 121605200 124938900 High Signal Region +chr1 125067600 125086000 High Signal Region +chr1 125130200 143562200 High Signal Region +chr1 161423100 161472400 High Signal Region +chr1 168348600 168349900 High Signal Region +chr1 224010800 224017000 High Signal Region +chr1 236713000 236715600 Low Mappability +chr1 248932700 248956400 High Signal Region +chr20 0 67900 High Signal Region +chr20 26364200 28916900 High Signal Region +chr20 28939400 29264700 High Signal Region +chr20 30995400 31246000 High Signal Region +chr20 47893800 47900200 High Signal Region +chr21 0 8679600 High Signal Region +chr21 9159900 9735300 High Signal Region +chr21 10013900 10069600 High Signal Region +chr21 10094700 10505100 High Signal Region +chr21 10650900 12965800 High Signal Region +chr21 43212400 43280900 High Signal Region +chr21 46682700 46709900 High Signal Region +chr22 10687700 11428100 High Signal Region +chr22 11496900 11873100 High Signal Region +chr22 11976900 15154400 High Signal Region +chr22 16258000 16385800 High Signal Region +chr22 18175900 18947300 High Signal Region +chr22 20337400 20343300 High Signal Region +chr22 21113500 21554000 High Signal Region +chr22 49972700 49975300 High Signal Region +chr22 50642800 50644900 High Signal Region +chr22 50786600 50818400 High Signal Region +chr2 1221700 1223900 High Signal Region +chr2 1594700 1605200 High Signal Region +chr2 3179600 3182100 High Signal Region +chr2 4643800 4648800 High Signal Region +chr2 10952800 10955000 High Signal Region +chr2 13718700 13737700 High Signal Region +chr2 21903500 21906400 High Signal Region +chr2 32865900 32869900 High Signal Region +chr2 32915300 32918400 High Signal Region +chr2 33766500 33768400 High Signal Region +chr2 36183000 36184500 High Signal Region +chr2 49228700 49230700 High Signal Region +chr2 64359300 64377000 High Signal Region +chr2 86655300 86661100 High Signal Region +chr2 86900700 87078100 Low Mappability +chr2 87119300 87189800 Low Mappability +chr2 87217000 87866200 High Signal Region +chr2 88771000 88806500 High Signal Region +chr2 89235300 89947100 High Signal Region +chr2 90246300 91735500 High Signal Region +chr2 91783000 91924800 Low Mappability +chr2 91969000 94569500 High Signal Region +chr2 95849400 96067900 High Signal Region +chr2 97106300 97615800 High Signal Region +chr2 109198400 109200700 High Signal Region +chr2 109744600 110095200 High Signal Region +chr2 110229200 110633400 Low Mappability +chr2 111253600 111500500 Low Mappability +chr2 112346200 112441300 Low Mappability +chr2 113370100 113662700 High Signal Region +chr2 130496800 130716400 High Signal Region +chr2 132201000 132288900 High Signal Region +chr2 132353600 132364500 High Signal Region +chr2 148880800 148882800 High Signal Region +chr2 161277700 161283400 High Signal Region +chr2 181274800 181276800 High Signal Region +chr2 226108500 226110400 High Signal Region +chr2 234889800 234894400 High Signal Region +chr2 239642200 239645600 High Signal Region +chr2 240308100 240310300 High Signal Region +chr2 241589300 241591800 High Signal Region +chr2 242005900 242011100 High Signal Region +chr2 242110100 242193500 High Signal Region +chr3 0 11600 High Signal Region +chr3 3895200 3896700 High Signal Region +chr3 4916700 4922500 High Signal Region +chr3 14091000 14092500 High Signal Region +chr3 15187200 15207800 High Signal Region +chr3 15592100 15603300 High Signal Region +chr3 16176800 16179200 High Signal Region +chr3 16679700 16682500 High Signal Region +chr3 19499700 19504000 High Signal Region +chr3 19624000 19627100 High Signal Region +chr3 21983200 21988100 High Signal Region +chr3 24053500 24054900 High Signal Region +chr3 26384800 26404100 High Signal Region +chr3 29993900 29999900 High Signal Region +chr3 36987500 36995000 High Signal Region +chr3 38083400 38085400 High Signal Region +chr3 38406100 38430900 High Signal Region +chr3 39366700 39386000 High Signal Region +chr3 40219400 40240500 High Signal Region +chr3 49671000 49696700 High Signal Region +chr3 51457800 51462000 High Signal Region +chr3 57326800 57328500 High Signal Region +chr3 65124100 65126100 High Signal Region +chr3 65510000 65513900 High Signal Region +chr3 65697400 65699300 High Signal Region +chr3 66273800 66275200 High Signal Region +chr3 68076400 68077800 High Signal Region +chr3 69047300 69053600 High Signal Region +chr3 69475300 69479700 High Signal Region +chr3 75630100 75707800 High Signal Region +chr3 75736400 75754600 High Signal Region +chr3 78948800 78950500 High Signal Region +chr3 80876000 80894000 High Signal Region +chr3 89345600 89370500 High Signal Region +chr3 90156400 90175500 High Signal Region +chr3 90455400 91297100 High Signal Region +chr3 91516200 93749200 High Signal Region +chr3 96616300 96619300 High Signal Region +chr3 97905100 97923200 High Signal Region +chr3 101674800 101698400 High Signal Region +chr3 103224300 103236500 High Signal Region +chr3 106665700 106669700 High Signal Region +chr3 106975900 106979600 High Signal Region +chr3 108751100 108755100 High Signal Region +chr3 111019500 111024600 High Signal Region +chr3 121933800 121936400 High Signal Region +chr3 122414300 122417500 High Signal Region +chr3 122735500 122796600 High Signal Region +chr3 122837000 122838700 High Signal Region +chr3 133177100 133179800 High Signal Region +chr3 133551500 133579500 High Signal Region +chr3 135437200 135439100 High Signal Region +chr3 136954600 136969200 High Signal Region +chr3 137168400 137169900 High Signal Region +chr3 138575800 138595900 High Signal Region +chr3 139190800 139194700 High Signal Region +chr3 153236200 153241300 High Signal Region +chr3 155544100 155546700 High Signal Region +chr3 156279000 156283500 High Signal Region +chr3 157080800 157093400 High Signal Region +chr3 158511300 158513100 High Signal Region +chr3 160941200 160948700 High Signal Region +chr3 161001900 161014100 High Signal Region +chr3 165573100 165591000 High Signal Region +chr3 166228200 166232400 High Signal Region +chr3 168012100 168016800 High Signal Region +chr3 170567000 170569900 High Signal Region +chr3 170864300 170881400 High Signal Region +chr3 171626600 171637700 High Signal Region +chr3 174829200 174831800 High Signal Region +chr3 176828700 176833000 High Signal Region +chr3 177660600 177664000 High Signal Region +chr3 178926800 178941300 High Signal Region +chr3 183016900 183019100 High Signal Region +chr3 183955400 183958700 High Signal Region +chr3 187893900 187896100 High Signal Region +chr3 192739300 192742700 High Signal Region +chr3 194323600 194334900 High Signal Region +chr3 195477900 195507300 High Signal Region +chr3 195616000 195750100 High Signal Region +chr3 195775500 195791400 High Signal Region +chr3 195914100 196028300 High Signal Region +chr3 196249400 196251900 High Signal Region +chr3 196897800 196899800 High Signal Region +chr3 197030600 197035800 High Signal Region +chr3 197383400 197428800 High Signal Region +chr3 197454700 197460800 High Signal Region +chr3 197598400 197680900 High Signal Region +chr3 198099800 198295500 High Signal Region +chr4 0 69200 High Signal Region +chr4 554100 556500 High Signal Region +chr4 1427000 1468900 High Signal Region +chr4 6002700 6005700 High Signal Region +chr4 7863000 7865000 High Signal Region +chr4 9212700 9369600 High Signal Region +chr4 40291700 40318200 High Signal Region +chr4 49077200 51816100 High Signal Region +chr4 55327200 55329200 High Signal Region +chr4 77994000 78009600 High Signal Region +chr4 119274400 119301700 High Signal Region +chr4 146285100 146305300 High Signal Region +chr4 162420500 162422400 High Signal Region +chr4 166554300 166581300 Low Mappability +chr4 181238800 181242300 Low Mappability +chr4 189232500 189236300 High Signal Region +chr4 189834900 189849700 High Signal Region +chr4 189877500 190023700 High Signal Region +chr4 190048600 190214500 High Signal Region +chr5 0 44100 High Signal Region +chr5 548300 564100 High Signal Region +chr5 647600 651700 High Signal Region +chr5 1326100 1334600 High Signal Region +chr5 2144600 2147800 High Signal Region +chr5 2489800 2491700 High Signal Region +chr5 3322100 3325100 High Signal Region +chr5 6967700 6971700 High Signal Region +chr5 17516800 17600200 High Signal Region +chr5 21477600 21497600 High Signal Region +chr5 25381400 25384300 High Signal Region +chr5 34177900 34244800 High Signal Region +chr5 45522900 45525200 High Signal Region +chr5 45743000 45744800 High Signal Region +chr5 46433900 46687700 High Signal Region +chr5 46708100 50165300 High Signal Region +chr5 60759700 60762500 High Signal Region +chr5 63320900 63335500 High Signal Region +chr5 69540700 71359500 High Signal Region +chr5 71850000 71852800 High Signal Region +chr5 74685400 74712400 High Signal Region +chr5 78452400 78457600 High Signal Region +chr5 78848400 78872800 High Signal Region +chr5 80649100 80653100 High Signal Region +chr5 85641800 85662700 High Signal Region +chr5 93947500 93948900 High Signal Region +chr5 94567100 94570400 High Signal Region +chr5 100045500 100076300 High Signal Region +chr5 106425500 106429500 High Signal Region +chr5 109259500 109265400 High Signal Region +chr5 111302100 111308300 High Signal Region +chr5 114156700 114158300 High Signal Region +chr5 119904000 119905600 High Signal Region +chr5 123760300 123762200 High Signal Region +chr5 134922500 134929400 High Signal Region +chr5 139005500 139011600 High Signal Region +chr5 146610000 146615500 High Signal Region +chr5 153071100 153077000 High Signal Region +chr5 156658300 156665400 High Signal Region +chr5 161606000 161611700 High Signal Region +chr5 171083900 171090200 High Signal Region +chr5 175904500 176118000 High Signal Region +chr5 176590700 176593000 High Signal Region +chr5 177636700 177684700 High Signal Region +chr5 177960500 177981400 High Signal Region +chr5 178584600 178586600 High Signal Region +chr5 181172600 181538200 High Signal Region +chr6 256500 382800 High Signal Region +chr6 861500 864200 High Signal Region +chr6 1052800 1054800 High Signal Region +chr6 26669200 26832300 High Signal Region +chr6 33484600 33486400 High Signal Region +chr6 34070600 34074000 High Signal Region +chr6 38262000 38301600 High Signal Region +chr6 39455800 39460500 High Signal Region +chr6 44043600 44080000 High Signal Region +chr6 44180600 44182900 High Signal Region +chr6 51874900 51901300 High Signal Region +chr6 54961900 54967400 High Signal Region +chr6 58432200 60242300 High Signal Region +chr6 61321800 61493000 High Signal Region +chr6 61573200 61575100 Low Mappability +chr6 61661900 61673400 High Signal Region +chr6 103709000 103715100 High Signal Region +chr6 115254900 115256800 High Signal Region +chr6 143799900 143801800 High Signal Region +chr6 156035300 156040100 High Signal Region +chr6 157309500 157324800 High Signal Region +chr6 160611700 160647400 High Signal Region +chr6 170145300 170147200 High Signal Region +chr6 170376900 170401000 High Signal Region +chr6 170465400 170468400 High Signal Region +chr7 0 49600 High Signal Region +chr7 224500 241300 High Signal Region +chr7 904700 907100 Low Mappability +chr7 1271400 1273500 High Signal Region +chr7 45251000 45253000 High Signal Region +chr7 56369500 56375600 High Signal Region +chr7 57485300 57497800 High Signal Region +chr7 57611600 57637700 Low Mappability +chr7 58031800 60997400 High Signal Region +chr7 61017800 61075200 High Signal Region +chr7 61102900 61725200 Low Mappability +chr7 62265700 62409500 High Signal Region +chr7 62430000 62520600 High Signal Region +chr7 65488000 65496500 High Signal Region +chr7 100951400 100968300 High Signal Region +chr7 100991500 101004600 High Signal Region +chr7 102474700 102686400 High Signal Region +chr7 142665100 142668500 High Signal Region +chr7 144180800 144377300 Low Mappability +chr7 145996400 146018600 High Signal Region +chr7 152375800 152435100 High Signal Region +chr7 158131400 158156200 High Signal Region +chr7 158594300 158596200 High Signal Region +chr7 158893100 158918100 High Signal Region +chr7 159334900 159345900 High Signal Region +chr8 7209800 7914700 High Signal Region +chr8 7940500 8075700 High Signal Region +chr8 8128200 8204600 High Signal Region +chr8 12136900 12614300 High Signal Region +chr8 43236700 43262600 High Signal Region +chr8 43937900 45969600 High Signal Region +chr8 46829400 46832000 High Signal Region +chr8 57204900 57216100 High Signal Region +chr8 59168700 59170400 High Signal Region +chr8 67584500 67592700 High Signal Region +chr8 69688400 69691100 High Signal Region +chr8 71406700 71412400 High Signal Region +chr8 75444100 75448200 High Signal Region +chr8 81841500 81851900 High Signal Region +chr8 85642100 85829300 High Signal Region +chr8 88685900 88691700 High Signal Region +chr8 96171200 96173100 High Signal Region +chr8 99494900 99496800 High Signal Region +chr8 105789200 105793800 High Signal Region +chr8 141491400 141493500 High Signal Region +chr8 141871100 141875200 High Signal Region +chr8 143641400 143670500 High Signal Region +chr8 144124800 144137600 High Signal Region +chr9 319900 322400 High Signal Region +chr9 33656600 33660000 High Signal Region +chr9 35912600 35915300 High Signal Region +chr9 38824200 39089400 High Signal Region +chr9 39846200 40771100 High Signal Region +chr9 40792500 41323100 High Signal Region +chr9 41492300 41635600 High Signal Region +chr9 41661300 42119600 Low Mappability +chr9 42364000 42410600 High Signal Region +chr9 42899400 42901300 High Signal Region +chr9 43263100 61518900 High Signal Region +chr9 61735300 63548000 High Signal Region +chr9 63761400 64027300 High Signal Region +chr9 64135000 65390600 High Signal Region +chr9 65579400 66874600 High Signal Region +chr9 66959000 68398100 High Signal Region +chr9 70037200 70039600 High Signal Region +chr9 76174300 76176200 High Signal Region +chr9 83222900 83226900 High Signal Region +chr9 85071600 85075100 High Signal Region +chr9 85164800 85166100 High Signal Region +chr9 108502000 108506600 High Signal Region +chr9 134164500 134185500 High Signal Region +chr9 137326800 137330600 High Signal Region +chr9 137715200 137722200 Low Mappability +chr9 137841200 137846800 Low Mappability +chr9 138222000 138394700 High Signal Region +chrX 0 329300 High Signal Region +chrX 362400 388500 High Signal Region +chrX 456500 531800 High Signal Region +chrX 723800 739500 High Signal Region +chrX 864500 930400 High Signal Region +chrX 1049100 1054300 High Signal Region +chrX 1085100 1175500 High Signal Region +chrX 1200600 1209400 High Signal Region +chrX 1249200 1269000 High Signal Region +chrX 1289500 1298900 High Signal Region +chrX 1365300 1458700 High Signal Region +chrX 1480900 1492800 High Signal Region +chrX 1816200 1820600 High Signal Region +chrX 2223900 2521900 High Signal Region +chrX 2580600 2751300 High Signal Region +chrX 3966700 3968700 High Signal Region +chrX 5481200 5486100 High Signal Region +chrX 6933400 6938700 High Signal Region +chrX 7587600 7591800 High Signal Region +chrX 9403600 9415100 High Signal Region +chrX 10785000 10809700 High Signal Region +chrX 10966600 10976800 High Signal Region +chrX 11218800 11221100 Low Mappability +chrX 11840900 11848000 High Signal Region +chrX 14085100 14109500 High Signal Region +chrX 14286500 14289300 High Signal Region +chrX 16361200 16366000 High Signal Region +chrX 16498100 16503400 High Signal Region +chrX 19940200 19946300 High Signal Region +chrX 21340600 21345700 High Signal Region +chrX 25773300 25776000 High Signal Region +chrX 26176400 26181400 High Signal Region +chrX 30767800 30772600 High Signal Region +chrX 31077600 31082600 High Signal Region +chrX 31511400 31535800 High Signal Region +chrX 34416800 34425900 High Signal Region +chrX 36465200 36471200 High Signal Region +chrX 37628400 37633500 High Signal Region +chrX 42872300 42910700 High Signal Region +chrX 49317500 49623500 High Signal Region +chrX 50019400 50033700 High Signal Region +chrX 50056700 50066100 High Signal Region +chrX 51202300 51268100 High Signal Region +chrX 51427500 51432400 High Signal Region +chrX 52175000 52228100 High Signal Region +chrX 52442800 52538100 High Signal Region +chrX 53761700 53789500 High Signal Region +chrX 55180400 55184500 High Signal Region +chrX 56754900 56781100 Low Mappability +chrX 57712300 57719700 High Signal Region +chrX 58467900 62522800 High Signal Region +chrX 63129600 63290600 Low Mappability +chrX 67311800 67323800 High Signal Region +chrX 67626800 67632300 High Signal Region +chrX 68217300 68230200 High Signal Region +chrX 70600000 70603800 High Signal Region +chrX 70640600 70645000 High Signal Region +chrX 70963600 70964900 High Signal Region +chrX 71978800 71980500 High Signal Region +chrX 72489400 72490800 High Signal Region +chrX 72743200 73035800 High Signal Region +chrX 73381000 73387000 High Signal Region +chrX 73887000 73891300 High Signal Region +chrX 74660000 74718100 High Signal Region +chrX 74789000 74794000 High Signal Region +chrX 74952200 74995200 High Signal Region +chrX 78802400 78804500 High Signal Region +chrX 79765500 79789600 High Signal Region +chrX 80534100 80537000 High Signal Region +chrX 82849700 82859300 Low Mappability +chrX 83752100 83756900 High Signal Region +chrX 86046600 86076600 High Signal Region +chrX 86395500 86398100 High Signal Region +chrX 86970000 86975600 High Signal Region +chrX 87220500 87222100 High Signal Region +chrX 89060200 89062700 High Signal Region +chrX 89202500 89208400 High Signal Region +chrX 91332900 91336600 High Signal Region +chrX 93618000 93633400 High Signal Region +chrX 94863600 94868300 High Signal Region +chrX 97509600 97515000 High Signal Region +chrX 100135800 100141000 High Signal Region +chrX 100257100 100261600 High Signal Region +chrX 101471700 101474900 High Signal Region +chrX 102188700 102489200 High Signal Region +chrX 103851800 103897800 High Signal Region +chrX 106755500 106769400 High Signal Region +chrX 106813900 106830900 High Signal Region +chrX 107515800 107517200 High Signal Region +chrX 109034800 109069100 High Signal Region +chrX 109114900 109119400 High Signal Region +chrX 109520800 109525700 High Signal Region +chrX 109985900 109987300 High Signal Region +chrX 110816700 110833400 High Signal Region +chrX 111416100 111418000 High Signal Region +chrX 113141700 113143600 High Signal Region +chrX 114701600 114724300 High Signal Region +chrX 115725600 115889600 High Signal Region +chrX 116557600 116595600 High Signal Region +chrX 117874100 117880000 High Signal Region +chrX 118009000 118037800 High Signal Region +chrX 118070900 118072700 High Signal Region +chrX 121263700 121268100 High Signal Region +chrX 121299200 121300600 High Signal Region +chrX 122528400 122550000 High Signal Region +chrX 124584300 124588400 High Signal Region +chrX 125927600 125937100 High Signal Region +chrX 126463700 126474200 High Signal Region +chrX 127116700 127122600 High Signal Region +chrX 127362200 127368300 High Signal Region +chrX 128785000 128788700 High Signal Region +chrX 129337600 129357900 High Signal Region +chrX 129388400 129408400 High Signal Region +chrX 130567700 130572000 High Signal Region +chrX 131152200 131157400 High Signal Region +chrX 131378300 131383300 High Signal Region +chrX 131664300 131670000 High Signal Region +chrX 132284600 132320400 High Signal Region +chrX 133108600 133116500 High Signal Region +chrX 135718600 135888700 High Signal Region +chrX 137074700 137079100 High Signal Region +chrX 137436600 137439300 High Signal Region +chrX 138300600 138302200 High Signal Region +chrX 139437600 139446800 High Signal Region +chrX 139621500 139622800 High Signal Region +chrX 140722400 140726100 High Signal Region +chrX 141000400 141108300 High Signal Region +chrX 142478000 142483800 High Signal Region +chrX 142892300 142911600 High Signal Region +chrX 143352000 143356500 High Signal Region +chrX 144404500 144475900 Low Mappability +chrX 147281700 147287100 High Signal Region +chrX 147653800 147659900 High Signal Region +chrX 148123500 148129000 High Signal Region +chrX 148347100 148378700 High Signal Region +chrX 149437900 149441900 High Signal Region +chrX 150024800 150026200 High Signal Region +chrX 152173800 152175100 High Signal Region +chrX 153251200 153316400 High Signal Region +chrX 154870000 154890200 High Signal Region +chrX 154938900 154945100 High Signal Region +chrX 155299600 155305100 High Signal Region +chrX 155454000 155522000 High Signal Region +chrX 155700400 155727500 High Signal Region +chrX 155983500 156040800 High Signal Region +chrY 4343800 4345800 High Signal Region +chrY 10246200 11041200 High Signal Region +chrY 11072100 11335300 High Signal Region +chrY 11486600 11757800 High Signal Region +chrY 26637300 57227400 High Signal Region diff --git a/assets/blacklists/v2.0/mm10-blacklist.v2.bed b/assets/blacklists/v2.0/mm10-blacklist.v2.bed new file mode 100644 index 000000000..e8ff4cc11 --- /dev/null +++ b/assets/blacklists/v2.0/mm10-blacklist.v2.bed @@ -0,0 +1,3435 @@ +chr10 0 3135400 High Signal Region +chr10 3218900 3276600 Low Mappability +chr10 3576900 3627700 Low Mappability +chr10 4191100 4197600 Low Mappability +chr10 4613500 4615400 High Signal Region +chr10 4761300 4763900 High Signal Region +chr10 5080800 5096600 Low Mappability +chr10 5580100 5586600 Low Mappability +chr10 6281200 6286700 High Signal Region +chr10 6740200 6742100 High Signal Region +chr10 7396300 7429800 High Signal Region +chr10 7633600 7636600 Low Mappability +chr10 7889700 7897500 High Signal Region +chr10 8144900 8153000 High Signal Region +chr10 8264000 8269200 High Signal Region +chr10 8382400 8404400 High Signal Region +chr10 8599200 8606400 Low Mappability +chr10 10012200 10033400 High Signal Region +chr10 10566900 10593500 High Signal Region +chr10 11218400 11224800 Low Mappability +chr10 11351800 11406300 Low Mappability +chr10 11491200 11493100 High Signal Region +chr10 11612300 11642500 High Signal Region +chr10 11692500 11701300 Low Mappability +chr10 12266500 12273000 High Signal Region +chr10 12385800 12396000 High Signal Region +chr10 13401200 13403100 High Signal Region +chr10 14559900 14577100 High Signal Region +chr10 14646300 14664500 Low Mappability +chr10 14923800 14928300 High Signal Region +chr10 15047600 15083100 High Signal Region +chr10 15528600 15534200 High Signal Region +chr10 15567000 15641800 High Signal Region +chr10 16967500 16971600 High Signal Region +chr10 17499600 17501700 High Signal Region +chr10 18555500 18558100 High Signal Region +chr10 19427600 19429100 High Signal Region +chr10 19538800 19546100 Low Mappability +chr10 19772200 19801600 High Signal Region +chr10 20458900 20460800 High Signal Region +chr10 21208600 21216600 Low Mappability +chr10 21278500 21313500 High Signal Region +chr10 21642200 21649600 Low Mappability +chr10 21727800 21736400 Low Mappability +chr10 22031300 22063500 High Signal Region +chr10 22127200 22164500 High Signal Region +chr10 22186700 22290500 High Signal Region +chr10 22369100 22472300 High Signal Region +chr10 22683100 22690600 Low Mappability +chr10 22935900 22941800 High Signal Region +chr10 24687500 24691700 Low Mappability +chr10 25091400 25106900 Low Mappability +chr10 25622900 25629400 Low Mappability +chr10 25968400 25973400 Low Mappability +chr10 26641500 26662800 Low Mappability +chr10 27403200 27407600 High Signal Region +chr10 27904000 27909500 High Signal Region +chr10 28908500 28940600 High Signal Region +chr10 29243900 29249600 High Signal Region +chr10 29924300 29930700 Low Mappability +chr10 29954000 29971900 High Signal Region +chr10 30553000 30577100 High Signal Region +chr10 31054900 31095900 Low Mappability +chr10 31406500 31411100 High Signal Region +chr10 31750000 31757100 Low Mappability +chr10 31878400 31885800 High Signal Region +chr10 31980100 32000400 Low Mappability +chr10 32039700 32045000 High Signal Region +chr10 32176100 32182400 High Signal Region +chr10 32499200 32529900 High Signal Region +chr10 32816400 32857200 High Signal Region +chr10 33315300 33319800 High Signal Region +chr10 33492300 33508900 High Signal Region +chr10 33886600 33901100 Low Mappability +chr10 34739400 34749100 Low Mappability +chr10 35669300 35725500 High Signal Region +chr10 36130200 36135500 High Signal Region +chr10 36160700 36166700 High Signal Region +chr10 36594500 36597500 Low Mappability +chr10 36942200 36948800 Low Mappability +chr10 37186500 37189300 High Signal Region +chr10 37799700 37821400 High Signal Region +chr10 37964600 37970100 High Signal Region +chr10 38590100 38606100 High Signal Region +chr10 38637900 38644200 High Signal Region +chr10 38729400 38782700 High Signal Region +chr10 38933500 38956500 High Signal Region +chr10 39126700 39129400 High Signal Region +chr10 39760700 39764700 High Signal Region +chr10 41185700 41195800 High Signal Region +chr10 41840500 41859100 Low Mappability +chr10 43769400 43773800 High Signal Region +chr10 44206300 44254100 High Signal Region +chr10 45515000 45588000 Low Mappability +chr10 45624800 45628400 High Signal Region +chr10 46136500 46139300 High Signal Region +chr10 46468300 46472100 High Signal Region +chr10 46500500 46538800 High Signal Region +chr10 46789300 46812500 High Signal Region +chr10 46966700 47009000 High Signal Region +chr10 47048600 47074700 Low Mappability +chr10 47663600 47683500 High Signal Region +chr10 47743600 47758500 High Signal Region +chr10 47875400 47881600 High Signal Region +chr10 48032400 48058800 High Signal Region +chr10 48677400 48682800 High Signal Region +chr10 49823500 49842200 High Signal Region +chr10 50029200 50035300 High Signal Region +chr10 50109900 50115500 High Signal Region +chr10 50178500 50184800 High Signal Region +chr10 50253700 50296500 High Signal Region +chr10 50333400 50335300 High Signal Region +chr10 50524000 50553900 High Signal Region +chr10 51126200 51132900 High Signal Region +chr10 51436800 51448000 High Signal Region +chr10 51470300 51474900 High Signal Region +chr10 51882900 51888000 Low Mappability +chr10 52052600 52059000 Low Mappability +chr10 52089600 52148500 High Signal Region +chr10 52522600 52599800 High Signal Region +chr10 53073900 53081100 High Signal Region +chr10 53569600 53576000 Low Mappability +chr10 54216200 54222900 High Signal Region +chr10 54588800 54619900 Low Mappability +chr10 55080400 55090500 High Signal Region +chr10 55654500 55659600 High Signal Region +chr10 55715600 55751000 High Signal Region +chr10 55841700 55847900 High Signal Region +chr10 56250200 56293900 High Signal Region +chr10 56701000 56728000 High Signal Region +chr10 56894100 56897300 High Signal Region +chr10 57099200 57153200 High Signal Region +chr10 57239100 57245400 High Signal Region +chr10 57326900 57333900 High Signal Region +chr10 57434000 57456500 High Signal Region +chr10 57678600 57684900 High Signal Region +chr10 57862800 58240900 High Signal Region +chr10 58566200 58570900 High Signal Region +chr10 59381400 59396800 Low Mappability +chr10 59850500 59922300 Low Mappability +chr10 60444900 60446800 High Signal Region +chr10 60546600 60553100 Low Mappability +chr10 61373100 61375000 High Signal Region +chr10 63103900 63111200 Low Mappability +chr10 63508800 63519000 High Signal Region +chr10 63833800 63835000 High Signal Region +chr10 64418600 64420000 High Signal Region +chr10 65166300 65172600 High Signal Region +chr10 65450400 65477700 High Signal Region +chr10 65638900 65670200 High Signal Region +chr10 65938900 65956300 Low Mappability +chr10 66422900 66431000 High Signal Region +chr10 66662400 66678300 High Signal Region +chr10 69030100 69065800 High Signal Region +chr10 70657500 70668500 High Signal Region +chr10 70785400 70798600 Low Mappability +chr10 71012700 71019200 Low Mappability +chr10 71111600 71114200 Low Mappability +chr10 71510600 71637800 High Signal Region +chr10 71691300 71698600 Low Mappability +chr10 72292400 72314300 High Signal Region +chr10 72359200 72360700 High Signal Region +chr10 72493500 72499200 High Signal Region +chr10 72590700 72591900 High Signal Region +chr10 72690900 72709500 High Signal Region +chr10 73378200 73380100 High Signal Region +chr10 73576400 73601900 High Signal Region +chr10 74433300 74439500 High Signal Region +chr10 74655700 74672200 High Signal Region +chr10 74715300 74746600 High Signal Region +chr10 74857500 74888000 High Signal Region +chr10 76835100 76852400 High Signal Region +chr10 77950600 77979500 Low Mappability +chr10 78008300 78028800 Low Mappability +chr10 78637000 78696000 High Signal Region +chr10 78731500 78735800 High Signal Region +chr10 78803500 78823100 Low Mappability +chr10 79207800 79259400 High Signal Region +chr10 79314000 79354000 Low Mappability +chr10 80102300 80116000 High Signal Region +chr10 80928600 80996300 Low Mappability +chr10 81167600 81199400 High Signal Region +chr10 81600900 81997900 High Signal Region +chr10 82517500 82538800 High Signal Region +chr10 82571100 82575200 High Signal Region +chr10 82939800 82956300 High Signal Region +chr10 83386600 83392400 Low Mappability +chr10 83670800 83678100 Low Mappability +chr10 83768200 83792700 Low Mappability +chr10 84155900 84180800 Low Mappability +chr10 84436900 84473700 Low Mappability +chr10 84744500 84750100 Low Mappability +chr10 85413200 85419700 Low Mappability +chr10 85696600 85732800 High Signal Region +chr10 85840200 85872500 High Signal Region +chr10 86561700 86565700 High Signal Region +chr10 88628700 88658500 Low Mappability +chr10 88963900 88968200 Low Mappability +chr10 89398700 89400100 High Signal Region +chr10 89949700 89964500 High Signal Region +chr10 90249000 90255300 High Signal Region +chr10 90324500 90329800 Low Mappability +chr10 90471200 90474200 Low Mappability +chr10 91252200 91256900 High Signal Region +chr10 91928900 91944500 High Signal Region +chr10 92909200 92915800 High Signal Region +chr10 94362500 94369300 Low Mappability +chr10 94591500 94610000 High Signal Region +chr10 94871200 94873100 High Signal Region +chr10 96068700 96078800 High Signal Region +chr10 96157200 96162600 Low Mappability +chr10 96192400 96199800 Low Mappability +chr10 97320500 97329700 High Signal Region +chr10 97525500 97534200 Low Mappability +chr10 97755000 97761200 High Signal Region +chr10 97896600 97920300 High Signal Region +chr10 98337800 98343700 High Signal Region +chr10 98433100 98444100 High Signal Region +chr10 100310500 100395900 High Signal Region +chr10 102667700 102669600 High Signal Region +chr10 102859800 102861500 High Signal Region +chr10 103500200 103519100 High Signal Region +chr10 103547000 103548600 High Signal Region +chr10 103569600 103575200 High Signal Region +chr10 103600400 103684400 High Signal Region +chr10 103936700 103942500 High Signal Region +chr10 104380700 104382300 High Signal Region +chr10 104493600 104499800 High Signal Region +chr10 104539700 104562500 Low Mappability +chr10 104748100 104771500 High Signal Region +chr10 104819400 104862500 Low Mappability +chr10 104966900 105001700 Low Mappability +chr10 105177000 105181900 Low Mappability +chr10 105672500 105678000 Low Mappability +chr10 106166900 106235700 High Signal Region +chr10 106382800 106403000 High Signal Region +chr10 106427100 106453600 High Signal Region +chr10 106529600 106535200 Low Mappability +chr10 107125500 107136900 Low Mappability +chr10 107551800 107560700 High Signal Region +chr10 107845300 107863900 High Signal Region +chr10 107978900 108006700 Low Mappability +chr10 109212600 109216800 High Signal Region +chr10 109315100 109322400 Low Mappability +chr10 109941600 109948000 High Signal Region +chr10 110104900 110111300 Low Mappability +chr10 110504500 110516000 High Signal Region +chr10 110667700 110700900 Low Mappability +chr10 111217500 111219000 High Signal Region +chr10 112013700 112021700 High Signal Region +chr10 112053500 112058400 Low Mappability +chr10 112540600 112542100 High Signal Region +chr10 112587000 112611100 High Signal Region +chr10 112682400 112722100 Low Mappability +chr10 113722600 113729800 Low Mappability +chr10 114167300 114174900 High Signal Region +chr10 114736400 114738300 High Signal Region +chr10 114860600 114866900 High Signal Region +chr10 115641300 115643100 High Signal Region +chr10 116606200 116613400 Low Mappability +chr10 116762000 116764200 High Signal Region +chr10 116878000 116879900 High Signal Region +chr10 117476200 117491000 High Signal Region +chr10 118014300 118033200 High Signal Region +chr10 118054000 118076600 High Signal Region +chr10 118199900 118279700 Low Mappability +chr10 118910200 118917100 High Signal Region +chr10 118937400 118953000 Low Mappability +chr10 119698800 119701600 Low Mappability +chr10 120974800 120977500 High Signal Region +chr10 121136000 121143400 Low Mappability +chr10 121164700 121169300 Low Mappability +chr10 121566100 121580200 High Signal Region +chr10 121707800 121713500 High Signal Region +chr10 121762300 121769400 High Signal Region +chr10 122141100 122166000 High Signal Region +chr10 122346900 122371300 Low Mappability +chr10 122632400 122638000 High Signal Region +chr10 122832900 122839300 High Signal Region +chr10 123792900 123797100 High Signal Region +chr10 124412900 124433300 High Signal Region +chr10 124576300 124583500 Low Mappability +chr10 124605700 124611000 Low Mappability +chr10 124680500 124686200 Low Mappability +chr10 124760500 124788800 High Signal Region +chr10 125819500 125825700 High Signal Region +chr10 125869000 125871400 High Signal Region +chr10 126262200 126291600 Low Mappability +chr10 127779500 127797900 High Signal Region +chr10 129189500 129217200 High Signal Region +chr10 129388700 129419600 Low Mappability +chr10 129443000 129454800 High Signal Region +chr10 129734500 129736400 High Signal Region +chr10 129925300 129940600 Low Mappability +chr10 130039500 130052900 High Signal Region +chr10 130396900 130408000 High Signal Region +chr10 130542000 130694900 High Signal Region +chr11 0 3201000 High Signal Region +chr11 5167600 5182600 High Signal Region +chr11 5361500 5365400 Low Mappability +chr11 5552700 5558200 Low Mappability +chr11 6141300 6148700 Low Mappability +chr11 7489400 7492300 High Signal Region +chr11 7752300 7774500 Low Mappability +chr11 8058600 8083100 Low Mappability +chr11 8354900 8370700 High Signal Region +chr11 8907200 8936100 Low Mappability +chr11 9707900 9715100 Low Mappability +chr11 9807600 9814200 Low Mappability +chr11 10252000 10266800 High Signal Region +chr11 10760200 10770800 Low Mappability +chr11 11287200 11295100 High Signal Region +chr11 12129400 12163100 High Signal Region +chr11 12507200 12512700 Low Mappability +chr11 12561900 12569100 Low Mappability +chr11 12750500 12802700 High Signal Region +chr11 12856200 12863700 High Signal Region +chr11 12953900 12960700 Low Mappability +chr11 14896500 14922100 High Signal Region +chr11 15227600 15235000 Low Mappability +chr11 16022400 16029000 High Signal Region +chr11 16326500 16331700 High Signal Region +chr11 16418200 16419600 High Signal Region +chr11 16567100 16573100 High Signal Region +chr11 17401400 17407800 High Signal Region +chr11 18330900 18342700 High Signal Region +chr11 18773800 18780100 High Signal Region +chr11 19566100 19570600 Low Mappability +chr11 19788600 19809400 Low Mappability +chr11 20310000 20312000 High Signal Region +chr11 20377900 20380400 High Signal Region +chr11 22322000 22340700 Low Mappability +chr11 22395200 22432900 Low Mappability +chr11 22534700 22537000 Low Mappability +chr11 23218500 23258100 Low Mappability +chr11 23522600 23552900 High Signal Region +chr11 24527400 24529500 Low Mappability +chr11 25196800 25217300 High Signal Region +chr11 25796400 25802200 Low Mappability +chr11 26898500 26900500 High Signal Region +chr11 27525200 27541400 High Signal Region +chr11 28097200 28104500 Low Mappability +chr11 29064100 29129900 Low Mappability +chr11 29259900 29291300 High Signal Region +chr11 29586000 29592400 Low Mappability +chr11 30511100 30535400 High Signal Region +chr11 31343800 31345700 Low Mappability +chr11 33062300 33068800 Low Mappability +chr11 34541000 34683100 High Signal Region +chr11 37482400 37484900 High Signal Region +chr11 40230800 40248400 High Signal Region +chr11 40625500 40640300 Low Mappability +chr11 40796600 40860600 High Signal Region +chr11 40887700 40915600 High Signal Region +chr11 41631700 41633600 High Signal Region +chr11 43237300 43239300 Low Mappability +chr11 43286400 43329800 High Signal Region +chr11 43454800 43462300 Low Mappability +chr11 43659700 43682100 Low Mappability +chr11 45584200 45655700 Low Mappability +chr11 46412300 46415000 Low Mappability +chr11 46492800 46514400 Low Mappability +chr11 47847500 47860600 High Signal Region +chr11 48451800 48536100 High Signal Region +chr11 48929800 49060400 Low Mappability +chr11 50445100 50469600 High Signal Region +chr11 51437600 51456700 High Signal Region +chr11 51664900 51690400 Low Mappability +chr11 54135500 54141600 High Signal Region +chr11 54576500 54583300 Low Mappability +chr11 55240500 55248100 Low Mappability +chr11 56588500 56594500 High Signal Region +chr11 57301700 57303600 High Signal Region +chr11 60558900 60699000 Low Mappability +chr11 61407400 61427800 Low Mappability +chr11 61593700 61596500 Low Mappability +chr11 62879300 62901500 High Signal Region +chr11 63467600 63475000 Low Mappability +chr11 64568100 64574200 High Signal Region +chr11 64681700 64683600 Low Mappability +chr11 64791900 64827100 Low Mappability +chr11 65451700 65458800 Low Mappability +chr11 66629900 66634100 High Signal Region +chr11 66947700 66958600 Low Mappability +chr11 67866400 67872800 Low Mappability +chr11 70155800 70162400 Low Mappability +chr11 71505700 71512100 Low Mappability +chr11 71875200 71881700 Low Mappability +chr11 73436900 73439100 Low Mappability +chr11 74128800 74136200 Low Mappability +chr11 74199900 74226800 Low Mappability +chr11 74301700 74319600 High Signal Region +chr11 74540000 74548400 Low Mappability +chr11 74884300 74899000 Low Mappability +chr11 76828100 76868600 Low Mappability +chr11 77255000 77257100 Low Mappability +chr11 79845100 79847300 Low Mappability +chr11 79872400 79877100 Low Mappability +chr11 79917300 79920800 Low Mappability +chr11 81545400 81552800 Low Mappability +chr11 82123300 82144400 High Signal Region +chr11 82333900 82338400 Low Mappability +chr11 83050300 83093600 High Signal Region +chr11 83126000 83172300 Low Mappability +chr11 85046500 85067800 High Signal Region +chr11 85285400 85292700 High Signal Region +chr11 88910900 88917600 Low Mappability +chr11 88965900 88971900 High Signal Region +chr11 89080800 89101300 High Signal Region +chr11 90504000 90510500 High Signal Region +chr11 90829400 90835000 Low Mappability +chr11 90901700 90908400 Low Mappability +chr11 90958500 91026800 Low Mappability +chr11 91047200 91049300 Low Mappability +chr11 92099000 92108200 High Signal Region +chr11 93409300 93428900 High Signal Region +chr11 94622900 94629900 Low Mappability +chr11 96065000 96093900 High Signal Region +chr11 98586900 98673900 Low Mappability +chr11 99712600 99717300 High Signal Region +chr11 100662800 100669700 Low Mappability +chr11 101731800 101741400 High Signal Region +chr11 102992300 103049900 Low Mappability +chr11 104239000 104242600 Low Mappability +chr11 106028100 106037400 High Signal Region +chr11 106254800 106297600 High Signal Region +chr11 106943500 106950100 Low Mappability +chr11 107188200 107200400 High Signal Region +chr11 107281300 107283200 High Signal Region +chr11 108377600 108404500 Low Mappability +chr11 108649800 108655400 Low Mappability +chr11 109010700 109024400 High Signal Region +chr11 109998500 110024600 Low Mappability +chr11 110421300 110423200 High Signal Region +chr11 111182400 111189800 Low Mappability +chr11 111215500 111234900 Low Mappability +chr11 111353300 111360000 Low Mappability +chr11 111855400 111857100 High Signal Region +chr11 112010600 112016400 High Signal Region +chr11 114456300 114462800 Low Mappability +chr11 115014300 115046900 Low Mappability +chr11 115611200 115665700 High Signal Region +chr11 115754800 115766900 Low Mappability +chr11 116389300 116395200 Low Mappability +chr11 116742700 116792800 Low Mappability +chr11 117499800 117505100 Low Mappability +chr11 119299800 119340300 Low Mappability +chr11 120305300 120357300 Low Mappability +chr11 120515100 120644700 High Signal Region +chr11 121069800 121075100 High Signal Region +chr11 121203000 121207500 Low Mappability +chr11 121396100 121422700 Low Mappability +chr11 121611900 121614000 Low Mappability +chr11 121981400 122082500 High Signal Region +chr12 0 3070900 High Signal Region +chr12 3102800 3111000 High Signal Region +chr12 4110500 4112400 High Signal Region +chr12 4218500 4235300 High Signal Region +chr12 4751600 4790100 High Signal Region +chr12 5050300 5065400 High Signal Region +chr12 6514000 6525100 High Signal Region +chr12 6606500 6612600 High Signal Region +chr12 7447300 7449900 High Signal Region +chr12 7801900 7808600 High Signal Region +chr12 7925300 7939600 High Signal Region +chr12 8572000 8640600 High Signal Region +chr12 10693000 10704200 High Signal Region +chr12 10961300 11004600 High Signal Region +chr12 11187600 11194100 High Signal Region +chr12 11642900 11658000 High Signal Region +chr12 12092500 12097600 High Signal Region +chr12 14844600 14848200 High Signal Region +chr12 15026600 15032400 High Signal Region +chr12 15252700 15259600 High Signal Region +chr12 15866100 15871800 High Signal Region +chr12 16746900 16748800 High Signal Region +chr12 17116400 17129400 High Signal Region +chr12 17243500 17248500 High Signal Region +chr12 18340700 18354800 High Signal Region +chr12 18856500 18909700 High Signal Region +chr12 19312600 19413500 High Signal Region +chr12 19442600 19590100 High Signal Region +chr12 19627700 19633600 High Signal Region +chr12 19777500 19781600 High Signal Region +chr12 19879300 19901200 High Signal Region +chr12 19931800 19948600 High Signal Region +chr12 20031900 20205100 High Signal Region +chr12 20225600 20298300 High Signal Region +chr12 21914300 21916000 Low Mappability +chr12 21972100 21987900 High Signal Region +chr12 22021600 22680500 Low Mappability +chr12 22896100 22902300 High Signal Region +chr12 23140700 23225200 High Signal Region +chr12 23283500 24030600 High Signal Region +chr12 24295300 24365100 Low Mappability +chr12 24692300 24727100 High Signal Region +chr12 25591800 25595300 Low Mappability +chr12 25840400 25842100 High Signal Region +chr12 27556800 27592000 High Signal Region +chr12 28491400 28494000 High Signal Region +chr12 28954800 28964000 High Signal Region +chr12 29379500 29400800 High Signal Region +chr12 30965100 31016300 High Signal Region +chr12 32020400 32032500 Low Mappability +chr12 32217700 32219200 High Signal Region +chr12 33388100 33410100 Low Mappability +chr12 33748900 33771800 High Signal Region +chr12 33869500 33880600 High Signal Region +chr12 34056800 34074100 High Signal Region +chr12 34128700 34139700 High Signal Region +chr12 34623000 34629000 Low Mappability +chr12 35783900 35814400 High Signal Region +chr12 36099400 36107200 High Signal Region +chr12 36679100 36700200 Low Mappability +chr12 36952200 36957900 High Signal Region +chr12 38746900 38749300 High Signal Region +chr12 41363500 41385500 High Signal Region +chr12 41502600 41516100 High Signal Region +chr12 41860000 41870200 High Signal Region +chr12 42124500 42126300 High Signal Region +chr12 42437900 42443400 High Signal Region +chr12 42666800 42690800 High Signal Region +chr12 43335600 43349300 High Signal Region +chr12 43659100 43675300 High Signal Region +chr12 43953900 43986900 High Signal Region +chr12 44064500 44070600 High Signal Region +chr12 44765600 44795900 Low Mappability +chr12 45768700 45773700 High Signal Region +chr12 45949200 45962200 High Signal Region +chr12 46707000 46709200 High Signal Region +chr12 47027300 47039300 High Signal Region +chr12 47280500 47286800 High Signal Region +chr12 47328600 47331300 High Signal Region +chr12 47646800 47648300 High Signal Region +chr12 47833000 47834900 High Signal Region +chr12 47995600 47997600 High Signal Region +chr12 48842900 48849500 High Signal Region +chr12 49124800 49155700 High Signal Region +chr12 49245200 49272100 High Signal Region +chr12 49606200 49612000 High Signal Region +chr12 50784600 50789900 High Signal Region +chr12 51486000 51492000 High Signal Region +chr12 52157900 52176400 High Signal Region +chr12 52200400 52223200 High Signal Region +chr12 52579600 52581200 High Signal Region +chr12 52730000 52735400 Low Mappability +chr12 52906200 52952300 High Signal Region +chr12 54358500 54369200 High Signal Region +chr12 54705400 54743600 High Signal Region +chr12 55079600 55267300 Low Mappability +chr12 56104100 56110600 Low Mappability +chr12 56423700 56425000 High Signal Region +chr12 56747800 56752200 High Signal Region +chr12 56911000 56914000 High Signal Region +chr12 58294800 58339800 High Signal Region +chr12 58659000 58692900 High Signal Region +chr12 58858800 58867600 High Signal Region +chr12 59034800 59039300 Low Mappability +chr12 59112800 59124700 High Signal Region +chr12 59270000 59276700 High Signal Region +chr12 59297800 59323200 High Signal Region +chr12 59601000 59605800 High Signal Region +chr12 60069500 60084400 High Signal Region +chr12 60501200 60506200 High Signal Region +chr12 61044200 61045300 High Signal Region +chr12 61289100 61293700 High Signal Region +chr12 61892600 61896100 High Signal Region +chr12 61964500 61971300 High Signal Region +chr12 62035300 62090200 High Signal Region +chr12 62959800 62999500 High Signal Region +chr12 63041800 63048200 High Signal Region +chr12 63289500 63322400 High Signal Region +chr12 63728400 63745100 High Signal Region +chr12 63838200 63840100 High Signal Region +chr12 65260100 65292400 High Signal Region +chr12 65784500 65808300 High Signal Region +chr12 66103800 66127200 High Signal Region +chr12 67058200 67060800 High Signal Region +chr12 67433500 67459300 High Signal Region +chr12 67519200 67571500 High Signal Region +chr12 67828900 67836600 High Signal Region +chr12 68696500 68711800 High Signal Region +chr12 68745100 68750600 Low Mappability +chr12 69059900 69061300 High Signal Region +chr12 69653100 69657800 High Signal Region +chr12 70641800 70668400 Low Mappability +chr12 71077100 71093600 Low Mappability +chr12 71589600 71596000 High Signal Region +chr12 72203000 72209300 High Signal Region +chr12 72634700 72641300 High Signal Region +chr12 74620800 74642100 High Signal Region +chr12 74775800 74778200 High Signal Region +chr12 74803000 74805400 High Signal Region +chr12 74857200 74862700 High Signal Region +chr12 75241800 75248400 High Signal Region +chr12 77160700 77166000 High Signal Region +chr12 77383500 77411300 High Signal Region +chr12 77547200 77553900 High Signal Region +chr12 78260000 78373200 High Signal Region +chr12 78462400 78468500 High Signal Region +chr12 80417200 80449700 High Signal Region +chr12 80894500 80916600 High Signal Region +chr12 81550400 81555100 High Signal Region +chr12 81985400 82064000 Low Mappability +chr12 83093000 83094900 High Signal Region +chr12 85401000 85408600 High Signal Region +chr12 87585600 87771500 Low Mappability +chr12 87802800 88006400 High Signal Region +chr12 88119800 88169700 Low Mappability +chr12 88229600 88312400 High Signal Region +chr12 88493200 88516700 Low Mappability +chr12 91221400 91256000 High Signal Region +chr12 91439200 91475500 High Signal Region +chr12 92393800 92395800 Low Mappability +chr12 92839700 92892700 High Signal Region +chr12 93233800 93265600 High Signal Region +chr12 93564200 93590500 High Signal Region +chr12 93915400 93951600 High Signal Region +chr12 94268500 94273900 High Signal Region +chr12 94550200 94556100 High Signal Region +chr12 94694300 94713700 High Signal Region +chr12 95976100 96021400 High Signal Region +chr12 97038100 97062700 High Signal Region +chr12 97616600 97622400 High Signal Region +chr12 98173700 98176600 High Signal Region +chr12 99644200 99649400 High Signal Region +chr12 100490600 100492300 High Signal Region +chr12 100766900 100825300 High Signal Region +chr12 101427900 101453500 High Signal Region +chr12 101839700 101849500 High Signal Region +chr12 102892000 102893900 High Signal Region +chr12 103458100 103472900 High Signal Region +chr12 103776900 103813700 High Signal Region +chr12 105300300 105307000 High Signal Region +chr12 105435200 105437100 High Signal Region +chr12 105523800 105525700 High Signal Region +chr12 105628200 105631400 High Signal Region +chr12 108078800 108084400 High Signal Region +chr12 109901900 109909200 Low Mappability +chr12 110011800 110013700 High Signal Region +chr12 111388200 111417100 High Signal Region +chr12 112542200 112548700 High Signal Region +chr12 112775700 112830900 Low Mappability +chr12 113423500 113461500 High Signal Region +chr12 114584600 114597100 High Signal Region +chr12 114941500 114943900 High Signal Region +chr12 115725800 115748700 High Signal Region +chr12 116796500 116853000 High Signal Region +chr12 118341100 118358400 High Signal Region +chr12 118794900 118797400 High Signal Region +chr12 119013600 119018100 High Signal Region +chr12 119554500 119598100 High Signal Region +chr12 119659100 119670900 High Signal Region +chr12 120023800 120129000 High Signal Region +chr13 0 3038200 High Signal Region +chr13 3350900 3378900 High Signal Region +chr13 3404500 3438200 High Signal Region +chr13 3901100 3903100 Low Mappability +chr13 4762900 4770300 High Signal Region +chr13 5171400 5178400 High Signal Region +chr13 7601300 7604100 High Signal Region +chr13 7806100 7810900 High Signal Region +chr13 7893500 7899700 High Signal Region +chr13 9828900 9855900 High Signal Region +chr13 10174800 10181100 Low Mappability +chr13 12684400 13073000 High Signal Region +chr13 13752100 13774000 High Signal Region +chr13 13859900 13907900 High Signal Region +chr13 13981000 13983000 High Signal Region +chr13 14690600 14777500 Low Mappability +chr13 18932700 18963600 Low Mappability +chr13 21753300 21847200 Low Mappability +chr13 23620800 23647900 Low Mappability +chr13 25006900 25051500 High Signal Region +chr13 26440600 26448200 High Signal Region +chr13 27164600 27169100 High Signal Region +chr13 27875800 27888500 High Signal Region +chr13 29880700 29886800 Low Mappability +chr13 32889400 32895200 High Signal Region +chr13 33280200 33319400 High Signal Region +chr13 33350500 33491800 High Signal Region +chr13 35687400 35695700 High Signal Region +chr13 36794200 36797400 High Signal Region +chr13 37036700 37043900 High Signal Region +chr13 38633900 38659300 Low Mappability +chr13 42435800 42437700 High Signal Region +chr13 44868600 44870900 High Signal Region +chr13 46316600 46324000 High Signal Region +chr13 50633400 50741800 High Signal Region +chr13 53269000 53270900 High Signal Region +chr13 60675600 60682600 High Signal Region +chr13 62291600 62346800 Low Mappability +chr13 62409800 62426300 High Signal Region +chr13 63142500 63184600 High Signal Region +chr13 64878100 64885300 High Signal Region +chr13 65352900 66254300 Low Mappability +chr13 71381400 71387500 High Signal Region +chr13 74521500 74565200 High Signal Region +chr13 74684000 74712200 High Signal Region +chr13 76472300 76501300 High Signal Region +chr13 77304000 77305900 High Signal Region +chr13 77430600 77440000 High Signal Region +chr13 79563400 79570800 High Signal Region +chr13 80276300 80279400 High Signal Region +chr13 80489100 80491400 High Signal Region +chr13 83419000 83444300 High Signal Region +chr13 85125800 85145900 High Signal Region +chr13 86149500 86190600 High Signal Region +chr13 86502700 86511700 High Signal Region +chr13 88324900 88345400 High Signal Region +chr13 92599100 92625400 Low Mappability +chr13 93279200 93294800 High Signal Region +chr13 93650100 93651500 High Signal Region +chr13 93940300 93955300 High Signal Region +chr13 94016300 94020800 High Signal Region +chr13 97189600 97206100 High Signal Region +chr13 98418200 98420500 Low Mappability +chr13 99774000 99792100 High Signal Region +chr13 102381900 102387900 High Signal Region +chr13 105123500 105128600 Low Mappability +chr13 107839000 107860300 Low Mappability +chr13 110602100 110615800 High Signal Region +chr13 110729600 110745400 High Signal Region +chr13 111187700 111189500 High Signal Region +chr13 111499700 111515900 Low Mappability +chr13 112577200 112595200 High Signal Region +chr13 113171200 113173100 High Signal Region +chr13 113272600 113310700 High Signal Region +chr13 115498200 115504200 High Signal Region +chr13 115741300 115743200 Low Mappability +chr13 116191900 116193900 High Signal Region +chr13 119188100 119230700 High Signal Region +chr13 119486800 119618500 High Signal Region +chr13 119660800 119674100 High Signal Region +chr13 119899200 120147600 Low Mappability +chr13 120320500 120421600 High Signal Region +chr14 0 4323000 High Signal Region +chr14 4372100 4741400 High Signal Region +chr14 4762800 5839200 High Signal Region +chr14 5959700 6479300 High Signal Region +chr14 6500100 6791800 High Signal Region +chr14 6993800 7734200 High Signal Region +chr14 7869900 7872200 High Signal Region +chr14 8005200 8018900 High Signal Region +chr14 8285700 8287800 High Signal Region +chr14 8652200 8658800 Low Mappability +chr14 10086500 10118400 High Signal Region +chr14 10178800 10198700 Low Mappability +chr14 11046200 11050200 High Signal Region +chr14 12536700 12538700 High Signal Region +chr14 14333600 14340200 High Signal Region +chr14 15460700 15467200 High Signal Region +chr14 16907800 16914000 High Signal Region +chr14 16937900 16941100 High Signal Region +chr14 18487900 18494100 High Signal Region +chr14 19251900 19255700 High Signal Region +chr14 19277200 19279100 High Signal Region +chr14 19414800 19633500 High Signal Region +chr14 21360400 21366100 High Signal Region +chr14 21878600 21884500 High Signal Region +chr14 22542900 22570000 High Signal Region +chr14 22902100 22934800 High Signal Region +chr14 25875200 26292200 High Signal Region +chr14 26946900 26948800 High Signal Region +chr14 29001300 29003200 Low Mappability +chr14 29343900 29345700 Low Mappability +chr14 30748800 30754700 High Signal Region +chr14 31919300 31923900 High Signal Region +chr14 32115300 32120500 Low Mappability +chr14 33667700 33670000 Low Mappability +chr14 33981000 33987500 Low Mappability +chr14 35275300 35281500 High Signal Region +chr14 35709400 35722200 High Signal Region +chr14 36429100 36440100 High Signal Region +chr14 37229100 37260800 Low Mappability +chr14 37619400 37635200 Low Mappability +chr14 38086800 38116800 High Signal Region +chr14 38280800 38283100 High Signal Region +chr14 38455100 38462200 Low Mappability +chr14 39580800 39607200 High Signal Region +chr14 39731900 39737200 High Signal Region +chr14 39905500 39911100 High Signal Region +chr14 41053200 41061900 Low Mappability +chr14 41326900 43109000 High Signal Region +chr14 43132400 43668900 High Signal Region +chr14 43803900 43850200 High Signal Region +chr14 44149300 44152100 High Signal Region +chr14 44273800 44343500 High Signal Region +chr14 44514200 44516000 Low Mappability +chr14 45726200 45753500 High Signal Region +chr14 45811900 45813800 High Signal Region +chr14 46269900 46274300 High Signal Region +chr14 47609500 47630400 High Signal Region +chr14 50538900 50606000 High Signal Region +chr14 50626200 50638500 High Signal Region +chr14 51472000 51515400 High Signal Region +chr14 51730700 51768100 High Signal Region +chr14 51814200 51837200 High Signal Region +chr14 52821200 53035800 Low Mappability +chr14 53146700 53340000 High Signal Region +chr14 53475200 53479600 High Signal Region +chr14 53515600 53530500 Low Mappability +chr14 56447800 56455700 High Signal Region +chr14 56693100 56695000 High Signal Region +chr14 58052600 58059800 Low Mappability +chr14 58462700 58464600 Low Mappability +chr14 58657800 58659700 High Signal Region +chr14 58831400 58833300 High Signal Region +chr14 59250300 59270000 High Signal Region +chr14 59488900 59490800 High Signal Region +chr14 59980800 59995700 High Signal Region +chr14 60328300 60357300 High Signal Region +chr14 60960000 60961900 Low Mappability +chr14 61580500 61586700 High Signal Region +chr14 61855000 61856300 High Signal Region +chr14 62107300 62126200 High Signal Region +chr14 64290100 64292500 High Signal Region +chr14 64463300 64478500 Low Mappability +chr14 65128900 65135300 Low Mappability +chr14 66427000 66428400 High Signal Region +chr14 68232600 68278200 High Signal Region +chr14 69161000 69163400 High Signal Region +chr14 70974500 70975600 High Signal Region +chr14 71121300 71126700 High Signal Region +chr14 71449700 71453700 High Signal Region +chr14 71783600 71804000 High Signal Region +chr14 72900100 72921400 High Signal Region +chr14 73644600 73679900 High Signal Region +chr14 73847900 73861200 High Signal Region +chr14 74039300 74066900 High Signal Region +chr14 74124400 74138500 High Signal Region +chr14 74435600 74447800 High Signal Region +chr14 75425300 75440500 High Signal Region +chr14 78162300 78168200 High Signal Region +chr14 78401700 78403200 High Signal Region +chr14 79145300 79196400 High Signal Region +chr14 80148100 80150800 High Signal Region +chr14 80422800 80439400 High Signal Region +chr14 80622600 80627700 High Signal Region +chr14 81333200 81337500 High Signal Region +chr14 81495300 81519300 High Signal Region +chr14 82077600 82084900 High Signal Region +chr14 82846900 82867200 High Signal Region +chr14 82958700 82964100 High Signal Region +chr14 83292900 83306500 High Signal Region +chr14 83507000 83512600 High Signal Region +chr14 84354700 84409800 High Signal Region +chr14 84855100 84881600 Low Mappability +chr14 85177800 85203300 Low Mappability +chr14 85521200 85535200 Low Mappability +chr14 86198000 86200000 High Signal Region +chr14 86590500 86614400 High Signal Region +chr14 87354600 87373000 High Signal Region +chr14 87671400 87677500 High Signal Region +chr14 87790500 87852200 High Signal Region +chr14 88450200 88453600 High Signal Region +chr14 88478400 88480300 High Signal Region +chr14 90018300 90019500 High Signal Region +chr14 90294700 90301800 High Signal Region +chr14 90910200 90912200 High Signal Region +chr14 91415900 91418400 High Signal Region +chr14 91510800 91514900 High Signal Region +chr14 91672700 91694800 High Signal Region +chr14 91951700 91976400 High Signal Region +chr14 92032500 92040900 High Signal Region +chr14 92383600 92389900 High Signal Region +chr14 92411600 92432900 High Signal Region +chr14 92792600 92798500 High Signal Region +chr14 92921100 92953200 High Signal Region +chr14 93017600 93020400 High Signal Region +chr14 93355600 93360200 High Signal Region +chr14 94319700 94327000 High Signal Region +chr14 95561600 95567600 High Signal Region +chr14 96048000 96054300 High Signal Region +chr14 96093600 96116100 High Signal Region +chr14 97323800 97326500 High Signal Region +chr14 98226800 98237000 High Signal Region +chr14 98731900 98757200 High Signal Region +chr14 99207100 99208200 High Signal Region +chr14 99649700 99655500 High Signal Region +chr14 101076400 101098900 Low Mappability +chr14 101404800 101414800 High Signal Region +chr14 102548900 102565300 High Signal Region +chr14 102755800 102762600 High Signal Region +chr14 103300300 103302400 High Signal Region +chr14 103858600 103872900 High Signal Region +chr14 103999500 104025500 High Signal Region +chr14 104104800 104128100 Low Mappability +chr14 104704500 104716800 High Signal Region +chr14 105758200 105764900 Low Mappability +chr14 105911400 105978300 High Signal Region +chr14 106002700 106005700 Low Mappability +chr14 106301000 106352700 High Signal Region +chr14 106444800 106483100 Low Mappability +chr14 106722600 106728700 High Signal Region +chr14 106895300 106897000 Low Mappability +chr14 108115100 108174900 Low Mappability +chr14 108283900 108303500 High Signal Region +chr14 109675300 109681200 High Signal Region +chr14 109911500 109917800 High Signal Region +chr14 110057000 110108200 Low Mappability +chr14 110356200 110373800 High Signal Region +chr14 110492000 110495700 Low Mappability +chr14 110906100 110908200 High Signal Region +chr14 110992800 110994500 High Signal Region +chr14 111903200 111909800 High Signal Region +chr14 112074600 112092300 High Signal Region +chr14 112210500 112215800 High Signal Region +chr14 112285400 112291900 High Signal Region +chr14 112332800 112340000 Low Mappability +chr14 112517900 112519900 High Signal Region +chr14 112627800 112663100 Low Mappability +chr14 114505900 114512900 High Signal Region +chr14 114822000 114823900 Low Mappability +chr14 115109700 115117400 High Signal Region +chr14 115272500 115280200 High Signal Region +chr14 115379200 115385600 High Signal Region +chr14 115911100 115912900 High Signal Region +chr14 115958100 115965000 High Signal Region +chr14 116402700 116407700 High Signal Region +chr14 116817000 116822900 High Signal Region +chr14 117285800 117292800 High Signal Region +chr14 118144700 118168500 Low Mappability +chr14 119286000 119287900 High Signal Region +chr14 120180000 120202600 High Signal Region +chr14 120742600 120749700 High Signal Region +chr14 120777500 120802300 High Signal Region +chr14 121007000 121010900 Low Mappability +chr14 122502500 122534800 High Signal Region +chr14 123349400 123351300 Low Mappability +chr14 123412000 123452600 High Signal Region +chr14 123674600 123695600 High Signal Region +chr14 124334000 124340200 High Signal Region +chr14 124415600 124436400 High Signal Region +chr14 124491600 124497700 High Signal Region +chr14 124739500 124902200 High Signal Region +chr15 0 3125600 High Signal Region +chr15 3150900 3170400 High Signal Region +chr15 3313900 3336200 High Signal Region +chr15 3360500 3363700 High Signal Region +chr15 3538600 3551000 High Signal Region +chr15 3712200 3732700 High Signal Region +chr15 3793500 3823000 High Signal Region +chr15 4155900 4160900 High Signal Region +chr15 4278500 4284100 High Signal Region +chr15 4852000 4894600 Low Mappability +chr15 4980200 4987600 Low Mappability +chr15 5369000 5385500 High Signal Region +chr15 5681700 5690400 High Signal Region +chr15 5910000 5911700 High Signal Region +chr15 5993500 5995400 High Signal Region +chr15 6074100 6087100 Low Mappability +chr15 6192800 6200000 Low Mappability +chr15 6316000 6317900 High Signal Region +chr15 6510500 6539100 High Signal Region +chr15 6674800 6701400 High Signal Region +chr15 6801200 6808300 High Signal Region +chr15 7539900 7548600 Low Mappability +chr15 7800800 7803000 Low Mappability +chr15 7849400 7855600 High Signal Region +chr15 7904400 7929500 Low Mappability +chr15 8517500 8520400 High Signal Region +chr15 8548000 8576100 Low Mappability +chr15 8800200 8808700 High Signal Region +chr15 8985200 9054800 High Signal Region +chr15 9219000 9224900 Low Mappability +chr15 9293200 9333300 High Signal Region +chr15 9379300 9409100 High Signal Region +chr15 9437100 9443600 High Signal Region +chr15 9536500 9554100 High Signal Region +chr15 9992700 10045700 High Signal Region +chr15 10579600 10591500 Low Mappability +chr15 10753400 10810200 High Signal Region +chr15 10835200 10854700 Low Mappability +chr15 11921000 11933300 High Signal Region +chr15 12055800 12063200 Low Mappability +chr15 12526800 12531900 Low Mappability +chr15 12872000 12873900 High Signal Region +chr15 12932300 12934200 Low Mappability +chr15 13919500 13948300 High Signal Region +chr15 14414600 14439100 Low Mappability +chr15 14722200 14732900 High Signal Region +chr15 14873900 14902400 High Signal Region +chr15 15043600 15059700 High Signal Region +chr15 15525500 15551900 High Signal Region +chr15 16168200 16186400 High Signal Region +chr15 16303700 16309500 High Signal Region +chr15 16716400 16717500 High Signal Region +chr15 16901300 16907100 High Signal Region +chr15 16939800 16955100 Low Mappability +chr15 17139000 17169100 High Signal Region +chr15 17562100 17581400 High Signal Region +chr15 18314600 18325000 High Signal Region +chr15 19038400 19063800 Low Mappability +chr15 19402600 19405500 High Signal Region +chr15 19448100 19453900 High Signal Region +chr15 19557200 19578000 High Signal Region +chr15 19626800 19631800 High Signal Region +chr15 19678400 19685800 High Signal Region +chr15 20063000 20067500 High Signal Region +chr15 20155100 20170700 Low Mappability +chr15 20474900 20510100 High Signal Region +chr15 20531400 20537100 High Signal Region +chr15 20821500 20826700 High Signal Region +chr15 20972700 20978300 Low Mappability +chr15 21114000 21115900 High Signal Region +chr15 21262100 21268500 Low Mappability +chr15 21423200 21487200 High Signal Region +chr15 21655500 21657500 High Signal Region +chr15 21815500 21820800 High Signal Region +chr15 21853700 21892400 High Signal Region +chr15 22268700 22293500 High Signal Region +chr15 22751400 22756700 Low Mappability +chr15 22799300 22809700 Low Mappability +chr15 23240200 23255600 Low Mappability +chr15 23465300 23467800 High Signal Region +chr15 23886000 23887900 Low Mappability +chr15 23926900 23939700 High Signal Region +chr15 24309300 24325700 Low Mappability +chr15 24761100 24766700 High Signal Region +chr15 24801600 24837300 High Signal Region +chr15 24880900 24898600 Low Mappability +chr15 25051400 25065200 Low Mappability +chr15 26112700 26118900 High Signal Region +chr15 26905000 26919300 Low Mappability +chr15 27286100 27326800 High Signal Region +chr15 27384100 27390300 Low Mappability +chr15 27638200 27640500 High Signal Region +chr15 28564400 28578800 High Signal Region +chr15 29285200 29291500 Low Mappability +chr15 29347600 29395600 High Signal Region +chr15 29463900 29470200 High Signal Region +chr15 29969800 30001400 High Signal Region +chr15 30117700 30126200 High Signal Region +chr15 30441400 30448200 Low Mappability +chr15 30747900 30755000 High Signal Region +chr15 30996700 31016300 High Signal Region +chr15 31066700 31083700 High Signal Region +chr15 32783900 32806700 High Signal Region +chr15 32832800 32880300 High Signal Region +chr15 33138700 33140800 Low Mappability +chr15 33308700 33310800 Low Mappability +chr15 33444200 33454100 High Signal Region +chr15 33710200 33745700 High Signal Region +chr15 33781400 33849400 High Signal Region +chr15 33869800 33884700 High Signal Region +chr15 34494500 34502100 Low Mappability +chr15 34763100 34769400 High Signal Region +chr15 34987600 34992800 High Signal Region +chr15 35013200 35015400 High Signal Region +chr15 35366800 35406000 High Signal Region +chr15 36715200 36737400 High Signal Region +chr15 36966700 36997400 Low Mappability +chr15 37072900 37150800 Low Mappability +chr15 38462300 38484300 Low Mappability +chr15 39172900 39178300 Low Mappability +chr15 39335600 39348800 Low Mappability +chr15 39496100 39499100 High Signal Region +chr15 39695600 39718600 Low Mappability +chr15 40049600 40056000 High Signal Region +chr15 40086800 40101400 High Signal Region +chr15 41531400 41533200 High Signal Region +chr15 41890400 41896900 Low Mappability +chr15 42354900 42361100 High Signal Region +chr15 42925300 42942800 High Signal Region +chr15 43287300 43346300 High Signal Region +chr15 44469100 44476400 High Signal Region +chr15 44649000 44659600 Low Mappability +chr15 44723200 44728200 Low Mappability +chr15 44769700 44796100 High Signal Region +chr15 45005100 45009300 High Signal Region +chr15 45194600 45197100 High Signal Region +chr15 45577500 45590900 High Signal Region +chr15 45635600 45650500 High Signal Region +chr15 45774400 45779700 High Signal Region +chr15 45890700 45932500 High Signal Region +chr15 46255700 46257800 Low Mappability +chr15 46355600 46368400 High Signal Region +chr15 46502200 46506800 Low Mappability +chr15 46562500 46566200 Low Mappability +chr15 47232800 47256000 High Signal Region +chr15 47356500 47363700 Low Mappability +chr15 47539000 47555300 High Signal Region +chr15 48666900 48671000 High Signal Region +chr15 49283300 49299700 High Signal Region +chr15 49322600 49327300 Low Mappability +chr15 50426100 50442800 High Signal Region +chr15 50557700 50642600 High Signal Region +chr15 51113200 51117800 High Signal Region +chr15 51531900 51533900 Low Mappability +chr15 52125800 52131200 High Signal Region +chr15 52329800 52353100 High Signal Region +chr15 53039200 53044200 Low Mappability +chr15 53831000 53834900 High Signal Region +chr15 53870700 53872700 High Signal Region +chr15 53918300 53929500 High Signal Region +chr15 54180700 54211500 Low Mappability +chr15 56032900 56038200 High Signal Region +chr15 56175800 56183100 Low Mappability +chr15 56363800 56367900 High Signal Region +chr15 56400500 56402200 High Signal Region +chr15 56941600 56993500 High Signal Region +chr15 57279500 57285000 High Signal Region +chr15 57412200 57433600 High Signal Region +chr15 57889500 57913700 Low Mappability +chr15 58437200 58441100 High Signal Region +chr15 59421400 59435400 Low Mappability +chr15 59850100 59875200 Low Mappability +chr15 60153100 60203900 High Signal Region +chr15 60592000 60594300 Low Mappability +chr15 60931800 60986500 High Signal Region +chr15 61148600 61150700 High Signal Region +chr15 61903100 61915500 High Signal Region +chr15 62367600 62370100 High Signal Region +chr15 62553200 62555200 High Signal Region +chr15 62686500 62693700 High Signal Region +chr15 63329400 63346600 Low Mappability +chr15 63626000 63627900 High Signal Region +chr15 63791700 63796000 High Signal Region +chr15 63837600 63922800 High Signal Region +chr15 64591700 64598200 Low Mappability +chr15 64673500 64681900 High Signal Region +chr15 65115600 65123500 Low Mappability +chr15 65598500 65604500 High Signal Region +chr15 65666600 65673800 High Signal Region +chr15 65714400 65753500 High Signal Region +chr15 66045100 66065700 High Signal Region +chr15 66208300 66210200 High Signal Region +chr15 68136300 68137800 Low Mappability +chr15 68980000 68986500 High Signal Region +chr15 69122300 69164500 High Signal Region +chr15 69264900 69268800 High Signal Region +chr15 69390300 69409400 High Signal Region +chr15 69642000 69646000 High Signal Region +chr15 70083000 70088800 High Signal Region +chr15 70609300 70611100 High Signal Region +chr15 70896600 70914000 High Signal Region +chr15 71104600 71112200 High Signal Region +chr15 71206600 71237500 Low Mappability +chr15 73060200 73087900 Low Mappability +chr15 73373200 73378200 Low Mappability +chr15 73873000 73880400 Low Mappability +chr15 74360700 74368000 Low Mappability +chr15 74814300 74826700 Low Mappability +chr15 74992000 75104600 High Signal Region +chr15 75205600 75212800 Low Mappability +chr15 75298000 75299500 High Signal Region +chr15 75437000 75440500 High Signal Region +chr15 75523600 75529700 High Signal Region +chr15 76102000 76106500 High Signal Region +chr15 76559900 76577900 Low Mappability +chr15 76964600 76971400 Low Mappability +chr15 77336200 77439100 High Signal Region +chr15 77718300 77735600 Low Mappability +chr15 77895000 77934800 Low Mappability +chr15 79685000 79775700 Low Mappability +chr15 79869700 79892600 Low Mappability +chr15 79974400 79978400 Low Mappability +chr15 80232400 80267100 High Signal Region +chr15 81145400 81152000 Low Mappability +chr15 81492300 81523600 High Signal Region +chr15 82338000 82368000 Low Mappability +chr15 82590700 82608900 Low Mappability +chr15 82675500 82677200 High Signal Region +chr15 83172100 83202200 Low Mappability +chr15 84746600 84753000 Low Mappability +chr15 85176800 85196600 Low Mappability +chr15 85541200 85543100 High Signal Region +chr15 86193800 86196100 High Signal Region +chr15 86312100 86326400 Low Mappability +chr15 87293900 87301200 Low Mappability +chr15 87967000 87969000 High Signal Region +chr15 88779400 88783900 Low Mappability +chr15 88974800 88976800 High Signal Region +chr15 89597900 89621300 High Signal Region +chr15 89808500 89809700 High Signal Region +chr15 89943000 89982000 Low Mappability +chr15 90636400 90643600 Low Mappability +chr15 91115900 91134800 Low Mappability +chr15 91419400 91422200 High Signal Region +chr15 91720600 91723200 Low Mappability +chr15 91905900 91911200 High Signal Region +chr15 92470100 92475100 Low Mappability +chr15 92613700 92618300 Low Mappability +chr15 92722600 92730100 Low Mappability +chr15 92796100 92820000 Low Mappability +chr15 93044100 93062000 High Signal Region +chr15 93467800 93469500 Low Mappability +chr15 93867100 93873600 High Signal Region +chr15 94088400 94124100 High Signal Region +chr15 94150500 94156800 High Signal Region +chr15 94373000 94379600 High Signal Region +chr15 95087600 95092100 High Signal Region +chr15 95306000 95312300 High Signal Region +chr15 95729500 95756400 High Signal Region +chr15 96551700 96559500 Low Mappability +chr15 96977900 96983600 Low Mappability +chr15 97082100 97084300 High Signal Region +chr15 97472900 97487400 Low Mappability +chr15 99168800 99171900 High Signal Region +chr15 99552100 99553900 Low Mappability +chr15 100331500 100339800 Low Mappability +chr15 100360000 100379700 Low Mappability +chr15 100541700 100617400 Low Mappability +chr15 101655700 101662100 High Signal Region +chr15 102596800 102603200 High Signal Region +chr15 103271900 103277100 High Signal Region +chr15 103406700 103418500 High Signal Region +chr15 103606700 103611400 High Signal Region +chr15 103814500 104043600 High Signal Region +chr16 0 3427800 High Signal Region +chr16 3450300 3519700 Low Mappability +chr16 4300400 4366800 Low Mappability +chr16 4585000 4591300 High Signal Region +chr16 5708200 5710200 High Signal Region +chr16 7460800 7463600 High Signal Region +chr16 7937100 7958400 Low Mappability +chr16 8256700 8286200 High Signal Region +chr16 9577100 9579600 Low Mappability +chr16 10631200 10633200 Low Mappability +chr16 10974100 11013900 High Signal Region +chr16 11134600 11145200 High Signal Region +chr16 11248000 11249900 Low Mappability +chr16 11679900 11687500 Low Mappability +chr16 12327300 12345900 Low Mappability +chr16 12417900 12423400 High Signal Region +chr16 12829200 12831000 High Signal Region +chr16 12976200 12981700 Low Mappability +chr16 13087700 13107000 Low Mappability +chr16 13903200 13925900 Low Mappability +chr16 14316200 14341200 Low Mappability +chr16 15502700 15510100 Low Mappability +chr16 15741400 15757700 Low Mappability +chr16 17199900 17236000 High Signal Region +chr16 17751400 17761300 High Signal Region +chr16 17910400 17955500 High Signal Region +chr16 18532200 18534200 High Signal Region +chr16 18957500 18979200 High Signal Region +chr16 19334200 19375100 High Signal Region +chr16 19581200 19602400 Low Mappability +chr16 19711900 19748700 High Signal Region +chr16 19928600 19946300 Low Mappability +chr16 22923300 22929100 High Signal Region +chr16 26419300 26421200 High Signal Region +chr16 26808500 26814800 High Signal Region +chr16 27071900 27087600 High Signal Region +chr16 27212200 27218300 High Signal Region +chr16 28170600 28197500 High Signal Region +chr16 30828600 30830500 High Signal Region +chr16 31223800 31234300 Low Mappability +chr16 31339100 31358900 High Signal Region +chr16 31818700 31825200 Low Mappability +chr16 32147700 32153500 Low Mappability +chr16 32489700 32520100 Low Mappability +chr16 32579100 32598800 Low Mappability +chr16 33847200 33852600 Low Mappability +chr16 34581100 34591200 Low Mappability +chr16 34742000 34744000 High Signal Region +chr16 35980600 35983300 High Signal Region +chr16 36764900 36770500 Low Mappability +chr16 38714200 38721600 Low Mappability +chr16 39563700 39568200 High Signal Region +chr16 41270700 41273100 High Signal Region +chr16 42657300 42661200 High Signal Region +chr16 42773100 42779900 High Signal Region +chr16 42931600 42950000 High Signal Region +chr16 43764000 43771600 Low Mappability +chr16 44040400 44063900 Low Mappability +chr16 44709800 44726400 Low Mappability +chr16 44920200 44950700 Low Mappability +chr16 45292600 45293900 High Signal Region +chr16 45352100 45354000 High Signal Region +chr16 46364600 46369100 High Signal Region +chr16 47099100 47147300 High Signal Region +chr16 47552300 47564100 Low Mappability +chr16 48579900 48581300 Low Mappability +chr16 49024900 49031400 Low Mappability +chr16 49148400 49150300 Low Mappability +chr16 49447700 49489300 High Signal Region +chr16 50084900 50101400 Low Mappability +chr16 50909100 50926800 Low Mappability +chr16 51087100 51094300 Low Mappability +chr16 51945800 51980200 High Signal Region +chr16 53412000 53428900 High Signal Region +chr16 53571500 53595400 Low Mappability +chr16 54298300 54307600 Low Mappability +chr16 54861600 54869000 High Signal Region +chr16 54959000 54965200 High Signal Region +chr16 55647800 55681600 Low Mappability +chr16 56038100 56065100 Low Mappability +chr16 56988400 57008400 High Signal Region +chr16 57085500 57095800 High Signal Region +chr16 57390200 57392600 High Signal Region +chr16 57792800 57811700 Low Mappability +chr16 58310800 58343000 High Signal Region +chr16 58632300 58670400 Low Mappability +chr16 59121800 59129100 Low Mappability +chr16 59310100 59378100 High Signal Region +chr16 60921200 60970900 High Signal Region +chr16 61312500 61325200 Low Mappability +chr16 62564300 62599200 High Signal Region +chr16 62875900 62880400 Low Mappability +chr16 63114300 63151200 High Signal Region +chr16 63301300 63313600 High Signal Region +chr16 64384600 64425600 High Signal Region +chr16 65176900 65181400 Low Mappability +chr16 66229300 66247600 Low Mappability +chr16 67328200 67334700 High Signal Region +chr16 68272300 68274300 High Signal Region +chr16 70542300 70558300 Low Mappability +chr16 70633900 70639700 Low Mappability +chr16 70892400 70898400 High Signal Region +chr16 70976900 70982900 High Signal Region +chr16 71687000 71691500 Low Mappability +chr16 72019300 72023900 Low Mappability +chr16 72056200 72062100 High Signal Region +chr16 72724800 72730900 Low Mappability +chr16 73656700 73688600 High Signal Region +chr16 74771800 74781500 Low Mappability +chr16 76057000 76065000 Low Mappability +chr16 76487100 76519600 High Signal Region +chr16 76988700 76991600 High Signal Region +chr16 77116900 77121900 Low Mappability +chr16 78977100 79013600 High Signal Region +chr16 79368600 79376000 Low Mappability +chr16 79782000 79786700 High Signal Region +chr16 79943000 79948600 Low Mappability +chr16 80269400 80309700 Low Mappability +chr16 81071700 81079200 Low Mappability +chr16 81779900 81782000 High Signal Region +chr16 81859300 81865600 High Signal Region +chr16 82079700 82099600 High Signal Region +chr16 82237800 82243200 Low Mappability +chr16 82828200 82845600 High Signal Region +chr16 83077300 83081800 High Signal Region +chr16 83360600 83368000 Low Mappability +chr16 84260500 84283300 High Signal Region +chr16 84380600 84407600 High Signal Region +chr16 84440100 84446000 High Signal Region +chr16 85671600 85673000 High Signal Region +chr16 85713500 85720100 High Signal Region +chr16 86333000 86354300 High Signal Region +chr16 86539500 86570300 High Signal Region +chr16 86819800 86822100 High Signal Region +chr16 87055400 87060300 High Signal Region +chr16 87287400 87302500 Low Mappability +chr16 87372300 87391700 Low Mappability +chr16 88022900 88029900 High Signal Region +chr16 88790600 88797900 Low Mappability +chr16 88957900 88967800 High Signal Region +chr16 89145200 89196100 Low Mappability +chr16 89431800 89448400 Low Mappability +chr16 89636000 89642900 High Signal Region +chr16 89877500 89879700 High Signal Region +chr16 90056200 90072300 Low Mappability +chr16 90341200 90350100 Low Mappability +chr16 91533700 91551800 High Signal Region +chr16 92254500 92259400 Low Mappability +chr16 93581500 93622800 High Signal Region +chr16 93685800 93711200 High Signal Region +chr16 93785700 93790200 High Signal Region +chr16 93991400 93997900 High Signal Region +chr16 94258100 94282000 Low Mappability +chr16 95782000 95788900 High Signal Region +chr16 95991000 96010400 Low Mappability +chr16 97996400 98207700 High Signal Region +chr17 0 3039300 High Signal Region +chr17 3075400 3085400 High Signal Region +chr17 3378900 3380800 High Signal Region +chr17 5863900 5885100 High Signal Region +chr17 6219100 6717500 High Signal Region +chr17 6877300 7037900 High Signal Region +chr17 7302300 7430200 High Signal Region +chr17 7615300 7617200 High Signal Region +chr17 7950200 8052300 High Signal Region +chr17 11097900 11105100 High Signal Region +chr17 13018500 13469100 High Signal Region +chr17 13492200 13555800 High Signal Region +chr17 13584800 13656200 High Signal Region +chr17 14961200 15054300 Low Mappability +chr17 20859400 20865200 High Signal Region +chr17 23426600 23537000 High Signal Region +chr17 23730600 23732500 High Signal Region +chr17 24095300 24097300 High Signal Region +chr17 29101000 29109600 High Signal Region +chr17 31569500 31571400 High Signal Region +chr17 35367400 35480300 Low Mappability +chr17 36230300 36232500 High Signal Region +chr17 38498200 38500800 High Signal Region +chr17 39842000 39849700 High Signal Region +chr17 40422500 40427000 High Signal Region +chr17 50569500 50571400 High Signal Region +chr17 53034300 53056100 High Signal Region +chr17 53151500 53153500 High Signal Region +chr17 53807400 53820300 High Signal Region +chr17 54112300 54134200 High Signal Region +chr17 57368400 57399900 High Signal Region +chr17 62736600 62738500 High Signal Region +chr17 66798500 66800400 High Signal Region +chr17 67740400 67742500 High Signal Region +chr17 70962200 70964800 High Signal Region +chr17 82975900 82991600 High Signal Region +chr17 84458800 84464500 Low Mappability +chr17 85264100 85266000 High Signal Region +chr17 93017000 93047400 High Signal Region +chr17 93623500 93646700 High Signal Region +chr17 94886200 94987200 High Signal Region +chr18 0 3063700 High Signal Region +chr18 3085500 3142600 High Signal Region +chr18 3568100 3570100 Low Mappability +chr18 3619800 3652100 Low Mappability +chr18 3779700 3785600 High Signal Region +chr18 3815100 3819300 High Signal Region +chr18 3873200 3889000 High Signal Region +chr18 4194700 4199900 High Signal Region +chr18 4456700 4504600 High Signal Region +chr18 4658000 4664400 Low Mappability +chr18 4695200 4701800 Low Mappability +chr18 5499400 5502000 Low Mappability +chr18 5895900 5900400 Low Mappability +chr18 6043700 6046600 Low Mappability +chr18 6343100 6376400 Low Mappability +chr18 6663800 6669200 High Signal Region +chr18 6796200 6803600 Low Mappability +chr18 6853600 6868500 Low Mappability +chr18 7032800 7035500 High Signal Region +chr18 7527500 7534800 High Signal Region +chr18 7782300 7798400 High Signal Region +chr18 7998000 8018800 Low Mappability +chr18 8164900 8183000 High Signal Region +chr18 8243000 8271800 High Signal Region +chr18 8292000 8294000 Low Mappability +chr18 8721900 8747000 High Signal Region +chr18 9095200 9127300 High Signal Region +chr18 9248500 9269200 Low Mappability +chr18 9420000 9426100 High Signal Region +chr18 9890700 9915900 High Signal Region +chr18 11168900 11192100 High Signal Region +chr18 11247700 11293200 High Signal Region +chr18 11626000 11648000 Low Mappability +chr18 12945100 12956300 High Signal Region +chr18 13030000 13041900 High Signal Region +chr18 13161400 13180500 High Signal Region +chr18 13241200 13251100 Low Mappability +chr18 13296400 13300000 High Signal Region +chr18 13513200 13517200 High Signal Region +chr18 14732900 14739600 Low Mappability +chr18 15225500 15232800 High Signal Region +chr18 15366900 15382100 High Signal Region +chr18 15695100 15737600 High Signal Region +chr18 16283100 16288900 High Signal Region +chr18 16988600 17013600 Low Mappability +chr18 17116100 17119600 High Signal Region +chr18 17346100 17352400 High Signal Region +chr18 17425100 17480600 High Signal Region +chr18 17513300 17517900 High Signal Region +chr18 17541300 17559000 High Signal Region +chr18 17593300 17598500 High Signal Region +chr18 17938300 17951600 Low Mappability +chr18 18816600 18823800 High Signal Region +chr18 18916300 18917900 High Signal Region +chr18 18976900 18992400 High Signal Region +chr18 19240600 19289100 High Signal Region +chr18 19345800 19352600 Low Mappability +chr18 19430400 19448100 High Signal Region +chr18 19679600 19681600 Low Mappability +chr18 19812100 19836500 High Signal Region +chr18 20352500 20369800 High Signal Region +chr18 20896200 20910000 Low Mappability +chr18 21261800 21268900 Low Mappability +chr18 21528200 21541600 High Signal Region +chr18 21943200 21945200 Low Mappability +chr18 22297400 22304000 High Signal Region +chr18 23186200 23215300 High Signal Region +chr18 25045100 25047300 High Signal Region +chr18 25253000 25259500 High Signal Region +chr18 25905600 25928600 High Signal Region +chr18 26003000 26008100 Low Mappability +chr18 26829800 26837100 Low Mappability +chr18 26998200 27005600 Low Mappability +chr18 27062000 27068200 High Signal Region +chr18 28151300 28167300 High Signal Region +chr18 28441700 28446600 Low Mappability +chr18 28482900 28484900 High Signal Region +chr18 28814100 28816900 High Signal Region +chr18 28960100 28966000 Low Mappability +chr18 29014700 29022000 High Signal Region +chr18 29557800 29559800 High Signal Region +chr18 29713000 29719200 High Signal Region +chr18 31281100 31294300 High Signal Region +chr18 32758400 32793400 High Signal Region +chr18 33212800 33221500 Low Mappability +chr18 33275100 33331000 High Signal Region +chr18 33697400 33722600 Low Mappability +chr18 34083600 34087300 Low Mappability +chr18 34397100 34409800 Low Mappability +chr18 35318500 35320400 Low Mappability +chr18 36454200 36494600 Low Mappability +chr18 36981500 36988700 Low Mappability +chr18 37031800 37045800 High Signal Region +chr18 37364600 37398900 Low Mappability +chr18 37545500 37645000 High Signal Region +chr18 39598600 39604900 High Signal Region +chr18 40306300 40309300 High Signal Region +chr18 40708500 40713600 Low Mappability +chr18 41381600 41387500 High Signal Region +chr18 41465300 41471500 High Signal Region +chr18 41820100 41826100 High Signal Region +chr18 41960600 41966100 High Signal Region +chr18 42556800 42559800 High Signal Region +chr18 42913000 42914900 High Signal Region +chr18 43335500 43337900 High Signal Region +chr18 43889500 43900400 High Signal Region +chr18 44033600 44050200 High Signal Region +chr18 44228000 44263100 High Signal Region +chr18 44291600 44295600 High Signal Region +chr18 44361600 44380500 High Signal Region +chr18 44873100 44875100 Low Mappability +chr18 44981000 45032700 High Signal Region +chr18 45131400 45133400 High Signal Region +chr18 45291700 45314300 Low Mappability +chr18 45357300 45364700 Low Mappability +chr18 45392200 45397700 High Signal Region +chr18 45506800 45513400 High Signal Region +chr18 45998300 46038000 Low Mappability +chr18 46082000 46101400 High Signal Region +chr18 46439100 46444100 Low Mappability +chr18 46791400 46793400 Low Mappability +chr18 47648600 47654100 Low Mappability +chr18 47769900 47783100 Low Mappability +chr18 48009500 48011400 High Signal Region +chr18 48208100 48220300 High Signal Region +chr18 48705800 48713100 Low Mappability +chr18 48831300 48836100 High Signal Region +chr18 49387700 49397800 High Signal Region +chr18 49669200 49695600 High Signal Region +chr18 50253400 50268700 High Signal Region +chr18 50632100 50700200 Low Mappability +chr18 51072000 51077600 Low Mappability +chr18 51658600 51698300 High Signal Region +chr18 52020200 52059300 High Signal Region +chr18 52256200 52262200 High Signal Region +chr18 52378900 52395000 Low Mappability +chr18 52876200 52883200 High Signal Region +chr18 53828800 53839900 Low Mappability +chr18 53869300 53876600 Low Mappability +chr18 54023900 54030000 High Signal Region +chr18 54288100 54335900 Low Mappability +chr18 54698000 54707800 High Signal Region +chr18 55222400 55224400 Low Mappability +chr18 55311000 55321100 Low Mappability +chr18 55414800 55436200 Low Mappability +chr18 55899800 55901700 High Signal Region +chr18 55938500 55954100 High Signal Region +chr18 56273000 56276900 High Signal Region +chr18 56302600 56304500 High Signal Region +chr18 56341200 56346000 High Signal Region +chr18 56826900 56830200 Low Mappability +chr18 57560400 57562500 Low Mappability +chr18 58992700 58999300 Low Mappability +chr18 59496300 59511000 High Signal Region +chr18 59929900 59955000 High Signal Region +chr18 60042400 60044400 Low Mappability +chr18 60206100 60238100 High Signal Region +chr18 60525200 60533800 Low Mappability +chr18 62237400 62247700 High Signal Region +chr18 62273700 62292800 Low Mappability +chr18 62752700 62755100 High Signal Region +chr18 64131300 64132600 High Signal Region +chr18 64448400 64454900 Low Mappability +chr18 65103100 65105000 High Signal Region +chr18 65385700 65405100 Low Mappability +chr18 65492400 65494700 Low Mappability +chr18 65716300 65719400 Low Mappability +chr18 66543200 66548900 High Signal Region +chr18 66750000 66759900 Low Mappability +chr18 66881200 66887200 High Signal Region +chr18 68381300 68387800 High Signal Region +chr18 68412100 68425800 Low Mappability +chr18 68461300 68489000 High Signal Region +chr18 68691100 68693200 High Signal Region +chr18 69759300 69761300 Low Mappability +chr18 70489500 70515400 High Signal Region +chr18 70775600 70791900 High Signal Region +chr18 70842100 70849200 Low Mappability +chr18 71032500 71038800 High Signal Region +chr18 71139200 71145200 High Signal Region +chr18 71208200 71211300 Low Mappability +chr18 71267000 71273300 Low Mappability +chr18 71630400 71641100 Low Mappability +chr18 72753900 72794900 High Signal Region +chr18 72987900 72991000 High Signal Region +chr18 73259600 73264100 Low Mappability +chr18 74553100 74566400 High Signal Region +chr18 74745500 74758500 Low Mappability +chr18 74880300 74882000 High Signal Region +chr18 76177900 76184300 Low Mappability +chr18 76579700 76586300 Low Mappability +chr18 77264400 77271000 High Signal Region +chr18 78197300 78199300 High Signal Region +chr18 78407800 78428500 Low Mappability +chr18 78861400 78867900 High Signal Region +chr18 80021700 80028900 Low Mappability +chr18 80307500 80309600 Low Mappability +chr18 80455500 80518400 Low Mappability +chr18 81299700 81306200 Low Mappability +chr18 82052100 82058200 High Signal Region +chr18 82160100 82227800 High Signal Region +chr18 82319500 82339900 High Signal Region +chr18 82692900 82717900 Low Mappability +chr18 83171100 83178400 Low Mappability +chr18 83700500 83707900 Low Mappability +chr18 84828700 84833000 High Signal Region +chr18 85035000 85080600 High Signal Region +chr18 85105800 85112200 High Signal Region +chr18 85169900 85175900 High Signal Region +chr18 85377800 85382800 Low Mappability +chr18 85697000 85699200 High Signal Region +chr18 85783600 85789900 High Signal Region +chr18 86508300 86510200 High Signal Region +chr18 86560600 86586100 High Signal Region +chr18 86828500 86849500 High Signal Region +chr18 87006300 87009800 High Signal Region +chr18 87141500 87161200 High Signal Region +chr18 87568300 87574300 High Signal Region +chr18 88149300 88155400 High Signal Region +chr18 89030400 89036400 High Signal Region +chr18 89615900 89650500 Low Mappability +chr18 89983200 89989700 Low Mappability +chr18 90055500 90092500 High Signal Region +chr18 90113400 90125400 Low Mappability +chr18 90464100 90501300 High Signal Region +chr18 90601200 90702600 High Signal Region +chr19 0 3140800 High Signal Region +chr19 3161400 3248600 High Signal Region +chr19 4061100 4066400 Low Mappability +chr19 6581000 6594300 High Signal Region +chr19 7713600 7774800 High Signal Region +chr19 7810700 7843900 Low Mappability +chr19 8203200 8285500 Low Mappability +chr19 9250500 9357700 High Signal Region +chr19 9502000 9565000 Low Mappability +chr19 9745800 9803300 High Signal Region +chr19 9823500 9837700 High Signal Region +chr19 10507900 10510300 High Signal Region +chr19 10954500 10960300 Low Mappability +chr19 11199700 11239800 High Signal Region +chr19 12447200 12454600 Low Mappability +chr19 13203500 13216400 High Signal Region +chr19 13330600 13357100 High Signal Region +chr19 13685000 13693300 High Signal Region +chr19 13760500 13777200 High Signal Region +chr19 15256700 15263000 High Signal Region +chr19 15433400 15438100 High Signal Region +chr19 15711800 15719800 High Signal Region +chr19 15839200 15846600 High Signal Region +chr19 15956500 15958500 Low Mappability +chr19 16670500 16673100 High Signal Region +chr19 18358000 18364200 High Signal Region +chr19 18532700 18535600 High Signal Region +chr19 19132200 19161200 High Signal Region +chr19 19509000 19514900 High Signal Region +chr19 19870300 19876900 Low Mappability +chr19 20080700 20081800 High Signal Region +chr19 20140700 20144100 Low Mappability +chr19 20288200 20297900 Low Mappability +chr19 20455400 20462700 Low Mappability +chr19 20839700 20843900 Low Mappability +chr19 21218200 21243800 High Signal Region +chr19 21532400 21534400 Low Mappability +chr19 22644100 22651700 High Signal Region +chr19 22722400 22728400 Low Mappability +chr19 23356500 23358400 High Signal Region +chr19 23739200 23754000 High Signal Region +chr19 24040300 24042300 Low Mappability +chr19 24911900 24919200 High Signal Region +chr19 25741800 25770100 High Signal Region +chr19 25917500 25920000 High Signal Region +chr19 27751400 27758100 High Signal Region +chr19 28149600 28156600 High Signal Region +chr19 30907400 30908700 High Signal Region +chr19 30963600 30968000 Low Mappability +chr19 31722800 31735800 High Signal Region +chr19 32203200 32211600 Low Mappability +chr19 32441800 32449100 Low Mappability +chr19 32822000 32824000 Low Mappability +chr19 33439100 33446100 Low Mappability +chr19 33864200 33877900 High Signal Region +chr19 33949100 33958200 High Signal Region +chr19 34131200 34161200 Low Mappability +chr19 34581900 34613000 High Signal Region +chr19 35076400 35079800 High Signal Region +chr19 35650200 35673500 High Signal Region +chr19 36702500 36723400 High Signal Region +chr19 37298800 37301800 Low Mappability +chr19 37617300 37624600 Low Mappability +chr19 38490200 38495300 Low Mappability +chr19 39078100 39079500 High Signal Region +chr19 39106700 39156300 High Signal Region +chr19 39244700 39270400 High Signal Region +chr19 39331700 39424100 High Signal Region +chr19 39599900 39607200 Low Mappability +chr19 39658700 39695100 Low Mappability +chr19 40020400 40026800 Low Mappability +chr19 40094100 40153300 High Signal Region +chr19 40328500 40330000 Low Mappability +chr19 41142700 41150000 Low Mappability +chr19 41424200 41473100 Low Mappability +chr19 42346000 42350500 Low Mappability +chr19 42647600 42649700 Low Mappability +chr19 43118800 43124600 High Signal Region +chr19 43236000 43238000 Low Mappability +chr19 43321500 43323700 High Signal Region +chr19 44145700 44171700 Low Mappability +chr19 44218500 44225000 Low Mappability +chr19 44862100 44864300 High Signal Region +chr19 45004900 45096500 Low Mappability +chr19 45182300 45190200 High Signal Region +chr19 45649000 45661500 High Signal Region +chr19 45699400 45706300 Low Mappability +chr19 47590300 47602700 Low Mappability +chr19 48484600 48496700 High Signal Region +chr19 48743800 48746300 High Signal Region +chr19 50107900 50114400 Low Mappability +chr19 50309700 50311600 High Signal Region +chr19 50754100 50755900 Low Mappability +chr19 50828900 50835600 High Signal Region +chr19 51649700 51655800 High Signal Region +chr19 51949000 51955700 Low Mappability +chr19 52303100 52309700 Low Mappability +chr19 52927900 52932300 Low Mappability +chr19 52967800 52991100 Low Mappability +chr19 53522200 53527100 High Signal Region +chr19 53767900 53777800 High Signal Region +chr19 54235200 54236600 High Signal Region +chr19 54884700 54936800 High Signal Region +chr19 54994900 55001700 Low Mappability +chr19 55976700 55984000 Low Mappability +chr19 56248700 56259000 Low Mappability +chr19 56846600 56849100 High Signal Region +chr19 57514200 57520700 Low Mappability +chr19 57634000 57635600 Low Mappability +chr19 57827000 57832700 Low Mappability +chr19 58012500 58014600 Low Mappability +chr19 58112400 58114500 High Signal Region +chr19 58481300 58483200 High Signal Region +chr19 59221800 59240400 High Signal Region +chr19 59763100 59779900 High Signal Region +chr19 60082500 60089900 High Signal Region +chr19 60906900 60934000 High Signal Region +chr19 61162600 61174300 Low Mappability +chr19 61197700 61268100 High Signal Region +chr19 61330300 61431500 High Signal Region +chr1 8628600 8719100 High Signal Region +chr1 12038300 12041400 High Signal Region +chr1 14958600 14992600 High Signal Region +chr1 17466800 17479900 High Signal Region +chr1 18872500 18901300 High Signal Region +chr1 19175300 19177200 High Signal Region +chr1 22555000 22556900 High Signal Region +chr1 24610600 24617100 High Signal Region +chr1 24683100 24685100 High Signal Region +chr1 26685100 26689200 High Signal Region +chr1 43776800 43779800 High Signal Region +chr1 44198000 44202200 High Signal Region +chr1 46701700 46756600 High Signal Region +chr1 48880600 48882500 High Signal Region +chr1 56119600 56143500 High Signal Region +chr1 56772200 56783300 High Signal Region +chr1 58613000 58614900 High Signal Region +chr1 63629100 63631600 High Signal Region +chr1 69455800 69457800 High Signal Region +chr1 71078400 71085500 High Signal Region +chr1 71250600 71256700 High Signal Region +chr1 73549100 73555300 High Signal Region +chr1 73832600 73902400 High Signal Region +chr1 78572900 78575400 High Signal Region +chr1 84953500 85663200 High Signal Region +chr1 88209400 88311700 High Signal Region +chr1 94093800 94109400 High Signal Region +chr1 95451000 95452900 High Signal Region +chr1 95783900 95789700 High Signal Region +chr1 95810200 95851700 High Signal Region +chr1 100737900 100760500 High Signal Region +chr1 101040100 101046300 High Signal Region +chr1 102627300 102644300 High Signal Region +chr1 105226800 105230700 High Signal Region +chr1 110170400 110188300 High Signal Region +chr1 113602700 113604800 High Signal Region +chr1 114557300 114579100 High Signal Region +chr1 114643300 114660500 High Signal Region +chr1 115447500 115482800 High Signal Region +chr1 122356200 122358200 High Signal Region +chr1 133593600 133611300 High Signal Region +chr1 142651800 142672300 High Signal Region +chr1 145444500 145449100 High Signal Region +chr1 146120600 146128200 High Signal Region +chr1 151181600 151212000 High Signal Region +chr1 165862800 165864700 Low Mappability +chr1 171033000 171112400 High Signal Region +chr1 172716800 172738200 High Signal Region +chr1 172878700 172885100 High Signal Region +chr1 178538700 178540700 High Signal Region +chr1 181742100 181752400 High Signal Region +chr1 182628900 182630800 High Signal Region +chr1 183298200 183300500 High Signal Region +chr1 190299400 190304600 High Signal Region +chr1 192453100 192471800 High Signal Region +chr1 193226900 193228800 High Signal Region +chr1 195239800 195257400 High Signal Region +chr1 195278100 195280200 High Signal Region +chr1 195320700 195471900 High Signal Region +chr2 0 3086300 High Signal Region +chr2 3474900 3488800 High Signal Region +chr2 3932700 3939100 Low Mappability +chr2 3963500 3986100 High Signal Region +chr2 4515100 4518600 High Signal Region +chr2 4600600 4620300 High Signal Region +chr2 5378100 5394600 High Signal Region +chr2 5545900 5561600 High Signal Region +chr2 6078200 6095300 High Signal Region +chr2 6773100 6777500 Low Mappability +chr2 6832200 6846700 High Signal Region +chr2 7137500 7139600 High Signal Region +chr2 7404000 7458100 High Signal Region +chr2 7571700 7609800 High Signal Region +chr2 7656300 7669700 Low Mappability +chr2 7752800 7758500 High Signal Region +chr2 8034600 8042900 High Signal Region +chr2 8266200 8275600 High Signal Region +chr2 8528400 8535700 High Signal Region +chr2 8938000 8940500 High Signal Region +chr2 9212600 9219300 High Signal Region +chr2 10177100 10183400 Low Mappability +chr2 10483200 10501500 Low Mappability +chr2 10677000 10697600 Low Mappability +chr2 12605500 12668600 High Signal Region +chr2 13824000 13869200 High Signal Region +chr2 13946300 13948900 High Signal Region +chr2 14014100 14035300 High Signal Region +chr2 14359100 14386600 High Signal Region +chr2 14919000 14924500 High Signal Region +chr2 15301300 15334700 High Signal Region +chr2 15430100 15435500 Low Mappability +chr2 15575900 15602800 High Signal Region +chr2 15716700 15721100 High Signal Region +chr2 15768300 15770500 High Signal Region +chr2 16192400 16198500 High Signal Region +chr2 16320200 16326500 Low Mappability +chr2 16762800 16787000 High Signal Region +chr2 17383200 17385100 High Signal Region +chr2 17612500 17654500 Low Mappability +chr2 17747200 17753000 High Signal Region +chr2 19209900 19212900 High Signal Region +chr2 19498400 19510300 High Signal Region +chr2 19707900 19712200 High Signal Region +chr2 20038500 20067400 Low Mappability +chr2 20426800 20433300 Low Mappability +chr2 20898900 20901100 High Signal Region +chr2 21062600 21082200 Low Mappability +chr2 22049700 22087700 High Signal Region +chr2 22137300 22165500 High Signal Region +chr2 22389900 22608700 High Signal Region +chr2 22737300 22745800 High Signal Region +chr2 23009600 23015000 Low Mappability +chr2 23274600 23304900 High Signal Region +chr2 23693700 23707900 High Signal Region +chr2 24193300 24199000 High Signal Region +chr2 26333100 26351900 Low Mappability +chr2 26759100 26763600 High Signal Region +chr2 26998200 27004400 Low Mappability +chr2 28183200 28205000 High Signal Region +chr2 30204600 30239600 Low Mappability +chr2 32381300 32488200 Low Mappability +chr2 33933000 33935300 High Signal Region +chr2 34049900 34051800 High Signal Region +chr2 34903900 34935900 Low Mappability +chr2 35090800 35109900 High Signal Region +chr2 35505000 35526700 Low Mappability +chr2 36008600 36019300 Low Mappability +chr2 36401900 36413100 High Signal Region +chr2 36508600 36515200 High Signal Region +chr2 36542800 36549100 High Signal Region +chr2 36761000 36766500 High Signal Region +chr2 36951900 36970700 High Signal Region +chr2 37156900 37185900 High Signal Region +chr2 37339700 37359400 Low Mappability +chr2 38564700 38566600 Low Mappability +chr2 39225400 39293200 High Signal Region +chr2 39360600 39367900 Low Mappability +chr2 39517800 39534800 High Signal Region +chr2 39778500 39785700 Low Mappability +chr2 39887500 39915800 High Signal Region +chr2 40131200 40240800 High Signal Region +chr2 40262500 40268600 High Signal Region +chr2 40766400 40794000 High Signal Region +chr2 41059500 41070200 Low Mappability +chr2 41168700 41171400 High Signal Region +chr2 41692800 41694800 High Signal Region +chr2 41744300 41751600 Low Mappability +chr2 41775100 41781500 High Signal Region +chr2 41895300 41897200 High Signal Region +chr2 42044500 42051600 High Signal Region +chr2 42200300 42240700 High Signal Region +chr2 42950100 42956600 High Signal Region +chr2 43347900 43356400 High Signal Region +chr2 44936600 44942400 High Signal Region +chr2 46224800 46226700 High Signal Region +chr2 46343100 46348100 Low Mappability +chr2 46574200 46579600 Low Mappability +chr2 47008600 47023500 High Signal Region +chr2 47196300 47199300 High Signal Region +chr2 47533600 47642600 High Signal Region +chr2 47942200 47943800 High Signal Region +chr2 48483000 48491000 Low Mappability +chr2 50543200 50545500 High Signal Region +chr2 50679600 50686800 Low Mappability +chr2 51552600 51555600 High Signal Region +chr2 51750900 51756000 High Signal Region +chr2 51881600 51890600 Low Mappability +chr2 51945900 51948400 High Signal Region +chr2 52695900 52718600 High Signal Region +chr2 52786800 52796300 High Signal Region +chr2 53317700 53321600 Low Mappability +chr2 53347800 53367000 High Signal Region +chr2 53633400 53642900 High Signal Region +chr2 53745700 53799800 High Signal Region +chr2 54252600 54258500 High Signal Region +chr2 54698000 54747900 High Signal Region +chr2 54862600 54895300 High Signal Region +chr2 55197500 55216400 High Signal Region +chr2 55308300 55353700 High Signal Region +chr2 55823800 55829000 High Signal Region +chr2 55860200 55874300 Low Mappability +chr2 55942000 55947800 High Signal Region +chr2 56192800 56194600 High Signal Region +chr2 56298700 56304900 High Signal Region +chr2 56465200 56471900 High Signal Region +chr2 56834300 56879100 High Signal Region +chr2 56988500 56990600 Low Mappability +chr2 57166400 57172900 Low Mappability +chr2 57214400 57223500 Low Mappability +chr2 57417400 57446500 High Signal Region +chr2 57628500 57633800 High Signal Region +chr2 57726600 57728500 High Signal Region +chr2 58212900 58263100 High Signal Region +chr2 58648300 58691900 High Signal Region +chr2 58881200 58902500 High Signal Region +chr2 59971300 59972800 Low Mappability +chr2 61038200 61042700 High Signal Region +chr2 61959600 61965300 High Signal Region +chr2 62022900 62040100 High Signal Region +chr2 62861100 62867200 High Signal Region +chr2 63297300 63302700 Low Mappability +chr2 63368100 63403900 High Signal Region +chr2 63462300 63483800 High Signal Region +chr2 63641200 63654600 High Signal Region +chr2 63718200 63725400 High Signal Region +chr2 63838100 63845300 Low Mappability +chr2 64309200 64319600 High Signal Region +chr2 64608400 64633400 Low Mappability +chr2 64698700 64703300 High Signal Region +chr2 65592500 65602200 High Signal Region +chr2 65737700 65781500 Low Mappability +chr2 66721600 66750400 High Signal Region +chr2 66845100 66852300 High Signal Region +chr2 67408400 67414500 High Signal Region +chr2 67939700 67946000 High Signal Region +chr2 68770400 68776700 High Signal Region +chr2 68917800 68924100 Low Mappability +chr2 69353900 69356600 High Signal Region +chr2 70263100 70270000 Low Mappability +chr2 70880100 70892900 High Signal Region +chr2 71054700 71071300 Low Mappability +chr2 71942000 71949500 Low Mappability +chr2 72270200 72275700 Low Mappability +chr2 73867000 73868900 High Signal Region +chr2 74364300 74402600 Low Mappability +chr2 74437600 74444900 Low Mappability +chr2 75499500 75504600 High Signal Region +chr2 77224000 77230500 Low Mappability +chr2 78318000 78339500 High Signal Region +chr2 79437700 79441900 High Signal Region +chr2 79936500 79943700 High Signal Region +chr2 80119000 80121500 High Signal Region +chr2 80220600 80257700 Low Mappability +chr2 80795600 80838700 High Signal Region +chr2 80879000 80880200 High Signal Region +chr2 80956500 81006000 High Signal Region +chr2 81069000 81075100 High Signal Region +chr2 81639400 81644800 High Signal Region +chr2 81750800 81756800 High Signal Region +chr2 81790000 81795900 High Signal Region +chr2 82329800 82340100 High Signal Region +chr2 82673800 82679900 High Signal Region +chr2 82714300 82728500 High Signal Region +chr2 82783900 82789500 High Signal Region +chr2 82868800 82887900 High Signal Region +chr2 82916300 82936800 High Signal Region +chr2 83120100 83146100 High Signal Region +chr2 83185100 83193200 High Signal Region +chr2 83325900 83328200 High Signal Region +chr2 83413500 83587500 High Signal Region +chr2 83865600 83893100 High Signal Region +chr2 83931600 83995800 Low Mappability +chr2 84080900 84085600 High Signal Region +chr2 84505000 84510500 Low Mappability +chr2 84532500 84534600 Low Mappability +chr2 84564800 84576000 Low Mappability +chr2 85685600 85701800 Low Mappability +chr2 85874000 85896300 High Signal Region +chr2 86018200 86021700 Low Mappability +chr2 86303400 86317700 High Signal Region +chr2 86339600 86346900 Low Mappability +chr2 86612700 86617500 High Signal Region +chr2 87381000 87382800 High Signal Region +chr2 87875700 87941300 High Signal Region +chr2 88167400 88212600 High Signal Region +chr2 88776200 88780800 High Signal Region +chr2 89206600 89277100 Low Mappability +chr2 89345700 89350400 High Signal Region +chr2 89761200 89775100 High Signal Region +chr2 89856400 89920100 High Signal Region +chr2 90127200 90132700 High Signal Region +chr2 90157100 90249100 High Signal Region +chr2 90273200 90279100 High Signal Region +chr2 90309300 90396100 High Signal Region +chr2 92092600 92094700 High Signal Region +chr2 92167200 92169100 High Signal Region +chr2 93824700 93850200 High Signal Region +chr2 94602800 94607800 Low Mappability +chr2 94633900 94656500 High Signal Region +chr2 94801000 94809400 Low Mappability +chr2 94852800 94891200 High Signal Region +chr2 95064700 95093500 Low Mappability +chr2 95148000 95167800 High Signal Region +chr2 95215900 95320600 High Signal Region +chr2 95414700 95420600 High Signal Region +chr2 95536400 95538400 Low Mappability +chr2 95647900 95654300 High Signal Region +chr2 95794500 95799200 High Signal Region +chr2 95929300 95934400 High Signal Region +chr2 96191400 96208900 High Signal Region +chr2 96547800 96566800 Low Mappability +chr2 96954700 96977300 High Signal Region +chr2 97021000 97034600 High Signal Region +chr2 97308000 97327600 High Signal Region +chr2 97671600 97686300 High Signal Region +chr2 97760700 97765800 High Signal Region +chr2 97872400 97958200 High Signal Region +chr2 98361700 98449600 High Signal Region +chr2 98659400 98668200 High Signal Region +chr2 98796500 98801900 High Signal Region +chr2 99020000 99057500 High Signal Region +chr2 99300200 99320300 High Signal Region +chr2 99944600 99970200 High Signal Region +chr2 100112000 100114300 High Signal Region +chr2 100223900 100238300 High Signal Region +chr2 100418400 100777900 Low Mappability +chr2 101127200 101153600 Low Mappability +chr2 101313100 101350600 High Signal Region +chr2 102828400 102830400 High Signal Region +chr2 103231300 103232300 High Signal Region +chr2 103852300 103872800 High Signal Region +chr2 104684900 104697300 High Signal Region +chr2 105249300 105259000 High Signal Region +chr2 105539300 105563200 Low Mappability +chr2 105825900 105865100 High Signal Region +chr2 106555100 106569300 High Signal Region +chr2 107134100 107140900 High Signal Region +chr2 107593900 107601200 Low Mappability +chr2 107710100 107712400 High Signal Region +chr2 108608600 108614000 High Signal Region +chr2 108945100 108972800 High Signal Region +chr2 109629400 109636000 High Signal Region +chr2 110016800 110025500 High Signal Region +chr2 110091100 110128700 High Signal Region +chr2 110157100 110163300 High Signal Region +chr2 110292700 110294600 High Signal Region +chr2 110545800 110583400 High Signal Region +chr2 110752400 110780100 High Signal Region +chr2 111007400 111018600 High Signal Region +chr2 111042000 111046600 High Signal Region +chr2 111172700 111179800 High Signal Region +chr2 111281500 111287900 Low Mappability +chr2 111545600 111553300 Low Mappability +chr2 111716900 111722900 High Signal Region +chr2 111844900 111866400 High Signal Region +chr2 111890900 111898900 High Signal Region +chr2 112053900 112086000 High Signal Region +chr2 112319700 112326200 Low Mappability +chr2 112522900 112570500 High Signal Region +chr2 112602800 112605100 High Signal Region +chr2 112701400 112707900 High Signal Region +chr2 113095800 113102400 Low Mappability +chr2 113330900 113333000 Low Mappability +chr2 113518400 113524900 Low Mappability +chr2 113564300 113565700 High Signal Region +chr2 113659300 113673200 High Signal Region +chr2 114180800 114187400 Low Mappability +chr2 114242400 114244000 High Signal Region +chr2 114469200 114504000 High Signal Region +chr2 116454300 116524000 High Signal Region +chr2 117829600 117835500 High Signal Region +chr2 118017700 118020200 High Signal Region +chr2 120608600 120650200 High Signal Region +chr2 120810300 120821000 High Signal Region +chr2 121435600 121523600 High Signal Region +chr2 121938800 121957600 High Signal Region +chr2 122680400 122683200 High Signal Region +chr2 123288000 123294300 Low Mappability +chr2 123496800 123525300 High Signal Region +chr2 123785200 123790700 High Signal Region +chr2 124002700 124004600 High Signal Region +chr2 124798800 124835800 High Signal Region +chr2 125625000 125635900 Low Mappability +chr2 126217400 126263800 High Signal Region +chr2 126445400 126447400 Low Mappability +chr2 126964900 126972100 Low Mappability +chr2 127720400 127734000 Low Mappability +chr2 128050800 128053200 High Signal Region +chr2 128480400 128486900 Low Mappability +chr2 128772500 128774500 Low Mappability +chr2 129499400 129523400 High Signal Region +chr2 129602700 129613700 Low Mappability +chr2 131791800 131793800 High Signal Region +chr2 131908300 131931100 Low Mappability +chr2 131963900 131983700 High Signal Region +chr2 132885700 132890400 High Signal Region +chr2 132952400 132954500 Low Mappability +chr2 133053200 133083400 High Signal Region +chr2 133239300 133261800 High Signal Region +chr2 133934000 133937500 High Signal Region +chr2 134560100 134577900 High Signal Region +chr2 134661800 134673000 High Signal Region +chr2 134746600 134751100 High Signal Region +chr2 135146800 135151900 High Signal Region +chr2 135987600 135989700 High Signal Region +chr2 136234300 136286800 Low Mappability +chr2 137028200 137037000 High Signal Region +chr2 137345900 137369900 High Signal Region +chr2 137394500 137405600 High Signal Region +chr2 137640000 137642300 High Signal Region +chr2 137890200 137895000 High Signal Region +chr2 138035000 138056400 Low Mappability +chr2 138573700 138580400 High Signal Region +chr2 138621500 138624200 High Signal Region +chr2 138833600 138853100 High Signal Region +chr2 138904300 138935000 High Signal Region +chr2 139433200 139476200 High Signal Region +chr2 140345800 140352400 Low Mappability +chr2 142197000 142204400 Low Mappability +chr2 142464200 142483300 Low Mappability +chr2 142789100 142795600 Low Mappability +chr2 143275500 143290300 High Signal Region +chr2 143725900 143764700 High Signal Region +chr2 144627800 144636700 Low Mappability +chr2 144975200 144977100 High Signal Region +chr2 145001300 145003200 High Signal Region +chr2 145118300 145146300 Low Mappability +chr2 145236800 145242600 Low Mappability +chr2 145625100 145630800 Low Mappability +chr2 145732700 145734600 High Signal Region +chr2 146135700 146176900 High Signal Region +chr2 146995700 147013200 Low Mappability +chr2 147675300 147677500 High Signal Region +chr2 147864800 147871300 High Signal Region +chr2 147918800 147925100 Low Mappability +chr2 148410500 148416000 Low Mappability +chr2 148459900 148473800 High Signal Region +chr2 148612700 148620200 Low Mappability +chr2 148939300 148984200 High Signal Region +chr2 149049800 149056000 High Signal Region +chr2 149269400 149292700 High Signal Region +chr2 150413500 150452500 High Signal Region +chr2 150728300 150749700 Low Mappability +chr2 151029700 151385300 High Signal Region +chr2 151408800 151496700 High Signal Region +chr2 152157000 152159000 Low Mappability +chr2 152206800 152227500 High Signal Region +chr2 152263400 152269900 Low Mappability +chr2 153674800 153693100 Low Mappability +chr2 154174200 154180000 High Signal Region +chr2 154353800 154359700 Low Mappability +chr2 155016300 155051500 High Signal Region +chr2 155235400 155258100 High Signal Region +chr2 156185100 156214400 Low Mappability +chr2 157566000 157655300 Low Mappability +chr2 157833200 157835600 High Signal Region +chr2 158286300 158292800 High Signal Region +chr2 159455200 159469500 High Signal Region +chr2 160620300 160638500 High Signal Region +chr2 161368800 161376200 High Signal Region +chr2 161984900 161990900 High Signal Region +chr2 162369100 162376700 High Signal Region +chr2 162594500 162602700 High Signal Region +chr2 162843800 162847600 High Signal Region +chr2 163519100 163533100 Low Mappability +chr2 163644500 163655100 High Signal Region +chr2 163788900 163796100 Low Mappability +chr2 163833800 163849200 Low Mappability +chr2 163958100 163963000 Low Mappability +chr2 164201000 164202700 High Signal Region +chr2 165477300 165529900 Low Mappability +chr2 165675100 165679500 Low Mappability +chr2 165848700 165953000 Low Mappability +chr2 166530600 166535100 Low Mappability +chr2 166780500 166832200 Low Mappability +chr2 167269400 167291100 High Signal Region +chr2 167407900 167423000 Low Mappability +chr2 170315100 170320000 High Signal Region +chr2 170503800 170509800 High Signal Region +chr2 171814300 171816700 High Signal Region +chr2 171912800 171932200 Low Mappability +chr2 172007100 172014300 High Signal Region +chr2 172743600 172751100 Low Mappability +chr2 173098700 173101000 Low Mappability +chr2 173706700 173708800 High Signal Region +chr2 174961800 176745500 High Signal Region +chr2 176767100 177166600 High Signal Region +chr2 177232400 177490200 High Signal Region +chr2 177526700 177841000 High Signal Region +chr2 178775000 178794400 High Signal Region +chr2 180025600 180093500 Low Mappability +chr2 181169900 181188000 Low Mappability +chr2 181285900 181298800 High Signal Region +chr2 181739800 181745800 High Signal Region +chr2 181885000 181933400 High Signal Region +chr2 182003800 182113200 High Signal Region +chr3 0 3052500 High Signal Region +chr3 3084100 3098300 High Signal Region +chr3 3123200 3150800 High Signal Region +chr3 3443300 3493700 High Signal Region +chr3 4698100 4725500 High Signal Region +chr3 5517700 5525000 Low Mappability +chr3 5859400 5863500 High Signal Region +chr3 6115100 6117100 High Signal Region +chr3 6601900 6627400 High Signal Region +chr3 6900700 6916400 High Signal Region +chr3 6941100 6946600 High Signal Region +chr3 7178300 7223900 High Signal Region +chr3 7477600 7482500 High Signal Region +chr3 7910300 7916600 High Signal Region +chr3 8225200 8247500 High Signal Region +chr3 8574000 8589900 High Signal Region +chr3 8815300 8838700 High Signal Region +chr3 9091900 9096900 Low Mappability +chr3 9777500 9778500 High Signal Region +chr3 9904100 9910700 High Signal Region +chr3 9952100 9967100 High Signal Region +chr3 10453800 10464500 High Signal Region +chr3 10961700 10971700 High Signal Region +chr3 11050200 11070500 High Signal Region +chr3 11120700 11143300 High Signal Region +chr3 11518700 11524700 High Signal Region +chr3 11779200 11806000 High Signal Region +chr3 11933500 11938400 High Signal Region +chr3 11961500 11973100 High Signal Region +chr3 12107500 12131400 High Signal Region +chr3 12221200 12262000 High Signal Region +chr3 12336000 12339700 High Signal Region +chr3 12814500 12857800 Low Mappability +chr3 12906200 12907300 High Signal Region +chr3 13219400 13222800 High Signal Region +chr3 13821100 13826600 Low Mappability +chr3 13965800 13972000 High Signal Region +chr3 14272100 14336300 High Signal Region +chr3 14449600 14478500 High Signal Region +chr3 14593200 14597400 High Signal Region +chr3 14668900 14744700 High Signal Region +chr3 15028800 15045100 High Signal Region +chr3 15079500 15087400 High Signal Region +chr3 15451600 15872400 High Signal Region +chr3 15964200 15967200 High Signal Region +chr3 16351400 16357100 High Signal Region +chr3 16626000 16633700 High Signal Region +chr3 16995700 17021400 High Signal Region +chr3 17419700 17447600 High Signal Region +chr3 17679600 17682100 High Signal Region +chr3 17954200 17997400 High Signal Region +chr3 18379800 18395100 High Signal Region +chr3 18432100 18437500 High Signal Region +chr3 18966900 18983600 High Signal Region +chr3 19357600 19359300 High Signal Region +chr3 19594900 19601100 High Signal Region +chr3 19917700 19940300 High Signal Region +chr3 21247500 21250200 High Signal Region +chr3 21317800 21324600 High Signal Region +chr3 21383700 21389000 High Signal Region +chr3 21512900 21519300 High Signal Region +chr3 21661800 21663700 Low Mappability +chr3 21685300 21709500 High Signal Region +chr3 22069200 22070500 High Signal Region +chr3 22240800 22250100 High Signal Region +chr3 22362000 22377000 High Signal Region +chr3 22517600 22521100 High Signal Region +chr3 22612100 22759200 High Signal Region +chr3 22933800 23015000 High Signal Region +chr3 23077300 23099800 High Signal Region +chr3 23173700 23180900 Low Mappability +chr3 23302200 23321100 High Signal Region +chr3 23353500 23360000 High Signal Region +chr3 23463300 23468200 High Signal Region +chr3 23579500 23584900 High Signal Region +chr3 23841700 23843800 Low Mappability +chr3 24624400 24627900 High Signal Region +chr3 24655200 24661300 High Signal Region +chr3 25210800 25228800 Low Mappability +chr3 25277500 25310400 High Signal Region +chr3 25416900 25421600 Low Mappability +chr3 25472900 25478900 High Signal Region +chr3 26089400 26113400 High Signal Region +chr3 26346800 26369700 High Signal Region +chr3 26724600 26737000 High Signal Region +chr3 26944500 26950800 High Signal Region +chr3 27010100 27023300 High Signal Region +chr3 27309300 27319800 Low Mappability +chr3 28198300 28201300 Low Mappability +chr3 28513900 28535500 High Signal Region +chr3 28983500 29014200 High Signal Region +chr3 29461500 29492300 High Signal Region +chr3 29675900 29680600 High Signal Region +chr3 31176300 31188900 Low Mappability +chr3 31340700 31364500 Low Mappability +chr3 31651800 31680100 High Signal Region +chr3 31819800 31826900 High Signal Region +chr3 33696500 33708400 High Signal Region +chr3 33768300 33798500 High Signal Region +chr3 33930000 33948800 Low Mappability +chr3 34516200 34518200 High Signal Region +chr3 35285400 35292700 High Signal Region +chr3 35707000 35713500 Low Mappability +chr3 35743300 35744600 High Signal Region +chr3 36106500 36109400 High Signal Region +chr3 36285400 36291100 High Signal Region +chr3 36847300 36853900 High Signal Region +chr3 39026800 39030900 High Signal Region +chr3 39183300 39189800 High Signal Region +chr3 40151300 40157700 High Signal Region +chr3 40347600 40352600 High Signal Region +chr3 40549300 40651700 High Signal Region +chr3 41871900 41887800 High Signal Region +chr3 41993500 41999500 High Signal Region +chr3 42170000 42187300 High Signal Region +chr3 42682100 42722800 High Signal Region +chr3 42820200 42827400 High Signal Region +chr3 43108100 43197200 High Signal Region +chr3 43466400 43492100 High Signal Region +chr3 43538900 43557700 High Signal Region +chr3 44185900 44191600 High Signal Region +chr3 44241200 44260000 High Signal Region +chr3 44401500 44407500 High Signal Region +chr3 44559600 44565200 High Signal Region +chr3 44884400 44890700 High Signal Region +chr3 45579200 45591900 High Signal Region +chr3 45848500 45863400 Low Mappability +chr3 45986000 45990700 High Signal Region +chr3 46141000 46148200 High Signal Region +chr3 46338200 46340300 Low Mappability +chr3 46735000 46741900 High Signal Region +chr3 46795400 46805400 High Signal Region +chr3 46910900 46936200 High Signal Region +chr3 47592800 47598000 High Signal Region +chr3 47798300 47799600 High Signal Region +chr3 47966600 47968700 High Signal Region +chr3 48437800 48462000 High Signal Region +chr3 49443600 49482800 High Signal Region +chr3 49727200 49734400 High Signal Region +chr3 50464900 50474400 High Signal Region +chr3 50763700 50814900 High Signal Region +chr3 50957300 50963000 High Signal Region +chr3 51233600 51245400 Low Mappability +chr3 51616000 51623700 Low Mappability +chr3 51765300 51784900 High Signal Region +chr3 52230000 52233400 High Signal Region +chr3 53426900 53431000 High Signal Region +chr3 54849100 54874300 Low Mappability +chr3 56069700 56075200 High Signal Region +chr3 56210900 56215900 High Signal Region +chr3 56513600 56576700 High Signal Region +chr3 56903800 56943000 High Signal Region +chr3 57059400 57070200 High Signal Region +chr3 57349800 57379400 High Signal Region +chr3 58051100 58081600 Low Mappability +chr3 59370700 59412200 High Signal Region +chr3 59565300 59632700 High Signal Region +chr3 59684600 59689200 High Signal Region +chr3 59791800 59804200 Low Mappability +chr3 59887400 59889300 High Signal Region +chr3 59919200 59921100 High Signal Region +chr3 60044300 60046800 High Signal Region +chr3 60489700 60495200 Low Mappability +chr3 61150800 61177900 High Signal Region +chr3 61260700 61275000 Low Mappability +chr3 61495400 61499700 High Signal Region +chr3 61672300 61678300 High Signal Region +chr3 61707600 61726600 Low Mappability +chr3 61853900 61858900 High Signal Region +chr3 62032400 62038600 High Signal Region +chr3 62108300 62160100 High Signal Region +chr3 62356900 62367700 High Signal Region +chr3 62543000 62549200 High Signal Region +chr3 62873000 62879300 High Signal Region +chr3 63515500 63530100 High Signal Region +chr3 63590100 63591500 High Signal Region +chr3 64171000 64172900 High Signal Region +chr3 64237900 64245700 High Signal Region +chr3 64453100 64512800 High Signal Region +chr3 64609600 64665300 Low Mappability +chr3 64697900 64730500 High Signal Region +chr3 67027900 67054100 High Signal Region +chr3 67262400 67264000 High Signal Region +chr3 67411100 67419400 High Signal Region +chr3 67747300 67752800 High Signal Region +chr3 67786800 67793600 High Signal Region +chr3 68114300 68119700 Low Mappability +chr3 68519400 68525100 High Signal Region +chr3 69228600 69230500 High Signal Region +chr3 69848400 69854900 High Signal Region +chr3 69944400 69949800 High Signal Region +chr3 71117300 71122800 High Signal Region +chr3 71369600 71447800 High Signal Region +chr3 72273600 72293700 High Signal Region +chr3 72698100 72704800 High Signal Region +chr3 73088300 73098500 High Signal Region +chr3 73733100 73738500 Low Mappability +chr3 74583300 74598400 Low Mappability +chr3 74865000 74881800 High Signal Region +chr3 75348300 75378700 Low Mappability +chr3 75409000 75424100 High Signal Region +chr3 76598800 76604700 High Signal Region +chr3 76886600 76892900 Low Mappability +chr3 77597400 77604300 Low Mappability +chr3 77667400 77711400 High Signal Region +chr3 77926800 77931400 High Signal Region +chr3 78281900 78283900 Low Mappability +chr3 79012700 79014900 High Signal Region +chr3 79046300 79052800 Low Mappability +chr3 79763800 79780000 High Signal Region +chr3 79959500 79965700 High Signal Region +chr3 80465400 80472000 High Signal Region +chr3 82283300 82288700 Low Mappability +chr3 82462100 82508600 Low Mappability +chr3 82589000 82616700 Low Mappability +chr3 82921400 82924800 High Signal Region +chr3 83123200 83125100 High Signal Region +chr3 83330900 83343400 High Signal Region +chr3 83845100 83867000 High Signal Region +chr3 84142200 84149700 Low Mappability +chr3 84359000 84366300 Low Mappability +chr3 85305200 85326800 Low Mappability +chr3 85622200 85629500 Low Mappability +chr3 87424200 87426100 High Signal Region +chr3 87469300 87474600 High Signal Region +chr3 88044000 88066500 High Signal Region +chr3 88666500 88673500 Low Mappability +chr3 88716700 88873000 Low Mappability +chr3 90761500 90810400 High Signal Region +chr3 90991100 90996800 Low Mappability +chr3 91856700 91898200 High Signal Region +chr3 92185400 92291300 High Signal Region +chr3 93059200 93107000 High Signal Region +chr3 93168500 93172800 High Signal Region +chr3 93203900 93229100 High Signal Region +chr3 93323700 93331700 Low Mappability +chr3 93860300 94093700 High Signal Region +chr3 94136200 94152300 High Signal Region +chr3 94658300 94665700 Low Mappability +chr3 94690000 94730800 High Signal Region +chr3 94757600 94765200 Low Mappability +chr3 96043600 96058900 High Signal Region +chr3 96196200 96288300 High Signal Region +chr3 96313200 96388900 Low Mappability +chr3 96446800 96463800 Low Mappability +chr3 96485600 96514300 High Signal Region +chr3 96840000 96863800 High Signal Region +chr3 97245200 97251500 High Signal Region +chr3 98396100 98411400 High Signal Region +chr3 98443100 98597600 Low Mappability +chr3 98709300 98778900 High Signal Region +chr3 98986000 99034100 High Signal Region +chr3 99406000 99434100 High Signal Region +chr3 99882900 99908100 High Signal Region +chr3 99980200 99982200 High Signal Region +chr3 100315500 100330900 High Signal Region +chr3 100484400 100486300 High Signal Region +chr3 102813400 102839300 High Signal Region +chr3 102983600 102989900 High Signal Region +chr3 103134600 103136000 High Signal Region +chr3 103427600 103447900 High Signal Region +chr3 103555000 103557000 Low Mappability +chr3 104116800 104123100 High Signal Region +chr3 104194200 104198800 High Signal Region +chr3 104588100 104595500 Low Mappability +chr3 105028200 105030500 High Signal Region +chr3 106118500 106311800 High Signal Region +chr3 106777900 106779700 High Signal Region +chr3 109258500 109277300 High Signal Region +chr3 109458000 109462700 High Signal Region +chr3 110319800 110325700 High Signal Region +chr3 110416300 110421800 High Signal Region +chr3 111256100 111268600 High Signal Region +chr3 111578400 111605200 Low Mappability +chr3 111794100 111799000 Low Mappability +chr3 111830400 111836300 High Signal Region +chr3 112274500 112287300 High Signal Region +chr3 112315500 112337400 High Signal Region +chr3 112561900 112586900 High Signal Region +chr3 112863500 112869300 High Signal Region +chr3 112913800 112918000 High Signal Region +chr3 113186300 113189100 High Signal Region +chr3 113250900 113527800 High Signal Region +chr3 113709900 113719000 High Signal Region +chr3 113742300 113748300 High Signal Region +chr3 114272600 114279400 High Signal Region +chr3 114472100 114499300 Low Mappability +chr3 114587900 114595900 High Signal Region +chr3 114976700 114982800 High Signal Region +chr3 115020700 115027100 Low Mappability +chr3 115367700 115372200 Low Mappability +chr3 115905900 115922900 High Signal Region +chr3 116817400 116843900 Low Mappability +chr3 117267200 117292400 High Signal Region +chr3 117379100 117386400 Low Mappability +chr3 118055100 118060000 High Signal Region +chr3 119211800 119212900 High Signal Region +chr3 120735000 120742200 High Signal Region +chr3 120825200 120851500 High Signal Region +chr3 121248900 121250900 High Signal Region +chr3 121694400 121696100 High Signal Region +chr3 122294000 122329300 High Signal Region +chr3 122654100 122657300 High Signal Region +chr3 122804300 122806600 High Signal Region +chr3 123471600 123476200 Low Mappability +chr3 123729200 123743200 High Signal Region +chr3 123924800 123957700 High Signal Region +chr3 124282300 124288300 High Signal Region +chr3 125902800 125908900 High Signal Region +chr3 126127300 126136000 Low Mappability +chr3 126905300 126910600 High Signal Region +chr3 127522400 127523700 Low Mappability +chr3 127771600 127780600 High Signal Region +chr3 128203600 128211000 High Signal Region +chr3 128440100 128446100 High Signal Region +chr3 128935800 128937700 High Signal Region +chr3 129020900 129032100 High Signal Region +chr3 129393000 129394900 High Signal Region +chr3 133123600 133130800 Low Mappability +chr3 133566400 133568700 High Signal Region +chr3 133636000 133642800 High Signal Region +chr3 133837100 133859400 High Signal Region +chr3 134007400 134026700 Low Mappability +chr3 134685700 134690700 High Signal Region +chr3 134862500 134888400 High Signal Region +chr3 135148300 135163000 High Signal Region +chr3 136173700 136181000 Low Mappability +chr3 137407500 137413500 High Signal Region +chr3 137469200 137470300 High Signal Region +chr3 138200900 138207900 High Signal Region +chr3 139365700 139417700 High Signal Region +chr3 140376900 140384200 Low Mappability +chr3 142190700 142192800 High Signal Region +chr3 142513000 142517200 High Signal Region +chr3 143840800 143847000 High Signal Region +chr3 144030200 144036300 High Signal Region +chr3 144655600 144660600 High Signal Region +chr3 145040500 145061800 High Signal Region +chr3 145109000 145114400 Low Mappability +chr3 145188100 145190400 High Signal Region +chr3 145301600 145303100 High Signal Region +chr3 146073300 146102400 High Signal Region +chr3 146358800 146362600 High Signal Region +chr3 146476200 146479000 High Signal Region +chr3 146918900 146924200 High Signal Region +chr3 147107400 147113000 High Signal Region +chr3 147769500 147781800 High Signal Region +chr3 147874500 147877600 High Signal Region +chr3 148704800 148716900 High Signal Region +chr3 148750100 148757400 Low Mappability +chr3 148797800 148799700 High Signal Region +chr3 149051500 149053800 High Signal Region +chr3 150120900 150123800 High Signal Region +chr3 150336900 150341400 Low Mappability +chr3 151028900 151031200 High Signal Region +chr3 151657500 151679800 High Signal Region +chr3 152313800 152332200 High Signal Region +chr3 152700700 152702700 High Signal Region +chr3 153090100 153109400 High Signal Region +chr3 154640300 154646700 High Signal Region +chr3 154931700 154932800 High Signal Region +chr3 155515800 155517600 High Signal Region +chr3 155765900 155771900 High Signal Region +chr3 156256900 156262800 Low Mappability +chr3 156285600 156322500 High Signal Region +chr3 156799400 156804900 Low Mappability +chr3 157646900 157678300 High Signal Region +chr3 157946200 157969400 High Signal Region +chr3 158095300 158119200 High Signal Region +chr3 158698600 158756800 High Signal Region +chr3 159165900 159179700 High Signal Region +chr3 159225800 159239300 Low Mappability +chr3 159478300 159479700 High Signal Region +chr3 159748800 159826500 High Signal Region +chr3 159938500 160039600 High Signal Region +chr4 0 3114800 High Signal Region +chr4 3139700 3333100 High Signal Region +chr4 18476200 18498400 High Signal Region +chr4 20168700 20213200 High Signal Region +chr4 20804100 20808300 High Signal Region +chr4 20982300 20983700 High Signal Region +chr4 21281300 21287700 High Signal Region +chr4 22535900 22542300 High Signal Region +chr4 24193400 24201100 High Signal Region +chr4 25471300 25473200 High Signal Region +chr4 28175900 28177900 High Signal Region +chr4 31353200 31355200 High Signal Region +chr4 34934800 34936700 High Signal Region +chr4 35042700 35048900 High Signal Region +chr4 38305900 38322000 High Signal Region +chr4 57979700 57981800 High Signal Region +chr4 64454600 64499000 High Signal Region +chr4 68427300 68447900 High Signal Region +chr4 70367200 70379200 High Signal Region +chr4 73196300 73209300 High Signal Region +chr4 80001800 80004900 High Signal Region +chr4 83536900 83541900 High Signal Region +chr4 90725600 90727500 High Signal Region +chr4 92230800 92236500 High Signal Region +chr4 93843500 93853100 High Signal Region +chr4 99380500 99382400 High Signal Region +chr4 110469700 110505300 High Signal Region +chr4 118546100 118549600 High Signal Region +chr4 131222500 131229300 High Signal Region +chr4 145404200 147840400 High Signal Region +chr4 149809200 149811700 High Signal Region +chr4 153152100 153154100 High Signal Region +chr4 156256000 156508100 High Signal Region +chr5 3175400 3186000 High Signal Region +chr5 12489500 12490600 High Signal Region +chr5 14899000 15726800 High Signal Region +chr5 17466700 17481500 High Signal Region +chr5 36629400 36662500 High Signal Region +chr5 46434800 46436700 High Signal Region +chr5 49722200 49755700 High Signal Region +chr5 60041900 60043900 Low Mappability +chr5 80499900 80501900 High Signal Region +chr5 93288700 93351800 High Signal Region +chr5 106126300 106177800 High Signal Region +chr5 110063700 110075500 High Signal Region +chr5 114921500 114923500 High Signal Region +chr5 137148800 137153800 High Signal Region +chr5 146260000 146262300 High Signal Region +chr5 151733600 151834600 High Signal Region +chr6 0 3255700 High Signal Region +chr6 3280700 3340300 High Signal Region +chr6 4922900 4925100 High Signal Region +chr6 5608000 5657900 High Signal Region +chr6 5704400 5706800 High Signal Region +chr6 6400000 6442800 High Signal Region +chr6 6700000 6727600 High Signal Region +chr6 8729200 8731100 High Signal Region +chr6 8906700 8932300 High Signal Region +chr6 9519200 9529100 High Signal Region +chr6 9580600 9610100 High Signal Region +chr6 9646900 9663400 High Signal Region +chr6 9720400 9733100 High Signal Region +chr6 9889000 9891100 High Signal Region +chr6 10228400 10269900 High Signal Region +chr6 10559100 10588400 High Signal Region +chr6 10623400 10633900 High Signal Region +chr6 11251100 11256800 High Signal Region +chr6 11406400 11457900 High Signal Region +chr6 11813900 11897100 High Signal Region +chr6 12671100 12680300 High Signal Region +chr6 13390500 13394900 High Signal Region +chr6 13700500 13743100 High Signal Region +chr6 14085000 14092300 Low Mappability +chr6 14793800 14805500 High Signal Region +chr6 14929200 14935100 High Signal Region +chr6 16299700 16310100 High Signal Region +chr6 16922600 16924800 High Signal Region +chr6 17004600 17042000 High Signal Region +chr6 17391200 17397900 High Signal Region +chr6 17981700 17983400 High Signal Region +chr6 18264800 18267200 High Signal Region +chr6 18836700 18848600 High Signal Region +chr6 19068900 19075400 High Signal Region +chr6 20113900 20143500 High Signal Region +chr6 21452400 21458100 High Signal Region +chr6 21801300 21803200 High Signal Region +chr6 21841300 21845300 High Signal Region +chr6 21873300 21876800 High Signal Region +chr6 22107700 22131800 High Signal Region +chr6 22479600 22483900 High Signal Region +chr6 22516700 22534300 High Signal Region +chr6 25505600 25566400 Low Mappability +chr6 26049500 26072100 High Signal Region +chr6 26247700 26278000 High Signal Region +chr6 26834800 26840700 High Signal Region +chr6 26988500 26992000 High Signal Region +chr6 27199000 27228400 High Signal Region +chr6 28924100 28929500 Low Mappability +chr6 29746800 29750000 High Signal Region +chr6 29974300 29978200 High Signal Region +chr6 30752800 30806400 High Signal Region +chr6 30929300 30936100 Low Mappability +chr6 31594900 31597200 High Signal Region +chr6 32740700 32746800 High Signal Region +chr6 32867600 32869000 High Signal Region +chr6 33490300 33495000 High Signal Region +chr6 33650500 33665400 High Signal Region +chr6 33743900 33749000 High Signal Region +chr6 36224300 36230500 High Signal Region +chr6 40535500 40559800 Low Mappability +chr6 40716600 40723700 High Signal Region +chr6 42122800 42174200 High Signal Region +chr6 42492600 42516600 High Signal Region +chr6 42617600 42620900 High Signal Region +chr6 44265200 44270800 High Signal Region +chr6 44497000 44513300 High Signal Region +chr6 44785200 44794100 High Signal Region +chr6 44836300 44837500 High Signal Region +chr6 46381300 46402000 High Signal Region +chr6 46678600 46685300 High Signal Region +chr6 47639000 47779200 High Signal Region +chr6 48120300 48122300 High Signal Region +chr6 48149300 48172900 High Signal Region +chr6 48231500 48292600 High Signal Region +chr6 48320300 48347000 High Signal Region +chr6 49235500 49237500 High Signal Region +chr6 50601400 50636700 Low Mappability +chr6 51046500 51048400 High Signal Region +chr6 53464100 53487500 Low Mappability +chr6 54976500 54993700 High Signal Region +chr6 56232700 56257500 High Signal Region +chr6 56455900 56465300 High Signal Region +chr6 57425200 57455700 High Signal Region +chr6 57588900 57634500 High Signal Region +chr6 57919500 57925700 High Signal Region +chr6 58068500 58073500 High Signal Region +chr6 58588700 58612800 High Signal Region +chr6 59123600 59130100 High Signal Region +chr6 59199600 59230600 High Signal Region +chr6 59584300 59598000 High Signal Region +chr6 59676000 59698200 High Signal Region +chr6 60622400 60625600 High Signal Region +chr6 60668000 60688200 High Signal Region +chr6 61023100 61029400 High Signal Region +chr6 61088400 61094600 High Signal Region +chr6 62525500 62527300 High Signal Region +chr6 64331600 64338900 Low Mappability +chr6 64778500 64812500 High Signal Region +chr6 64882100 64930500 High Signal Region +chr6 65100600 65106700 High Signal Region +chr6 65184300 65261600 High Signal Region +chr6 66070200 66095900 High Signal Region +chr6 66815600 66831600 High Signal Region +chr6 67311500 67312900 High Signal Region +chr6 67494800 67522100 Low Mappability +chr6 67576400 67630800 High Signal Region +chr6 67658300 67710900 High Signal Region +chr6 68011000 68012900 High Signal Region +chr6 68221900 68252400 Low Mappability +chr6 68641400 68661300 High Signal Region +chr6 68971900 68996400 High Signal Region +chr6 69017600 69035700 High Signal Region +chr6 70000300 70053000 High Signal Region +chr6 70187800 70213700 High Signal Region +chr6 70620700 70648600 High Signal Region +chr6 73105700 73113400 High Signal Region +chr6 73502200 73521000 High Signal Region +chr6 73671400 73672600 High Signal Region +chr6 74191700 74194400 High Signal Region +chr6 74365900 74386400 High Signal Region +chr6 74700100 74705300 High Signal Region +chr6 75054000 75083000 High Signal Region +chr6 76645400 76649100 High Signal Region +chr6 76847200 76854100 High Signal Region +chr6 78352900 78359500 High Signal Region +chr6 78456200 78491700 Low Mappability +chr6 78637400 78639700 High Signal Region +chr6 78716700 78722400 High Signal Region +chr6 79627500 79635200 High Signal Region +chr6 79817300 79819200 High Signal Region +chr6 79898900 79922800 Low Mappability +chr6 79959800 79967500 Low Mappability +chr6 81012200 81036700 High Signal Region +chr6 81829400 81875000 High Signal Region +chr6 81997000 82011600 High Signal Region +chr6 82213400 82218800 High Signal Region +chr6 84662700 84688200 High Signal Region +chr6 84712600 84720200 High Signal Region +chr6 89723500 89735600 High Signal Region +chr6 91768300 91770200 High Signal Region +chr6 92321600 92328300 High Signal Region +chr6 94988600 94990700 Low Mappability +chr6 95030100 95043800 Low Mappability +chr6 95475600 95479900 High Signal Region +chr6 95980800 95987100 High Signal Region +chr6 96877800 96896100 High Signal Region +chr6 97356800 97379400 High Signal Region +chr6 101571200 101621400 High Signal Region +chr6 102379600 102384100 High Signal Region +chr6 102483000 102505700 High Signal Region +chr6 102767600 102791400 High Signal Region +chr6 103313700 103315600 High Signal Region +chr6 103647900 103650200 High Signal Region +chr6 103750700 103752000 High Signal Region +chr6 105194700 105199600 High Signal Region +chr6 105253400 105257600 Low Mappability +chr6 105306000 105337600 High Signal Region +chr6 107141500 107146300 High Signal Region +chr6 107284300 107299800 High Signal Region +chr6 107860500 107920500 High Signal Region +chr6 109498200 109506200 High Signal Region +chr6 109641800 109648100 High Signal Region +chr6 109984000 110013000 High Signal Region +chr6 114340600 114343000 High Signal Region +chr6 114492200 114643400 High Signal Region +chr6 116021200 116043900 High Signal Region +chr6 116238700 116252600 High Signal Region +chr6 116566200 116593800 High Signal Region +chr6 117087400 117094300 High Signal Region +chr6 118209000 118234000 High Signal Region +chr6 119419600 119431100 High Signal Region +chr6 121690100 121703800 High Signal Region +chr6 122614200 122616600 High Signal Region +chr6 123132100 123179400 High Signal Region +chr6 123204800 123242900 High Signal Region +chr6 126135200 126137300 Low Mappability +chr6 128680200 128693700 High Signal Region +chr6 128861200 128865300 High Signal Region +chr6 129857800 129863300 High Signal Region +chr6 129935700 129948400 High Signal Region +chr6 131088300 131114900 High Signal Region +chr6 131208300 131252100 High Signal Region +chr6 131495900 131505900 High Signal Region +chr6 132497200 132523000 Low Mappability +chr6 132597000 132598700 High Signal Region +chr6 132635400 132642000 High Signal Region +chr6 133169000 133170900 High Signal Region +chr6 133891500 133899800 High Signal Region +chr6 134689500 134692700 High Signal Region +chr6 138216100 138221900 High Signal Region +chr6 138647300 138649100 High Signal Region +chr6 138685400 138700700 High Signal Region +chr6 142060700 142079300 High Signal Region +chr6 142396700 142400200 Low Mappability +chr6 142433400 142439400 High Signal Region +chr6 143014400 143016300 High Signal Region +chr6 143466500 143481400 High Signal Region +chr6 143883500 143886900 High Signal Region +chr6 144655200 144670000 High Signal Region +chr6 145784700 145787000 High Signal Region +chr6 145931800 145933900 Low Mappability +chr6 146018900 146080500 High Signal Region +chr6 147077200 147079900 High Signal Region +chr6 147459800 147465000 Low Mappability +chr6 147549600 147555000 Low Mappability +chr6 147881900 147908400 High Signal Region +chr6 148013100 148038400 High Signal Region +chr6 148121800 148124500 High Signal Region +chr6 148635700 148640300 Low Mappability +chr6 148662900 148665000 Low Mappability +chr6 149585500 149736500 High Signal Region +chr7 4558200 4594300 High Signal Region +chr7 4648600 4651500 High Signal Region +chr7 5153200 5244900 High Signal Region +chr7 5588700 5591600 High Signal Region +chr7 6050500 6056000 High Signal Region +chr7 6249400 6251400 High Signal Region +chr7 6590800 6597400 High Signal Region +chr7 7209500 7231000 High Signal Region +chr7 7273500 7327400 High Signal Region +chr7 7527500 7533900 High Signal Region +chr7 7556800 8278400 High Signal Region +chr7 8490800 9968800 High Signal Region +chr7 9992100 9998900 High Signal Region +chr7 10314900 10320900 High Signal Region +chr7 11097700 11123700 High Signal Region +chr7 11271100 11438600 High Signal Region +chr7 12009500 12084600 High Signal Region +chr7 12379600 12385400 High Signal Region +chr7 12526600 12548100 High Signal Region +chr7 13112300 13118100 High Signal Region +chr7 13591200 13620200 High Signal Region +chr7 14051300 14055900 High Signal Region +chr7 14767700 14823800 High Signal Region +chr7 14930100 15023000 High Signal Region +chr7 15128800 15623000 High Signal Region +chr7 16661400 16667800 High Signal Region +chr7 17112200 17123900 High Signal Region +chr7 17215800 17323400 High Signal Region +chr7 17800000 17806700 High Signal Region +chr7 17829700 17862600 High Signal Region +chr7 18487100 18493200 High Signal Region +chr7 19032600 19034500 High Signal Region +chr7 20799700 21103900 High Signal Region +chr7 21135700 23286800 High Signal Region +chr7 23494700 23503600 High Signal Region +chr7 24026200 24031700 High Signal Region +chr7 24103800 24108200 High Signal Region +chr7 24729400 24731300 High Signal Region +chr7 26022700 26066900 High Signal Region +chr7 26779000 26780900 High Signal Region +chr7 27082300 27098300 High Signal Region +chr7 27712800 27732500 High Signal Region +chr7 31365500 31387000 High Signal Region +chr7 31818200 31876700 High Signal Region +chr7 31934500 32043100 High Signal Region +chr7 32215700 32235200 High Signal Region +chr7 32629300 33098700 High Signal Region +chr7 33124200 33198000 High Signal Region +chr7 33949500 34004800 High Signal Region +chr7 34957200 34959100 High Signal Region +chr7 38396600 38787200 High Signal Region +chr7 38839800 39181000 High Signal Region +chr7 39227600 39404100 High Signal Region +chr7 39874600 39875900 High Signal Region +chr7 41791900 41851900 High Signal Region +chr7 43123800 43220300 High Signal Region +chr7 44737800 44739900 High Signal Region +chr7 47175100 47188600 High Signal Region +chr7 47414400 47519700 High Signal Region +chr7 48102600 48135800 High Signal Region +chr7 50940400 50986800 High Signal Region +chr7 51329800 51335900 High Signal Region +chr7 51800300 51812600 High Signal Region +chr7 51909200 51911200 High Signal Region +chr7 52095700 52104400 High Signal Region +chr7 52283300 52288900 High Signal Region +chr7 53677100 53683100 High Signal Region +chr7 53977800 54027400 High Signal Region +chr7 54336000 54351800 High Signal Region +chr7 54808900 54810100 High Signal Region +chr7 54923000 54971200 High Signal Region +chr7 55011500 55016500 High Signal Region +chr7 55080000 55086300 High Signal Region +chr7 55115400 55141000 High Signal Region +chr7 55657400 55667100 High Signal Region +chr7 56062300 56081700 High Signal Region +chr7 56160100 56163400 Low Mappability +chr7 56660300 56693600 High Signal Region +chr7 57367200 57374700 High Signal Region +chr7 58040300 58077100 High Signal Region +chr7 58161700 58177900 High Signal Region +chr7 59673100 59910900 High Signal Region +chr7 60209400 60215600 High Signal Region +chr7 60676300 60682800 High Signal Region +chr7 61320100 61395400 High Signal Region +chr7 62135200 62137500 High Signal Region +chr7 62651400 62693400 High Signal Region +chr7 63272500 63287100 High Signal Region +chr7 63431300 63432400 High Signal Region +chr7 63803700 63810800 High Signal Region +chr7 63908200 63910100 High Signal Region +chr7 64072600 64134600 High Signal Region +chr7 64465300 64496400 High Signal Region +chr7 64601000 64617900 High Signal Region +chr7 65187500 65198300 High Signal Region +chr7 68534700 68537900 High Signal Region +chr7 68775900 68778100 High Signal Region +chr7 69086500 69102900 High Signal Region +chr7 69785300 69792200 High Signal Region +chr7 70757900 70765000 High Signal Region +chr7 71971100 71984500 High Signal Region +chr7 72317400 72337900 High Signal Region +chr7 72630000 72679900 High Signal Region +chr7 73212000 73218800 High Signal Region +chr7 73671700 73680000 High Signal Region +chr7 75003200 75007700 High Signal Region +chr7 76067800 76079300 High Signal Region +chr7 76556000 76573000 High Signal Region +chr7 76703900 76708400 High Signal Region +chr7 77520600 77526000 High Signal Region +chr7 78416900 78422400 High Signal Region +chr7 80708100 80730100 Low Mappability +chr7 80787500 80813800 High Signal Region +chr7 81756100 81760500 High Signal Region +chr7 82770300 82772800 High Signal Region +chr7 85017700 85023600 High Signal Region +chr7 85757200 85768800 High Signal Region +chr7 86118700 86125800 High Signal Region +chr7 86497400 86503500 High Signal Region +chr7 86532600 86534000 High Signal Region +chr7 86805600 86807500 High Signal Region +chr7 87989300 88000600 High Signal Region +chr7 89683300 89704600 High Signal Region +chr7 90087300 90089400 High Signal Region +chr7 90441000 90442900 High Signal Region +chr7 91741500 91747500 High Signal Region +chr7 93259400 93278100 High Signal Region +chr7 93699600 93717500 High Signal Region +chr7 93744000 93766100 High Signal Region +chr7 93969600 93973700 High Signal Region +chr7 94293000 94299300 High Signal Region +chr7 94822500 94848800 High Signal Region +chr7 95177200 95193600 High Signal Region +chr7 95527400 95533200 High Signal Region +chr7 97795000 97797300 High Signal Region +chr7 103100800 103115000 High Signal Region +chr7 103195500 103202100 High Signal Region +chr7 103483000 103487500 High Signal Region +chr7 104097400 104126600 High Signal Region +chr7 104476800 104477900 High Signal Region +chr7 104770000 104801200 High Signal Region +chr7 105830300 106325300 High Signal Region +chr7 106979000 106984900 High Signal Region +chr7 107245200 107271400 High Signal Region +chr7 108780600 108789800 High Signal Region +chr7 110058500 110061600 High Signal Region +chr7 111228400 111230600 High Signal Region +chr7 112636600 112639800 High Signal Region +chr7 116432200 116453400 High Signal Region +chr7 119739900 119742100 High Signal Region +chr7 119795700 119797700 High Signal Region +chr7 119998800 120015100 High Signal Region +chr7 124522300 124528300 High Signal Region +chr7 125009800 125016600 High Signal Region +chr7 128171000 128189300 High Signal Region +chr7 130054200 130055700 High Signal Region +chr7 130591400 130596900 High Signal Region +chr7 130833500 130835600 High Signal Region +chr7 134100500 134107200 High Signal Region +chr7 134329200 134335200 High Signal Region +chr7 135006900 135008800 High Signal Region +chr7 135337800 135340900 High Signal Region +chr7 138590500 138594500 High Signal Region +chr7 139447400 139448900 High Signal Region +chr7 140288200 140307300 High Signal Region +chr7 140551100 140558800 High Signal Region +chr7 140580500 140585700 High Signal Region +chr7 141637000 141640700 High Signal Region +chr7 142828900 142845000 High Signal Region +chr7 145340000 145441400 High Signal Region +chr8 3753500 3779100 High Signal Region +chr8 14305800 14308200 High Signal Region +chr8 15508900 15521000 High Signal Region +chr8 19671800 19937800 High Signal Region +chr8 19960800 20868000 High Signal Region +chr8 20945500 20963700 High Signal Region +chr8 23085600 23096700 High Signal Region +chr8 35134000 35135900 High Signal Region +chr8 39132400 39157700 High Signal Region +chr8 55111200 55397300 High Signal Region +chr8 69416700 69597900 High Signal Region +chr8 71432100 71434100 High Signal Region +chr8 71796100 71863300 High Signal Region +chr8 73318700 73320700 High Signal Region +chr8 83755800 83757900 High Signal Region +chr8 114436000 114437900 High Signal Region +chr8 123537300 123638300 High Signal Region +chr8 125778100 125780100 High Signal Region +chr8 129272900 129401200 High Signal Region +chr9 0 3053100 High Signal Region +chr9 3240200 3259800 High Signal Region +chr9 3302000 3336000 High Signal Region +chr9 3461000 3466600 Low Mappability +chr9 3627400 3699700 Low Mappability +chr9 3802100 3806700 High Signal Region +chr9 3881100 3887600 High Signal Region +chr9 4238700 4245700 Low Mappability +chr9 4375700 4406800 High Signal Region +chr9 5248000 5254100 High Signal Region +chr9 5276200 5284600 Low Mappability +chr9 6431500 6467200 High Signal Region +chr9 6742900 6806200 Low Mappability +chr9 7294600 7300700 High Signal Region +chr9 7370900 7412600 Low Mappability +chr9 7520900 7525900 High Signal Region +chr9 8029400 8067100 Low Mappability +chr9 8275900 8292300 Low Mappability +chr9 8447200 8483700 High Signal Region +chr9 8628200 8633700 Low Mappability +chr9 8859900 8865500 High Signal Region +chr9 9598800 9626700 High Signal Region +chr9 9846900 9891900 Low Mappability +chr9 10193200 10198800 Low Mappability +chr9 10701300 10707400 High Signal Region +chr9 10964200 10970600 High Signal Region +chr9 11341900 11345100 High Signal Region +chr9 11722300 11747100 High Signal Region +chr9 11792800 11798400 Low Mappability +chr9 11821400 11845400 High Signal Region +chr9 12282000 12287500 High Signal Region +chr9 12364900 12379600 High Signal Region +chr9 12469100 12472900 Low Mappability +chr9 12768200 12773800 High Signal Region +chr9 12840100 12851100 High Signal Region +chr9 12917600 12922300 High Signal Region +chr9 12998400 13045600 Low Mappability +chr9 13324200 13426100 High Signal Region +chr9 13533500 13535700 High Signal Region +chr9 13994600 13996700 High Signal Region +chr9 14410500 14429300 Low Mappability +chr9 15123900 15136900 High Signal Region +chr9 16607400 16691900 Low Mappability +chr9 16833700 16861000 High Signal Region +chr9 16939400 16950500 Low Mappability +chr9 17059000 17088000 High Signal Region +chr9 17197900 17207600 High Signal Region +chr9 17261400 17263400 Low Mappability +chr9 17387200 17406200 High Signal Region +chr9 17525800 17527700 High Signal Region +chr9 17632000 17636100 High Signal Region +chr9 17916200 17919600 High Signal Region +chr9 18010000 18015600 High Signal Region +chr9 18117000 18162200 Low Mappability +chr9 18235100 18270100 High Signal Region +chr9 18893800 18900100 High Signal Region +chr9 18980400 18994100 High Signal Region +chr9 19268700 19294700 High Signal Region +chr9 19595400 19638400 High Signal Region +chr9 19720500 19725500 Low Mappability +chr9 19901400 19906100 High Signal Region +chr9 20183600 20196700 Low Mappability +chr9 20322100 20407900 High Signal Region +chr9 21879200 21928200 High Signal Region +chr9 22116600 22191600 High Signal Region +chr9 22699500 22731700 High Signal Region +chr9 22892700 22926500 Low Mappability +chr9 22947900 22956900 High Signal Region +chr9 23508700 23526900 High Signal Region +chr9 24523300 24576000 High Signal Region +chr9 25596700 25602700 High Signal Region +chr9 25842900 25863600 High Signal Region +chr9 26096100 26103500 Low Mappability +chr9 26700800 26708000 High Signal Region +chr9 26904600 26911000 High Signal Region +chr9 27212200 27232300 High Signal Region +chr9 27974400 27981700 High Signal Region +chr9 29739800 29741800 Low Mappability +chr9 30604400 30606300 Low Mappability +chr9 30641800 30696800 Low Mappability +chr9 30929800 30931100 High Signal Region +chr9 32059200 32083600 Low Mappability +chr9 32353900 32356500 High Signal Region +chr9 32839200 32846600 Low Mappability +chr9 32888700 32896000 Low Mappability +chr9 32953000 32958100 Low Mappability +chr9 33127100 33161100 Low Mappability +chr9 33392400 33402700 High Signal Region +chr9 33949500 33961900 Low Mappability +chr9 35071200 35091800 High Signal Region +chr9 35304300 35306500 High Signal Region +chr9 36235800 36241900 High Signal Region +chr9 36555000 36569100 High Signal Region +chr9 37331400 37349500 Low Mappability +chr9 37441700 37448100 High Signal Region +chr9 39330900 39359100 High Signal Region +chr9 39444100 39449600 High Signal Region +chr9 39835400 39899000 Low Mappability +chr9 44214200 44235400 Low Mappability +chr9 44305700 44408400 Low Mappability +chr9 47957400 47959300 High Signal Region +chr9 50082000 50088400 High Signal Region +chr9 51667400 51673700 High Signal Region +chr9 52601800 52617200 High Signal Region +chr9 52749000 52756100 High Signal Region +chr9 53089800 53107000 High Signal Region +chr9 53804100 53805400 High Signal Region +chr9 54916200 54928900 High Signal Region +chr9 55070600 55078000 Low Mappability +chr9 55150300 55152300 High Signal Region +chr9 55936900 55972500 High Signal Region +chr9 56222700 56224800 High Signal Region +chr9 56259500 56284300 High Signal Region +chr9 56991700 56993700 Low Mappability +chr9 57408000 57434800 High Signal Region +chr9 58766500 58785800 High Signal Region +chr9 59046200 59052700 Low Mappability +chr9 59103800 59125000 High Signal Region +chr9 60538500 60551200 High Signal Region +chr9 60726100 60733500 High Signal Region +chr9 61721500 61723400 High Signal Region +chr9 62811600 62868300 Low Mappability +chr9 64236700 64255000 Low Mappability +chr9 64410400 64417700 Low Mappability +chr9 65292600 65314200 High Signal Region +chr9 65867400 65909400 High Signal Region +chr9 67198600 67205000 Low Mappability +chr9 68451200 68461200 High Signal Region +chr9 68527100 68534600 High Signal Region +chr9 71080600 71120800 Low Mappability +chr9 71421100 71434600 High Signal Region +chr9 72895800 72900800 Low Mappability +chr9 72957900 72985700 Low Mappability +chr9 73285500 73311300 High Signal Region +chr9 73396800 73412500 Low Mappability +chr9 73861400 73863500 Low Mappability +chr9 73935600 73946700 High Signal Region +chr9 74615600 74641300 Low Mappability +chr9 74664800 74690900 High Signal Region +chr9 74768600 74774600 High Signal Region +chr9 75709200 75736000 Low Mappability +chr9 77079900 77082800 High Signal Region +chr9 77152800 77158800 High Signal Region +chr9 77972400 77974300 High Signal Region +chr9 78175200 78182700 Low Mappability +chr9 78230500 78296900 High Signal Region +chr9 78554700 78589200 Low Mappability +chr9 78755200 78757800 High Signal Region +chr9 78819200 78830500 Low Mappability +chr9 80234500 80235700 High Signal Region +chr9 80660700 80665600 High Signal Region +chr9 81251500 81303200 High Signal Region +chr9 81614000 81620700 High Signal Region +chr9 81906400 81937200 High Signal Region +chr9 83278800 83288100 High Signal Region +chr9 83558300 83560200 High Signal Region +chr9 83935500 83950000 High Signal Region +chr9 83992400 83998900 High Signal Region +chr9 84211900 84226800 High Signal Region +chr9 85898900 85918900 High Signal Region +chr9 86062600 86070000 Low Mappability +chr9 86120100 86137500 High Signal Region +chr9 86458200 86463100 High Signal Region +chr9 87098700 87112200 High Signal Region +chr9 87481400 87500900 High Signal Region +chr9 87576700 87594000 High Signal Region +chr9 87945600 87952400 High Signal Region +chr9 88011000 88013900 High Signal Region +chr9 88592100 88829800 High Signal Region +chr9 89031300 89075400 Low Mappability +chr9 89321400 89361800 High Signal Region +chr9 90147100 90149100 High Signal Region +chr9 90285200 90395300 High Signal Region +chr9 90455400 90456800 High Signal Region +chr9 90808100 90821900 Low Mappability +chr9 90857200 90876300 Low Mappability +chr9 91222100 91268200 High Signal Region +chr9 91598800 91647400 High Signal Region +chr9 92032700 92035300 High Signal Region +chr9 92075300 92113200 High Signal Region +chr9 92239700 92242900 High Signal Region +chr9 92624800 92654500 High Signal Region +chr9 93013300 93035300 High Signal Region +chr9 93286500 93296500 High Signal Region +chr9 93360800 93442100 Low Mappability +chr9 93618000 93668500 Low Mappability +chr9 94821700 94828100 Low Mappability +chr9 95245800 95299600 High Signal Region +chr9 95425000 95426900 High Signal Region +chr9 95829400 95831300 High Signal Region +chr9 96104900 96111400 Low Mappability +chr9 96852000 96854100 High Signal Region +chr9 98343300 98345700 Low Mappability +chr9 98451100 98458500 Low Mappability +chr9 98747700 98771800 Low Mappability +chr9 99266600 99273100 Low Mappability +chr9 99735800 99763300 High Signal Region +chr9 99922800 99937600 High Signal Region +chr9 100073800 100080700 High Signal Region +chr9 100516900 100519200 High Signal Region +chr9 100920400 100922300 High Signal Region +chr9 101085500 101110600 High Signal Region +chr9 101292500 101326600 Low Mappability +chr9 102277400 102283800 Low Mappability +chr9 102764700 102766800 Low Mappability +chr9 102812800 102815000 High Signal Region +chr9 102956300 102970000 Low Mappability +chr9 103296200 103305600 High Signal Region +chr9 103352800 103367100 Low Mappability +chr9 103988500 103990400 High Signal Region +chr9 104524500 104525700 High Signal Region +chr9 104848800 104850600 High Signal Region +chr9 105086200 105119300 High Signal Region +chr9 105818400 105820400 High Signal Region +chr9 107207900 107219900 High Signal Region +chr9 109036600 109083500 High Signal Region +chr9 109245000 109252200 High Signal Region +chr9 109272900 109374100 High Signal Region +chr9 110280300 110306700 High Signal Region +chr9 110443100 110455100 High Signal Region +chr9 110970300 110976000 High Signal Region +chr9 111661900 111668700 High Signal Region +chr9 112330100 112336900 High Signal Region +chr9 112956300 112990600 High Signal Region +chr9 113260500 113262400 High Signal Region +chr9 113535400 113541300 High Signal Region +chr9 114101400 114149500 Low Mappability +chr9 114172400 114322200 High Signal Region +chr9 114970100 114974700 Low Mappability +chr9 115077900 115085200 Low Mappability +chr9 115349900 115351800 High Signal Region +chr9 115496100 115498100 Low Mappability +chr9 116981500 116988600 High Signal Region +chr9 118088300 118151400 High Signal Region +chr9 118674000 118675900 High Signal Region +chr9 119861200 119895000 Low Mappability +chr9 120265300 120288700 High Signal Region +chr9 120633900 120641200 Low Mappability +chr9 121024600 121042700 Low Mappability +chr9 121178300 121184500 High Signal Region +chr9 121220100 121247600 High Signal Region +chr9 121313700 121385800 Low Mappability +chr9 121406300 121418400 Low Mappability +chr9 122161300 122163200 High Signal Region +chr9 122277700 122334500 Low Mappability +chr9 122401500 122441900 Low Mappability +chr9 122660600 122667200 Low Mappability +chr9 122703400 122730400 Low Mappability +chr9 122903900 122906600 High Signal Region +chr9 123190700 123197500 Low Mappability +chr9 123460900 123463100 High Signal Region +chr9 123742600 123753500 Low Mappability +chr9 123851700 123929500 High Signal Region +chr9 123966100 124009300 High Signal Region +chr9 124161300 124282600 High Signal Region +chr9 124494100 124595100 High Signal Region +chrX 3286700 4493800 High Signal Region +chrX 4524500 5370300 High Signal Region +chrX 8346400 8348200 High Signal Region +chrX 8550300 8557800 High Signal Region +chrX 8818900 8824300 High Signal Region +chrX 9345800 9395300 High Signal Region +chrX 9500200 9595700 High Signal Region +chrX 14739100 14741000 High Signal Region +chrX 21466500 21472700 High Signal Region +chrX 21846900 21896100 High Signal Region +chrX 26459300 26505100 High Signal Region +chrX 26907100 29639200 High Signal Region +chrX 29660500 35508900 High Signal Region +chrX 37612500 37669100 High Signal Region +chrX 39073800 39075700 High Signal Region +chrX 41482500 41489500 High Signal Region +chrX 42676200 42688100 High Signal Region +chrX 44239900 44293300 High Signal Region +chrX 44732600 44738600 High Signal Region +chrX 48699000 48771100 High Signal Region +chrX 54269300 55286000 High Signal Region +chrX 55716700 55807400 High Signal Region +chrX 58475000 58478700 High Signal Region +chrX 59773000 59796900 High Signal Region +chrX 61868200 61874000 High Signal Region +chrX 62065700 62084900 High Signal Region +chrX 63509200 63515900 High Signal Region +chrX 63634600 63640900 High Signal Region +chrX 64125800 64132200 High Signal Region +chrX 65962800 65999900 High Signal Region +chrX 66067900 66084000 High Signal Region +chrX 66143100 66145700 High Signal Region +chrX 66316400 66356900 High Signal Region +chrX 67662500 67708500 High Signal Region +chrX 70055300 70072000 High Signal Region +chrX 72800000 72818700 High Signal Region +chrX 75582400 75709000 High Signal Region +chrX 76589100 76607100 High Signal Region +chrX 79135300 79150400 High Signal Region +chrX 81153100 81154600 High Signal Region +chrX 82475800 82481000 High Signal Region +chrX 84290800 84296100 High Signal Region +chrX 87222400 87262500 High Signal Region +chrX 87838600 87845200 High Signal Region +chrX 88230200 88246900 High Signal Region +chrX 89182800 89232600 High Signal Region +chrX 89914800 89916600 High Signal Region +chrX 90308600 90336600 High Signal Region +chrX 92765200 92767900 High Signal Region +chrX 94795400 94980600 High Signal Region +chrX 95265900 95291700 High Signal Region +chrX 97728000 97734800 High Signal Region +chrX 98008600 98033000 High Signal Region +chrX 98585800 98612400 High Signal Region +chrX 101111300 101113600 High Signal Region +chrX 102560800 102585100 High Signal Region +chrX 103455000 103457100 High Signal Region +chrX 104959400 104966000 High Signal Region +chrX 105523800 105529900 High Signal Region +chrX 108202600 108222500 High Signal Region +chrX 108567500 108585200 High Signal Region +chrX 109871000 109876200 High Signal Region +chrX 110976700 110997000 High Signal Region +chrX 112369800 112402300 High Signal Region +chrX 114412500 114421300 High Signal Region +chrX 118100900 118102900 High Signal Region +chrX 118901200 118905100 Low Mappability +chrX 119137300 119142400 High Signal Region +chrX 119247400 119264800 High Signal Region +chrX 119335000 119339300 High Signal Region +chrX 120351000 120355400 High Signal Region +chrX 121511200 121514500 High Signal Region +chrX 122901700 122908000 High Signal Region +chrX 123686000 124042000 High Signal Region +chrX 126695300 126778800 High Signal Region +chrX 127935800 127964600 High Signal Region +chrX 128512700 128514400 High Signal Region +chrX 128959800 128965900 High Signal Region +chrX 129055600 129072400 High Signal Region +chrX 129429300 129448000 High Signal Region +chrX 130696000 130702200 High Signal Region +chrX 131802300 131832800 High Signal Region +chrX 132024200 132026400 High Signal Region +chrX 132158700 132160800 High Signal Region +chrX 134149100 134151200 High Signal Region +chrX 135040100 135056700 High Signal Region +chrX 136459400 136503800 High Signal Region +chrX 136897900 136925800 High Signal Region +chrX 138302200 138324600 High Signal Region +chrX 143471300 143484000 High Signal Region +chrX 144699500 144723900 High Signal Region +chrX 145709800 145739800 High Signal Region +chrX 146582500 146588700 High Signal Region +chrX 146758100 146761900 High Signal Region +chrX 147619400 147620700 High Signal Region +chrX 153994800 154073200 High Signal Region +chrX 154242800 154244800 High Signal Region +chrX 158443900 158460500 High Signal Region +chrX 159120000 159154900 High Signal Region +chrX 161179200 161185600 High Signal Region +chrX 162381600 162384600 High Signal Region +chrX 164615100 164622200 High Signal Region +chrX 166063200 166084500 High Signal Region +chrX 167213400 167220200 High Signal Region +chrX 167246000 167252200 High Signal Region +chrX 169968900 171031200 High Signal Region +chrY 0 806800 High Signal Region +chrY 924800 1005300 High Signal Region +chrY 1276400 1813700 High Signal Region +chrY 1834500 1940700 High Signal Region +chrY 1973200 1996400 High Signal Region +chrY 2017200 2068000 Low Mappability +chrY 2104700 2210800 High Signal Region +chrY 2280300 2288900 Low Mappability +chrY 2471300 3819300 High Signal Region +chrY 3880300 4177100 High Signal Region +chrY 4249500 4289100 High Signal Region +chrY 4432000 4956300 High Signal Region +chrY 5062400 5227700 High Signal Region +chrY 6376700 6382700 High Signal Region +chrY 6530200 6663200 High Signal Region +chrY 6760200 6835800 High Signal Region +chrY 6984100 8985400 High Signal Region +chrY 10638500 41003800 High Signal Region +chrY 41159200 91744600 High Signal Region diff --git a/assets/blacklists/v3.0/hg38-blacklist.v3.bed b/assets/blacklists/v3.0/hg38-blacklist.v3.bed new file mode 100644 index 000000000..4e386f455 --- /dev/null +++ b/assets/blacklists/v3.0/hg38-blacklist.v3.bed @@ -0,0 +1,910 @@ +chr1 628903 635104 +chr1 5850087 5850571 +chr1 8909610 8910014 +chr1 9574580 9574997 +chr1 32043823 32044203 +chr1 33818964 33819344 +chr1 38674335 38674715 +chr1 50017081 50017546 +chr1 52996949 52997329 +chr1 55372488 55372869 +chr1 67971776 67972156 +chr1 73258720 73259100 +chr1 76971068 76971595 +chr1 93936365 93936747 +chr1 93937447 93937827 +chr1 102160407 102160787 +chr1 103620975 103621378 +chr1 106803432 106803816 +chr1 106804021 106804224 +chr1 106804753 106805343 +chr1 121609948 125063427 +chr1 125166231 125184683 +chr1 143184599 143276861 +chr1 146992422 146992802 +chr1 158449073 158449453 +chr1 158872114 158872494 +chr1 159295111 159295493 +chr1 169473895 169474338 +chr1 170006204 170006584 +chr1 172710350 172710732 +chr1 181422611 181423158 +chr1 191961694 191962163 +chr1 195288048 195288429 +chr1 199487949 199488149 +chr1 214709795 214710175 +chr1 215499615 215500014 +chr1 226652017 226652398 +chr1 227699752 227700133 +chr1 229019365 229019745 +chr1 233139985 233140365 +chr1 235520204 235520404 +chr1 235537405 235537785 +chr1 235538899 235540112 +chr1 235540243 235540623 +chr1 235540886 235541649 +chr1 235870625 235871005 +chr1 237940595 237940979 +chr1 237941045 237941514 +chr1 237941893 237942746 +chr1 237943028 237943416 +chr1 237943490 237945232 +chr1 237945285 237946507 +chr1 237948983 237949365 +chr1 237951294 237951802 +chr10 2235555 2235756 +chr10 19746628 19747247 +chr10 19747314 19748342 +chr10 25638376 25638756 +chr10 26873147 26873538 +chr10 30565118 30565501 +chr10 36432964 36433344 +chr10 36434047 36435188 +chr10 37600616 37601002 +chr10 37601246 37601787 +chr10 37601884 37602850 +chr10 38481300 38596500 +chr10 38782600 38967900 +chr10 39000365 41916630 +chr10 42066792 42104971 +chr10 45577925 45578305 +chr10 46706229 46706611 +chr10 47633790 47634172 +chr10 55597861 55600059 +chr10 55626794 55627174 +chr10 57668682 57669062 +chr10 59261793 59262173 +chr10 69590538 69590738 +chr10 69591475 69591858 +chr10 69592355 69592740 +chr10 69592776 69593482 +chr10 69594378 69594760 +chr10 69595141 69595573 +chr10 69595681 69596061 +chr10 77166388 77166768 +chr10 79411056 79411468 +chr10 89786504 89786889 +chr10 100057235 100058064 +chr10 112894488 112894870 +chr10 115056512 115056712 +chr10 123032371 123032751 +chr10 125819621 125820001 +chr10 133689373 133689523 +chr11 8023287 8023667 +chr11 10507706 10510499 +chr11 10768339 10768719 +chr11 10815184 10815384 +chr11 24839563 24839944 +chr11 27850562 27850942 +chr11 47323881 47324333 +chr11 50424039 50813393 +chr11 51081363 54424064 +chr11 64187168 64187556 +chr11 65069483 65069863 +chr11 73510500 73510992 +chr11 81551734 81551934 +chr11 81553835 81554282 +chr11 81556152 81556537 +chr11 81556717 81557101 +chr11 87813427 87814320 +chr11 87815683 87816063 +chr11 103270627 103271007 +chr11 103403270 103403650 +chr11 103404014 103404527 +chr11 103404779 103405289 +chr11 103405809 103406376 +chr11 103406653 103407036 +chr11 103407110 103407310 +chr11 103408089 103409893 +chr11 103410074 103411211 +chr11 110876919 110877308 +chr11 114021166 114021546 +chr11 123003425 123003857 +chr11 123139919 123140301 +chr12 9923 10481 +chr12 2539174 2539982 +chr12 3887955 3888335 +chr12 19795477 19795864 +chr12 20769413 20769432 +chr12 21052950 21053330 +chr12 22005655 22006093 +chr12 27925108 27925488 +chr12 31247541 31247923 +chr12 31247963 31248343 +chr12 34665177 37429869 +chr12 40286245 40286625 +chr12 41363462 41363903 +chr12 41698591 41698971 +chr12 41699048 41699573 +chr12 49817252 49817634 +chr12 62773865 62774257 +chr12 80623983 80624183 +chr12 101486970 101487350 +chr12 123053921 123054301 +chr12 126583199 126583772 +chr12 126584137 126584530 +chr12 130315425 130315904 +chr13 16226300 18171400 +chr13 25984718 25984918 +chr13 31866923 31867303 +chr13 33516898 33517278 +chr13 36065385 36065836 +chr13 40768206 40768595 +chr13 53891451 53891831 +chr13 55971453 55971922 +chr13 56688341 56688749 +chr13 72344211 72344591 +chr13 75592084 75592468 +chr13 83688313 83688693 +chr13 84521524 84522274 +chr13 84522848 84523233 +chr13 88308157 88308357 +chr13 95692549 95692935 +chr13 95693013 95693215 +chr13 95694449 95695698 +chr13 95696145 95696512 +chr13 105488067 105488448 +chr13 107058662 107059042 +chr13 109423944 109424560 +chr14 16000600 18173660 +chr14 23426306 23426691 +chr14 32483953 32485298 +chr14 37490106 37490486 +chr14 40643840 40644220 +chr14 43116742 43117122 +chr14 45238635 45239016 +chr14 45430378 45430758 +chr14 46048457 46048837 +chr14 46847040 46847420 +chr14 51587295 51587847 +chr14 83587331 83587894 +chr14 83588229 83589060 +chr14 84171262 84171729 +chr14 84171838 84172846 +chr14 84173508 84173969 +chr14 84174279 84174691 +chr14 86498937 86499317 +chr15 17058500 19838644 +chr15 30477565 30477945 +chr15 32529779 32530159 +chr15 34715310 34715692 +chr15 35396110 35396495 +chr15 40133887 40134759 +chr15 41157028 41157408 +chr15 52100391 52100771 +chr15 54583731 54584111 +chr15 58152409 58153114 +chr15 58153292 58153690 +chr15 58155859 58156155 +chr15 67040730 67041122 +chr15 91960163 91960543 +chr16 3367430 3368546 +chr16 3369658 3370039 +chr16 3370150 3370542 +chr16 3370932 3371445 +chr16 3371688 3372222 +chr16 10719290 10720105 +chr16 10720417 10720781 +chr16 10721235 10721874 +chr16 10721900 10722280 +chr16 10723423 10723623 +chr16 10723815 10724200 +chr16 10724415 10724654 +chr16 20720929 20721312 +chr16 20721365 20721746 +chr16 20722103 20722552 +chr16 34071571 34071629 +chr16 34131996 34289269 +chr16 34571482 34597852 +chr16 34661168 34661267 +chr16 34919141 34919184 +chr16 35966577 38269112 +chr16 38275767 38280684 +chr16 46380676 46381095 +chr16 46386376 46386491 +chr16 46388622 46389053 +chr16 46390180 46390788 +chr16 46394471 46395088 +chr16 46398828 46401647 +chr16 60470624 60471006 +chr16 65701465 65701846 +chr16 67590312 67590692 +chr16 69358523 69358990 +chr16 73161120 73161500 +chr16 82119745 82120125 +chr17 141682 142062 +chr17 14171308 14171688 +chr17 15568187 15568567 +chr17 19597515 19597985 +chr17 19598613 19599532 +chr17 19599799 19600210 +chr17 19600300 19602064 +chr17 19602160 19602545 +chr17 19602886 19603595 +chr17 19603847 19604047 +chr17 19604922 19605588 +chr17 20851029 20851409 +chr17 21851150 21992060 +chr17 22519042 22520149 +chr17 22520322 22521025 +chr17 22521116 22526407 +chr17 22526636 22530152 +chr17 22530381 22532156 +chr17 22532315 22532940 +chr17 22551066 22551446 +chr17 22813591 26716670 +chr17 26885752 26885795 +chr17 35654769 35655182 +chr17 43251640 43251763 +chr17 43309853 43310048 +chr17 43315021 43316491 +chr17 43997535 43997957 +chr17 53105552 53106565 +chr17 54902920 54903301 +chr17 59279406 59279787 +chr17 63076394 63076777 +chr17 63393238 63393438 +chr17 65555244 65555624 +chr17 72316258 72316638 +chr17 80617407 80617802 +chr18 2842087 2842534 +chr18 8103913 8104113 +chr18 8846332 8846713 +chr18 15457976 20865732 +chr18 34571460 34571840 +chr18 47853089 47853617 +chr18 52883627 52884007 +chr18 59288306 59288686 +chr18 61874562 61874960 +chr18 77455900 77456280 +chr19 246899 247452 +chr19 12105016 12105399 +chr19 13362989 13363369 +chr19 24182199 27257542 +chr19 27741787 27741868 +chr19 36271917 36272148 +chr19 37572465 37572846 +chr19 37576134 37576516 +chr19 46122944 46123324 +chr19 47941356 47941426 +chr19 54794749 54795129 +chr19 56691535 56691736 +chr19 56922158 56922601 +chr2 638427 638808 +chr2 1087103 1087484 +chr2 16271753 16272134 +chr2 22316878 22317258 +chr2 24644617 24644997 +chr2 32916201 32916632 +chr2 33767290 33767703 +chr2 33964664 33965045 +chr2 36276769 36277149 +chr2 40784787 40785278 +chr2 49229452 49230058 +chr2 50588765 50589566 +chr2 54451654 54452034 +chr2 57648677 57649057 +chr2 67953669 67954049 +chr2 75063567 75063994 +chr2 81666317 81666849 +chr2 82814941 82815321 +chr2 82815451 82816236 +chr2 82816261 82816647 +chr2 82818378 82818748 +chr2 82820800 82821005 +chr2 85068666 85069046 +chr2 87824709 87825530 +chr2 89272789 89273133 +chr2 89827607 89827706 +chr2 89828636 89828710 +chr2 89828842 89828942 +chr2 89833685 89833793 +chr2 89839592 89839709 +chr2 89909317 89909789 +chr2 90379778 90402456 +chr2 92081223 92081398 +chr2 92188125 94293463 +chr2 94499181 94570956 +chr2 94898976 94899645 +chr2 94900639 94900840 +chr2 94901421 94901808 +chr2 97189431 97189813 +chr2 102482582 102482962 +chr2 102505606 102505987 +chr2 110072034 110072434 +chr2 110299106 110299346 +chr2 116751234 116751614 +chr2 116752004 116752448 +chr2 116752517 116752897 +chr2 117020171 117020552 +chr2 117021107 117022152 +chr2 117022438 117024038 +chr2 117024277 117025093 +chr2 117025205 117025670 +chr2 117026130 117026512 +chr2 120211535 120212064 +chr2 120212685 120213069 +chr2 120213761 120214143 +chr2 120214590 120215370 +chr2 121220135 121220515 +chr2 124680743 124681182 +chr2 125812046 125812548 +chr2 129090774 129091154 +chr2 130272174 130272615 +chr2 130273451 130273981 +chr2 130274326 130274992 +chr2 130275174 130275744 +chr2 130276119 130276500 +chr2 130277774 130278727 +chr2 130279995 130280729 +chr2 130280827 130281440 +chr2 130557359 130557607 +chr2 130563142 130563396 +chr2 131369643 131369925 +chr2 131370949 131371562 +chr2 131371916 131372361 +chr2 131372758 131373137 +chr2 131379317 131380344 +chr2 131381592 131381973 +chr2 131382344 131382728 +chr2 131382772 131382974 +chr2 131383079 131384016 +chr2 131384051 131384621 +chr2 131384898 131385281 +chr2 131385356 131385794 +chr2 140217229 140218044 +chr2 140220209 140220840 +chr2 140220940 140221140 +chr2 140221198 140222369 +chr2 140222545 140223623 +chr2 140223647 140224297 +chr2 143088644 143089042 +chr2 143089938 143090358 +chr2 143090898 143091662 +chr2 143092255 143092646 +chr2 143093556 143093941 +chr2 143094515 143094999 +chr2 143095614 143095994 +chr2 143096048 143096428 +chr2 143096470 143097336 +chr2 143097466 143097981 +chr2 143100621 143101005 +chr2 147048574 147048955 +chr2 147244849 147245229 +chr2 147265034 147265432 +chr2 148822913 148823295 +chr2 148881545 148882032 +chr2 155196092 155196473 +chr2 155263345 155264313 +chr2 155264362 155264562 +chr2 155264599 155264982 +chr2 155311420 155311995 +chr2 155313539 155313922 +chr2 156828628 156829008 +chr2 162517271 162517651 +chr2 164117001 164117382 +chr2 166414323 166414779 +chr2 167378863 167379244 +chr2 168652433 168652813 +chr2 179739184 179739689 +chr2 190593881 190594262 +chr2 196204680 196205060 +chr2 201212170 201212612 +chr2 201212648 201212854 +chr2 201212903 201213386 +chr2 201214659 201215040 +chr2 201549404 201549784 +chr2 201550130 201550513 +chr2 201557568 201557948 +chr2 202614117 202614527 +chr2 202615371 202615757 +chr2 202617016 202617398 +chr2 202618435 202618819 +chr2 202619754 202620134 +chr2 211773627 211774158 +chr2 211774322 211775192 +chr2 211775641 211776712 +chr2 211777034 211777417 +chr2 211777802 211778269 +chr2 211778916 211779562 +chr2 215573163 215573544 +chr2 226722088 226722596 +chr2 237521663 237522775 +chr2 237522862 237523652 +chr20 5999469 5999849 +chr20 9168743 9169145 +chr20 10441916 10442296 +chr20 13167142 13167534 +chr20 18449173 18449556 +chr20 22078162 22078542 +chr20 24024376 24024757 +chr20 26438448 28554562 +chr20 28644084 29015573 +chr20 29125977 29294639 +chr20 30744370 30744939 +chr20 30746748 30747241 +chr20 31051540 31106909 +chr20 31157044 31159116 +chr20 31161652 31223331 +chr20 34688743 34689039 +chr20 47894699 47896109 +chr20 57063873 57064279 +chr20 57357555 57358134 +chr20 57358221 57359428 +chr20 57359451 57360972 +chr20 63644937 63645318 +chr21 6369257 6372342 +chr21 7201205 7327885 +chr21 7919585 7919691 +chr21 8211710 8211892 +chr21 8212412 8212570 +chr21 8213694 8213987 +chr21 8219372 8220330 +chr21 8234456 8234568 +chr21 8394767 8394902 +chr21 8395471 8395591 +chr21 8396751 8397011 +chr21 8445918 8446080 +chr21 8446629 8446729 +chr21 8446925 8447070 +chr21 8595669 8595768 +chr21 8844362 8844855 +chr21 8846669 8847382 +chr21 10014674 10015194 +chr21 10650900 12965800 +chr21 16645305 16645685 +chr21 32095835 32096215 +chr21 35890413 35890796 +chr21 44474913 44475301 +chr21 45376056 45376517 +chr22 10863370 10863448 +chr22 11210951 11215489 +chr22 11854150 11854643 +chr22 11856460 11857173 +chr22 11974159 11974336 +chr22 12135181 12135894 +chr22 12137711 12138204 +chr22 12691742 12694097 +chr22 12954427 15057495 +chr22 15153934 15211502 +chr22 15940533 16085728 +chr22 32894952 32895345 +chr22 33819338 33819538 +chr22 35885491 35885898 +chr22 36172705 36173085 +chr22 36177875 36178257 +chr22 46470112 46470493 +chr22 50086003 50086529 +chr22 50806858 50808224 +chr3 3571912 3572292 +chr3 24705149 24705529 +chr3 25467328 25467722 +chr3 29797534 29797914 +chr3 33548103 33548483 +chr3 40252107 40253916 +chr3 41532177 41532556 +chr3 43229296 43229733 +chr3 68658875 68659467 +chr3 68670345 68670734 +chr3 73054640 73055020 +chr3 82655447 82655827 +chr3 89588895 89589538 +chr3 90269605 90722189 +chr3 90774880 91249595 +chr3 91519649 93657524 +chr3 93705477 93800019 +chr3 96475262 96475643 +chr3 96617014 96618680 +chr3 106894019 106894441 +chr3 106895181 106895568 +chr3 106896124 106896504 +chr3 106898661 106899022 +chr3 106899753 106900122 +chr3 106901799 106902741 +chr3 106903188 106903605 +chr3 119947198 119947578 +chr3 120721858 120722610 +chr3 122688557 122688938 +chr3 125982519 125982900 +chr3 127005357 127005745 +chr3 128988979 128989359 +chr3 137095968 137096348 +chr3 142662232 142662612 +chr3 152919604 152919995 +chr3 153658704 153659087 +chr3 160947473 160948127 +chr3 166159726 166160108 +chr3 166160260 166160644 +chr3 166161631 166162087 +chr3 166226563 166226945 +chr3 166232406 166232886 +chr3 166232970 166233355 +chr3 166474023 166474223 +chr3 171534313 171534700 +chr3 177010776 177011156 +chr3 192880587 192880967 +chr4 5404508 5404897 +chr4 12640142 12640815 +chr4 14506099 14506467 +chr4 17061824 17062213 +chr4 18949310 18949691 +chr4 22502173 22502553 +chr4 25717756 25718136 +chr4 25718275 25718655 +chr4 25719398 25719626 +chr4 27730251 27730747 +chr4 30884524 30884906 +chr4 32280109 32280489 +chr4 41023064 41023448 +chr4 47772100 47772544 +chr4 49136056 49136102 +chr4 49141052 49141147 +chr4 49246355 49246848 +chr4 49548607 49549100 +chr4 49631231 49658125 +chr4 49708086 51743949 +chr4 51793952 51817249 +chr4 55327979 55328462 +chr4 64606369 64606752 +chr4 64606841 64607360 +chr4 64607395 64607789 +chr4 64607976 64608801 +chr4 64608937 64609326 +chr4 64609811 64610876 +chr4 64611176 64611617 +chr4 66065193 66065631 +chr4 68050141 68050521 +chr4 68572333 68572774 +chr4 78008402 78008882 +chr4 83383282 83383662 +chr4 89731703 89732163 +chr4 92701787 92702300 +chr4 107501924 107502304 +chr4 112372589 112372969 +chr4 116296652 116297040 +chr4 116297165 116297545 +chr4 116297659 116298726 +chr4 116299003 116300416 +chr4 128081280 128081956 +chr4 140929567 140929947 +chr4 143017907 143018107 +chr4 143347973 143348354 +chr4 144379497 144379877 +chr4 155076906 155077288 +chr4 155452733 155452935 +chr4 155453928 155454313 +chr4 155454407 155455447 +chr4 155455566 155455766 +chr4 155457624 155458008 +chr4 155459547 155459747 +chr4 155460171 155460553 +chr4 155461093 155461689 +chr4 155462078 155463456 +chr4 155463701 155464839 +chr4 155464895 155465305 +chr4 155465580 155466624 +chr4 157628391 157628774 +chr4 160044429 160044815 +chr4 161449477 161449857 +chr4 161788291 161788671 +chr4 162421207 162421721 +chr4 172036714 172037094 +chr4 179069259 179069639 +chr4 183489243 183489623 +chr4 189844495 189844576 +chr5 12284 12523 +chr5 12952 13361 +chr5 5395563 5395943 +chr5 5396182 5396616 +chr5 5396675 5397057 +chr5 8619083 8619464 +chr5 8619927 8620307 +chr5 8620707 8621192 +chr5 8621953 8622333 +chr5 8622354 8622753 +chr5 32927394 32927776 +chr5 37164286 37164673 +chr5 45913363 50265419 +chr5 60761358 60762176 +chr5 66253509 66253889 +chr5 73775720 73776112 +chr5 79089860 79090240 +chr5 80649841 80652548 +chr5 94567275 94571098 +chr5 97678633 97679016 +chr5 98409947 98410327 +chr5 98410700 98411257 +chr5 99813005 99813388 +chr5 100045805 100055225 +chr5 106553187 106553689 +chr5 111488864 111489244 +chr5 119127218 119127602 +chr5 121030820 121031445 +chr5 122338658 122339042 +chr5 123760111 123760622 +chr5 123760719 123761918 +chr5 134923133 134928692 +chr5 136533606 136533986 +chr5 137305006 137305387 +chr5 152198765 152199145 +chr5 160600365 160600745 +chr5 163146853 163147234 +chr5 163959711 163960091 +chr5 164673914 164674288 +chr5 166530241 166530641 +chr5 170635389 170635774 +chr6 1705930 1706304 +chr6 3943769 3944149 +chr6 29454054 29454435 +chr6 32706020 32706850 +chr6 43490986 43491370 +chr6 54899048 54899248 +chr6 58554346 59830578 +chr6 61278527 61521106 +chr6 61573960 61574809 +chr6 72747981 72748361 +chr6 72799169 72799549 +chr6 76708390 76708770 +chr6 88555202 88555591 +chr6 91726616 91727363 +chr6 94446937 94447370 +chr6 96941571 96941951 +chr6 104699855 104700055 +chr6 114377334 114377534 +chr6 122764824 122765204 +chr6 126478329 126478709 +chr6 127735330 127735710 +chr6 132799554 132799939 +chr6 133150492 133150881 +chr6 133930809 133931190 +chr6 138133082 138133462 +chr6 143077647 143078031 +chr6 153666229 153666618 +chr6 153667363 153667744 +chr6 153668187 153668753 +chr6 153669025 153669419 +chr6 156547729 156548118 +chr6 163638068 163638448 +chr7 18021726 18022106 +chr7 22748471 22748854 +chr7 33749120 33749500 +chr7 36228567 36229008 +chr7 37387570 37387950 +chr7 45251808 45252289 +chr7 55369049 55369429 +chr7 57167688 57168071 +chr7 57168472 57168852 +chr7 57169046 57169430 +chr7 57169550 57169932 +chr7 57170307 57170523 +chr7 57170675 57171410 +chr7 57171502 57172122 +chr7 57173798 57174181 +chr7 57174854 57175239 +chr7 57185615 57185995 +chr7 57186105 57186589 +chr7 57187287 57188033 +chr7 57188305 57188872 +chr7 57189116 57189730 +chr7 57190949 57191332 +chr7 57191618 57191818 +chr7 57192132 57192860 +chr7 57193489 57193872 +chr7 57193974 57194701 +chr7 57194829 57195210 +chr7 57196302 57197490 +chr7 57198263 57198644 +chr7 57879605 58032504 +chr7 58166363 62995324 +chr7 63094673 63095057 +chr7 64104133 64104513 +chr7 64105294 64106415 +chr7 64106627 64107010 +chr7 64108329 64108798 +chr7 64110007 64110707 +chr7 64111376 64111804 +chr7 64111957 64112849 +chr7 67627830 67628213 +chr7 68097607 68097990 +chr7 68736347 68736811 +chr7 69331805 69332005 +chr7 69332037 69332438 +chr7 69333013 69333393 +chr7 69333597 69334167 +chr7 72088575 72088955 +chr7 83100026 83100406 +chr7 83469984 83470184 +chr7 83855080 83855464 +chr7 95851249 95851629 +chr7 104989516 104989896 +chr7 112372484 112372865 +chr7 112374724 112374950 +chr7 117263552 117264184 +chr7 117264231 117264614 +chr7 130116678 130117058 +chr7 141173000 141173384 +chr7 141801916 141802451 +chr7 141802901 141803366 +chr7 141804074 141804274 +chr7 141804814 141805507 +chr7 142665099 142667846 +chr7 143187483 143187863 +chr7 145997159 145997608 +chr7 150131843 150132229 +chr7 153968598 153968979 +chr7 159294463 159294846 +chr8 13353292 13353679 +chr8 16056863 16057063 +chr8 18849121 18849571 +chr8 20551162 20551554 +chr8 32805708 32806092 +chr8 33010514 33010894 +chr8 33011359 33014071 +chr8 33014510 33014895 +chr8 33015020 33015853 +chr8 36277446 36278060 +chr8 36278272 36278791 +chr8 36278835 36279634 +chr8 40070431 40070867 +chr8 43237631 43242390 +chr8 43937900 45969600 +chr8 46827305 46827914 +chr8 46828298 46829961 +chr8 46830195 46831222 +chr8 46837581 46837961 +chr8 46838101 46838484 +chr8 50758259 50758639 +chr8 56736733 56736933 +chr8 61303079 61303460 +chr8 67580689 67581493 +chr8 67581588 67581972 +chr8 67582178 67582568 +chr8 67585216 67585693 +chr8 67585787 67586175 +chr8 67587282 67587922 +chr8 69102851 69103234 +chr8 72985528 72985923 +chr8 74828644 74829025 +chr8 76201592 76202319 +chr8 76645407 76645800 +chr8 97907908 97908279 +chr8 99495689 99496133 +chr8 102774315 102774695 +chr8 103082925 103083379 +chr8 103083704 103084399 +chr8 103084730 103085110 +chr8 103085323 103085806 +chr8 103086859 103087242 +chr8 108533901 108534281 +chr8 110933150 110933533 +chr8 110934510 110935010 +chr8 111248936 111249316 +chr8 120224204 120224584 +chr8 127053876 127054257 +chr8 127968653 127969034 +chr8 133615761 133616142 +chr8 133755390 133755856 +chr9 5091131 5091511 +chr9 5091962 5093013 +chr9 5093063 5094123 +chr9 5094192 5094697 +chr9 5094931 5095816 +chr9 5096206 5096816 +chr9 5097188 5097890 +chr9 5098134 5098516 +chr9 5099352 5099552 +chr9 5100044 5100427 +chr9 5108063 5108592 +chr9 5109193 5109986 +chr9 5110030 5110411 +chr9 9896970 9897350 +chr9 15866612 15866992 +chr9 18336471 18336854 +chr9 31498260 31498640 +chr9 33656533 33658316 +chr9 33658346 33659299 +chr9 34998988 34999474 +chr9 36466192 36466572 +chr9 43153721 45525161 +chr9 64045550 64046043 +chr9 64047855 64048422 +chr9 65048153 65079624 +chr9 68251002 68251071 +chr9 72788174 72788555 +chr9 78741395 78741775 +chr9 78742155 78742969 +chr9 78743199 78743630 +chr9 78744108 78744492 +chr9 78810721 78811113 +chr9 79804550 79804933 +chr9 80564643 80565085 +chr9 80565478 80565941 +chr9 81747641 81748021 +chr9 82427689 82428071 +chr9 92108965 92109347 +chr9 92539106 92539763 +chr9 95876956 95877338 +chr9 117109914 117110296 +chr9 122505687 122506067 +chr9 129878699 129879081 +chr9 134164478 134165354 +chr9 134170819 134171060 +chrX 4059512 4059712 +chrX 5168678 5169232 +chrX 5169733 5170646 +chrX 15727702 15728089 +chrX 17116414 17116794 +chrX 24056083 24056470 +chrX 24375345 24375545 +chrX 33762401 33762781 +chrX 55178596 55179289 +chrX 55179434 55180459 +chrX 55181196 55182790 +chrX 55183051 55184112 +chrX 58061543 62821716 +chrX 62841379 62841765 +chrX 62842257 62842639 +chrX 70119464 70119845 +chrX 70127233 70127620 +chrX 77501934 77502314 +chrX 78561721 78561921 +chrX 84403779 84404168 +chrX 100027094 100027475 +chrX 102010329 102010712 +chrX 102011531 102011915 +chrX 102772405 102772791 +chrX 102785904 102786287 +chrX 102798001 102798386 +chrX 102802747 102803161 +chrX 102809395 102809788 +chrX 104409869 104410249 +chrX 106239694 106239894 +chrX 111416893 111417294 +chrX 126471558 126473451 +chrX 126728884 126729272 +chrX 126729326 126729709 +chrX 126729837 126730217 +chrX 126730716 126731106 +chrX 126731624 126732029 +chrX 129983338 129983538 +chrX 133041871 133042251 +chrX 135292293 135292493 +chrX 143430213 143430837 +chrX 143431144 143431537 +chrX 143431716 143432219 +chrX 143432410 143433212 +chrX 143433510 143434156 +chrX 143543636 143544023 +chrX 146995842 146996224 +chrY 4344757 4344879 +chrY 9141870 9141995 +chrY 10203380 10266932 +chrY 10316749 10544446 +chrY 10594583 10626838 +chrY 10663669 10663716 +chrY 10744417 10921497 +chrY 11290797 11334278 +chrY 11493053 11592850 +chrY 11671014 11671046 +chrY 11721528 11749472 +chrY 56694632 56889743 From d0dfe55309ed343d67885b3c9411bf7ed28fccf0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:23:53 +0100 Subject: [PATCH 329/538] Fix ECLint --- assets/blacklists/v1.0/GRCh37-blacklist.bed | 822 ++++++++++---------- 1 file changed, 411 insertions(+), 411 deletions(-) diff --git a/assets/blacklists/v1.0/GRCh37-blacklist.bed b/assets/blacklists/v1.0/GRCh37-blacklist.bed index dab19f361..b87063023 100644 --- a/assets/blacklists/v1.0/GRCh37-blacklist.bed +++ b/assets/blacklists/v1.0/GRCh37-blacklist.bed @@ -1,411 +1,411 @@ -1 564449 570371 High_Mappability_island 1000 . -1 724136 727043 Satellite_repeat 1000 . -1 825006 825115 BSR/Beta 1000 . -1 2583334 2634374 Low_mappability_island 1000 . -1 4363064 4363242 (CATTC)n 1000 . -1 5725866 5736651 Low_mappability_island 1000 . -1 16839923 16841396 Low_mappability_island 1000 . -1 38077347 38077423 Low_mappability_island 1000 . -1 91852785 91853147 LSU-rRNA_Hsa 1000 . -1 104163724 104163860 Low_mappability_island 1000 . -1 108112972 108113707 LSU-rRNA_Hsa 1000 . -1 121351474 121487059 centromeric_repeat 1000 . -1 142535434 142543081 Satellite_repeat 1000 . -1 142723256 142723968 Low_mappability_island 1000 . -1 142792613 142793303 Low_mappability_island 1000 . -1 142835822 142837333 Low_mappability_island 1000 . -1 143274490 143284340 centromeric_repeat 1000 . -1 145277108 145277572 LSU-rRNA_Hsa 1000 . -1 149033183 149035829 Satellite_repeat 1000 . -1 156186169 156186712 High_Mappability_island 1000 . -1 224199390 224204260 Satellite_repeat 1000 . -1 233318467 233318516 (CATTC)n 1000 . -1 236260366 236260821 Low_mappability_island 1000 . -1 237766308 237766764 LSU-rRNA_Hsa 1000 . -1 238105345 238105511 Low_mappability_island 1000 . -1 238108025 238108378 Low_mappability_island 1000 . -1 238108645 238109697 Low_mappability_island 1000 . -10 18841533 18862467 (CATTC)n 1000 . -10 20035661 20037171 Low_mappability_island 1000 . -10 36722282 36723650 Low_mappability_island 1000 . -10 38772277 38819357 Satellite_repeat 1000 . -10 38868892 38889025 Satellite_repeat 1000 . -10 39076515 39155771 Satellite_repeat 1000 . -10 42354835 42548642 centromeric_repeat 1000 . -10 42596676 42602082 Satellite_repeat 1000 . -10 42596700 42602110 Satellite_repeat 1000 . -10 42661264 42667623 Satellite_repeat 1000 . -10 42790522 42818398 Satellite_repeat 1000 . -10 135498649 135502716 Satellite_repeat 1000 . -11 6831669 6831838 ALR/Alpha 1000 . -11 10529403 10531969 Low_mappability_island 1000 . -11 48671444 48902406 centromeric_repeat 1000 . -11 48931242 48964015 centromeric_repeat 1000 . -11 50318471 50784078 centromeric_repeat 1000 . -11 51090700 51374066 centromeric_repeat 1000 . -11 51567242 51594226 centromeric_repeat 1000 . -11 54694046 55027975 centromeric_repeat 1000 . -11 73221660 73221946 Low_mappability_island 1000 . -11 85194913 85195322 LSU-rRNA_Hsa 1000 . -11 87524468 87525005 Low_mappability_island 1000 . -11 103275584 103281729 Low_mappability_island 1000 . -11 122874287 122874443 Low_mappability_island 1000 . -12 20704285 20704583 SSU-rRNA_Hsa 1000 . -12 34372315 34372825 LSU-rRNA_Hsa 1000 . -12 34432130 34857010 centromeric_repeat 1000 . -12 37989447 38441828 centromeric_repeat 1000 . -12 38531376 38531930 LSU-rRNA_Hsa 1000 . -12 41757383 41757545 Low_mappability_island 1000 . -12 127650407 127651075 LSU-rRNA_Hsa 1000 . -12 132061320 132062046 Low_mappability_island 1000 . -13 56545728 56545925 Low_mappability_island 1000 . -13 110076444 110076782 Low_mappability_island 1000 . -14 18999935 19056900 centromeric_repeat 1000 . -14 32953263 32954381 Low_mappability_island 1000 . -14 84637832 84639038 Low_mappability_island 1000 . -14 90341302 90341516 SSU-rRNA_Hsa 1000 . -15 19999941 20044132 centromeric_repeat 1000 . -16 32493036 32570826 ALR/Alpha 1000 . -16 32590063 32598801 ALR/Alpha 1000 . -16 33237130 33241330 Low_mappability_island 1000 . -16 33864355 34023306 centromeric_repeat 1000 . -16 34180542 34197081 Satellite_repeat 1000 . -16 34530115 34542632 BSR/Beta 1000 . -16 35193580 35285885 centromeric_repeat 1000 . -16 46385718 46456668 Satellite_repeat 1000 . -16 46497639 46500515 Satellite_repeat 1000 . -16 47538629 47539297 LSU-rRNA_Hsa 1000 . -17 19355538 19356096 LSU-rRNA_Hsa 1000 . -17 19502495 19506773 Low_mappability_island 1000 . -17 21905167 21906712 centromeric_repeat 1000 . -17 22018524 22032049 Low_mappability_island 1000 . -17 22221073 22263006 centromeric_repeat 1000 . -17 25263010 25268059 Satellite_repeat 1000 . -17 25415551 25417559 telomeric_repeat 1000 . -17 31149365 31149981 High_Mappability_island 1000 . -17 33478114 33478372 LSU-rRNA_Hsa 1000 . -17 41381502 41382591 High_Mappability_island 1000 . -17 41463538 41464075 High_Mappability_island 1000 . -17 41464478 41465015 snRNA 1000 . -17 41465562 41467288 High_Mappability_island 1000 . -17 51183038 51183763 Low_mappability_island 1000 . -17 55868618 55868752 LSU-rRNA_Hsa 1000 . -17 75158031 75158430 LSU-rRNA_Hsa 1000 . -18 96416 97552 Satellite_repeat 1000 . -18 105658 112233 Satellite_repeat 1000 . -18 2842252 2842356 Low_mappability_island 1000 . -18 15393801 15393992 centromeric_repeat 1000 . -18 18510894 18520356 centromeric_repeat 1000 . -18 44126235 44126593 (CATTC)n 1000 . -18 45379603 45379864 Low_mappability_island 1000 . -18 50319086 50319301 Low_mappability_island 1000 . -18 77772846 77773065 LSU-rRNA_Hsa 1000 . -19 246006 247844 TAR1 1000 . -19 22877614 22877696 SSU-rRNA_Hsa 1000 . -19 23235030 23235504 BSR/Beta 1000 . -19 24182398 24186210 LSU-rRNA_Hsa 1000 . -19 24385474 24633168 centromeric_repeat 1000 . -19 27730611 28262682 centromeric_repeat 1000 . -19 36066445 36066810 LSU-rRNA_Hsa 1000 . -19 36756398 36800948 centromeric_repeat 1000 . -19 37759473 37797722 centromeric_repeat 1000 . -19 44914313 44916340 ACRO1 1000 . -19 44960681 44962681 ACRO1 1000 . -2 739925 740994 Low_mappability_island 1000 . -2 49456729 49457067 Low_mappability_island 1000 . -2 88124390 88124903 Low_mappability_island 1000 . -2 89830421 89880514 Satellite_repeat 1000 . -2 90371401 90394776 Satellite_repeat 1000 . -2 90443001 90545431 Low_mappability_island 1000 . -2 91595080 91616015 Satellite_repeat 1000 . -2 92267428 92326280 centromeric_repeat 1000 . -2 115695017 115695281 LSU-rRNA_Hsa 1000 . -2 117781085 117781300 Low_mappability_island 1000 . -2 132966248 132989300 centromeric_repeat 1000 . -2 132994855 133007983 ALR/Alpha 1000 . -2 133011824 133013298 SSU-rRNA_Hsa 1000 . -2 133036250 133040042 LSU-rRNA_Hsa 1000 . -2 133044095 133045945 ACRO1 1000 . -2 143848503 143848792 Low_mappability_island 1000 . -2 148022736 148022878 Low_mappability_island 1000 . -2 149639207 149639515 Low_mappability_island 1000 . -2 156120500 156120610 Low_mappability_island 1000 . -2 162135000 162139241 Low_mappability_island 1000 . -2 230045426 230045796 LSU-rRNA_Hsa 1000 . -20 26257032 26320267 centromeric_repeat 1000 . -20 29517710 29521147 centromeric_repeat 1000 . -20 29803876 29833334 centromeric_repeat 1000 . -20 55932703 55936114 chrM 1000 . -20 62916702 62918053 telomeric_repeat 1000 . -21 9647205 9648529 Low_mappability_island 1000 . -21 9694896 9704962 centromeric_repeat 1000 . -21 9825451 9827612 High_Mappability_island 1000 . -21 9827612 9845233 Low_mappability_island 1000 . -21 9881895 9882569 TAR1 1000 . -21 10084922 10088004 Satellite_repeat 1000 . -21 10492876 10493049 Low_mappability_island 1000 . -21 10599428 10599915 TAR1 1000 . -21 10697886 10860890 centromeric_repeat 1000 . -21 11186054 11188131 Satellite_repeat 1000 . -21 14338127 14369791 centromeric_repeat 1000 . -21 18800575 18800997 (GAGTG)n 1000 . -21 27228003 27228242 SSU-rRNA_Hsa 1000 . -21 46796081 46796336 Low_mappability_island 1000 . -22 16847814 16862659 Satellite_repeat 1000 . -22 18876789 18884510 Satellite_repeat 1000 . -3 25508897 25509131 Low_mappability_island 1000 . -3 73159606 73161131 snRNA 1000 . -3 75696297 75699304 BSR/Beta 1000 . -3 75717841 75720426 Satellite_repeat 1000 . -3 80995858 81014459 ALR/Alpha 1000 . -3 90311686 90507410 centromeric_repeat 1000 . -3 93504815 93519133 centromeric_repeat 1000 . -3 96335934 96337436 Low_mappability_island 1000 . -3 160665423 160665642 Low_mappability_island 1000 . -3 196625514 196625860 Satellite_repeat 1000 . -3 197825427 197834080 Low_mappability_island 1000 . -4 9987 12694 telomeric_repeat 1000 . -4 12276463 12292424 ALR/Alpha 1000 . -4 12641862 12642305 Low_mappability_island 1000 . -4 21583630 21583719 (GAATG)n 1000 . -4 27732004 27732240 Low_mappability_island 1000 . -4 47774268 47774416 Low_mappability_island 1000 . -4 49085372 49342114 centromeric_repeat 1000 . -4 49488472 49662085 centromeric_repeat 1000 . -4 52659961 52688986 centromeric_repeat 1000 . -4 56194229 56194584 Low_mappability_island 1000 . -4 65473858 65473941 Low_mappability_island 1000 . -4 68264186 68266830 centromeric_repeat 1000 . -4 70296565 70296841 LSU-rRNA_Hsa 1000 . -4 76807083 76807320 LSU-rRNA_Hsa 1000 . -4 78929660 78929920 Low_mappability_island 1000 . -4 156374749 156377226 chrM 1000 . -4 156384860 156387314 Low_mappability_island 1000 . -4 163342479 163342744 Low_mappability_island 1000 . -4 190190746 190203442 Low_mappability_island 1000 . -4 190801869 190802909 Low_mappability_island 1000 . -4 190943802 190943962 Satellite_repeat 1000 . -4 190987268 190990949 Satellite_repeat 1000 . -4 191026302 191044344 telomeric_repeat 1000 . -5 17517177 17600940 Low_mappability_island 1000 . -5 21477365 21497415 Low_mappability_island 1000 . -5 34177882 34197574 Low_mappability_island 1000 . -5 45908253 46411114 centromeric_repeat 1000 . -5 49405493 49554574 centromeric_repeat 1000 . -5 71146650 71146996 LSU-rRNA_Hsa 1000 . -5 79945807 79948223 Low_mappability_island 1000 . -5 93903068 93906726 Low_mappability_island 1000 . -5 97746525 97746679 Low_mappability_island 1000 . -5 99381556 99390873 Low_mappability_island 1000 . -5 105889063 105889263 chrM 1000 . -5 123095972 123097432 chrM 1000 . -5 134258949 134264271 Low_mappability_island 1000 . -5 174541634 174542177 SSU-rRNA_Hsa 1000 . -6 58735349 58739031 centromeric_repeat 1000 . -6 58745955 58780547 centromeric_repeat 1000 . -6 61880095 61944008 centromeric_repeat 1000 . -6 62189892 62206612 ALR/Alpha 1000 . -6 62207809 62230644 ALR/Alpha 1000 . -6 62283966 62284581 Low_mappability_island 1000 . -6 133593944 133594201 LSU-rRNA_Hsa 1000 . -6 137059142 137059326 SSU-rRNA_Hsa 1000 . -6 150665074 150665281 SSU-rRNA_Hsa 1000 . -6 157731310 157735525 Low_mappability_island 1000 . -7 43878355 43878530 TAR1 1000 . -7 45291517 45291740 Low_mappability_island 1000 . -7 56437808 56442977 Low_mappability_island 1000 . -7 57253980 57254183 Low_mappability_island 1000 . -7 57255310 57255444 Low_mappability_island 1000 . -7 57261829 57261998 Low_mappability_island 1000 . -7 57544726 57556913 Satellite_repeat 1000 . -7 57811488 57836990 centromeric_repeat 1000 . -7 57939184 58055539 centromeric_repeat 1000 . -7 61054285 62454680 centromeric_repeat 1000 . -7 64059157 64066183 BSR/Beta 1000 . -7 64951348 64956223 centromeric_repeat 1000 . -7 68201468 68201673 Low_mappability_island 1000 . -7 68527370 68527788 LSU-rRNA_Hsa 1000 . -7 80962907 80963147 SSU-rRNA_Hsa 1000 . -7 100550640 100551321 Low_mappability_island 1000 . -7 142372972 142375638 Low_mappability_island 1000 . -7 145694403 145694561 Low_mappability_island 1000 . -8 155512 157639 TAR1 1000 . -8 21455971 21456306 LSU-rRNA_Hsa 1000 . -8 32868966 32873279 Low_mappability_island 1000 . -8 43092737 43097573 Satellite_repeat 1000 . -8 43399486 43843604 centromeric_repeat 1000 . -8 46838215 47457541 centromeric_repeat 1000 . -8 47739043 47742797 Low_mappability_island 1000 . -8 47750844 47776101 BSR/Beta 1000 . -8 56754955 56755418 LSU-rRNA_Hsa 1000 . -8 69218401 69218922 LSU-rRNA_Hsa 1000 . -8 70602248 70602620 LSU-rRNA_Hsa 1000 . -8 77114154 77114389 Low_mappability_island 1000 . -8 100508010 100508287 Low_mappability_island 1000 . -9 10435 11574 TAR1 1000 . -9 4799734 4800000 SSU-rRNA_Hsa 1000 . -9 33656606 33659249 Low_mappability_island 1000 . -9 42819021 42832395 centromeric_repeat 1000 . -9 44070617 44070871 Low_mappability_island 1000 . -9 44873123 44902307 centromeric_repeat 1000 . -9 45355954 45357644 telomeric_repeat 1000 . -9 45435109 45443517 centromeric_repeat 1000 . -9 66494170 66494805 TAR1 1000 . -9 66767710 66864329 centromeric_repeat 1000 . -9 66970914 67005594 centromeric_repeat 1000 . -9 67315122 67321036 centromeric_repeat 1000 . -9 67789868 67792893 centromeric_repeat 1000 . -9 68410775 68435115 Low_mappability_island 1000 . -9 69677073 69687998 centromeric_repeat 1000 . -9 69689770 69711497 centromeric_repeat 1000 . -9 69947961 70011196 centromeric_repeat 1000 . -9 70076144 70076855 centromeric_repeat 1000 . -9 70318723 70327683 centromeric_repeat 1000 . -9 72653073 72653572 Satellite_repeat 1000 . -9 78790077 78790255 (GAATG)n 1000 . -9 79186574 79187026 LSU-rRNA_Hsa 1000 . -9 141019938 141021783 TAR1 1000 . -MT 1 16569 chrM 1000 . -X 55206111 55206740 Low_mappability_island 1000 . -X 55207753 55208152 Low_mappability_island 1000 . -X 55208300 55208643 Low_mappability_island 1000 . -X 55208980 55209208 Low_mappability_island 1000 . -X 55209655 55210006 Low_mappability_island 1000 . -X 58330488 58330843 centromeric_repeat 1000 . -X 58373806 58373962 centromeric_repeat 1000 . -X 58377680 58377864 centromeric_repeat 1000 . -X 58415350 58416387 centromeric_repeat 1000 . -X 58432411 58432680 centromeric_repeat 1000 . -X 58485887 58486241 centromeric_repeat 1000 . -X 58488898 58494528 centromeric_repeat 1000 . -X 58499466 58504235 centromeric_repeat 1000 . -X 58506076 58528214 centromeric_repeat 1000 . -X 58528184 58536883 centromeric_repeat 1000 . -X 58544061 58582415 centromeric_repeat 1000 . -X 61681834 61919683 centromeric_repeat 1000 . -X 62003205 62041580 centromeric_repeat 1000 . -X 83658929 83659019 Low_mappability_island 1000 . -X 108297348 108297886 LSU-rRNA_Hsa 1000 . -X 114959057 115006437 Low_mappability_island 1000 . -X 125605623 125607351 Low_mappability_island 1000 . -X 125714985 125715338 Low_mappability_island 1000 . -X 125864844 125864980 Low_mappability_island 1000 . -X 125865719 125865874 Low_mappability_island 1000 . -Y 313470 313613 ALR/Alpha 1000 . -Y 3004989 3005175 LSU-rRNA_Hsa 1000 . -Y 4212807 4212910 Low_mappability_island 1000 . -Y 7671817 7694928 BSR/Beta 1000 . -Y 7726064 7730229 BSR/Beta 1000 . -Y 7730734 7731598 BSR/Beta 1000 . -Y 7735811 7752887 BSR/Beta 1000 . -Y 7785067 7806311 BSR/Beta 1000 . -Y 7806856 7814704 BSR/Beta 1000 . -Y 7815230 7820478 BSR/Beta 1000 . -Y 7829937 7832032 BSR/Beta 1000 . -Y 7832744 7848695 BSR/Beta 1000 . -Y 7870343 7873582 BSR/Beta 1000 . -Y 7874115 7874584 BSR/Beta 1000 . -Y 7875409 7885257 BSR/Beta 1000 . -Y 7886545 7894591 BSR/Beta 1000 . -Y 7898927 7916812 BSR/Beta 1000 . -Y 7918790 7921352 BSR/Beta 1000 . -Y 7926344 7936705 BSR/Beta 1000 . -Y 7941130 7947438 BSR/Beta 1000 . -Y 7948790 7964448 BSR/Beta 1000 . -Y 8179010 8181143 BSR/Beta 1000 . -Y 8181757 8213330 BSR/Beta 1000 . -Y 8214629 8215637 BSR/Beta 1000 . -Y 8220421 8230061 BSR/Beta 1000 . -Y 8230686 8231546 BSR/Beta 1000 . -Y 8240772 8265916 BSR/Beta 1000 . -Y 8291535 8292942 BSR/Beta 1000 . -Y 8294002 8295175 BSR/Beta 1000 . -Y 8296944 8321375 BSR/Beta 1000 . -Y 8325813 8325929 BSR/Beta 1000 . -Y 8326678 8333466 BSR/Beta 1000 . -Y 8334027 8342387 BSR/Beta 1000 . -Y 8356544 8369346 BSR/Beta 1000 . -Y 8909560 8909925 TAR1 1000 . -Y 8979478 8979585 Low_mappability_island 1000 . -Y 9072781 9072993 TAR1 1000 . -Y 9908430 9925608 centromeric_repeat 1000 . -Y 9981952 9982126 BSR/Beta 1000 . -Y 10034864 10036712 SSU-rRNA_Hsa 1000 . -Y 10040627 10045657 ALR/Alpha 1000 . -Y 10047773 10052533 ALR/Alpha 1000 . -Y 10053695 10057722 ALR/Alpha 1000 . -Y 10059394 10073694 ALR/Alpha 1000 . -Y 10075082 10075781 ALR/Alpha 1000 . -Y 10080736 10104539 ALR/Alpha 1000 . -Y 13104530 13144368 centromeric_repeat 1000 . -Y 13193966 13196535 Low_mappability_island 1000 . -Y 13252193 13259484 centromeric_repeat 1000 . -Y 13290177 13290667 chrM 1000 . -Y 13445957 13490591 Satellite_repeat 1000 . -Y 13642186 13749784 Satellite_repeat 1000 . -Y 13798522 13870984 Satellite_repeat 1000 . -Y 19691913 19692524 LSU-rRNA_Hsa 1000 . -Y 19764063 19776198 ALR/Alpha 1000 . -Y 19780600 19781704 ALR/Alpha 1000 . -Y 19783669 19796396 ALR/Alpha 1000 . -Y 19800068 19801419 ALR/Alpha 1000 . -Y 19808085 19817100 ALR/Alpha 1000 . -Y 19944298 19944581 TAR1 1000 . -Y 20235195 20235478 TAR1 1000 . -Y 20362679 20371694 ALR/Alpha 1000 . -Y 20378360 20379711 ALR/Alpha 1000 . -Y 20383383 20396110 ALR/Alpha 1000 . -Y 20398075 20399179 ALR/Alpha 1000 . -Y 20403581 20415713 ALR/Alpha 1000 . -Y 20487248 20487859 LSU-rRNA_Hsa 1000 . -Y 23124788 23125577 BSR/Beta 1000 . -Y 23149027 23151205 BSR/Beta 1000 . -Y 23157969 23158245 BSR/Beta 1000 . -Y 23159001 23167737 BSR/Beta 1000 . -Y 23178886 23181770 BSR/Beta 1000 . -Y 23220740 23223625 BSR/Beta 1000 . -Y 23234125 23235822 BSR/Beta 1000 . -Y 23236898 23248080 BSR/Beta 1000 . -Y 23248729 23248851 BSR/Beta 1000 . -Y 23899295 23899388 TAR1 1000 . -Y 23956449 23956628 TAR1 1000 . -Y 24247659 24247700 TAR1 1000 . -Y 24630999 24631040 TAR1 1000 . -Y 24953159 24975657 BSR/Beta 1000 . -Y 24980997 24991235 BSR/Beta 1000 . -Y 25022753 25039185 BSR/Beta 1000 . -Y 25040153 25042421 BSR/Beta 1000 . -Y 25048332 25059258 BSR/Beta 1000 . -Y 25060235 25064798 BSR/Beta 1000 . -Y 25099139 25121882 BSR/Beta 1000 . -Y 25122419 25160800 BSR/Beta 1000 . -Y 25182404 25192372 BSR/Beta 1000 . -Y 25217722 25219409 BSR/Beta 1000 . -Y 25493588 25495275 BSR/Beta 1000 . -Y 26148315 26148450 TAR1 1000 . -Y 26586905 26609405 BSR/Beta 1000 . -Y 26614745 26624983 BSR/Beta 1000 . -Y 26656502 26672934 BSR/Beta 1000 . -Y 26673902 26676170 BSR/Beta 1000 . -Y 26682081 26693007 BSR/Beta 1000 . -Y 26693984 26698547 BSR/Beta 1000 . -Y 26732883 26755623 BSR/Beta 1000 . -Y 26756160 26794538 BSR/Beta 1000 . -Y 26816148 26826116 BSR/Beta 1000 . -Y 26851466 26853153 BSR/Beta 1000 . -Y 27109247 27110934 BSR/Beta 1000 . -Y 27136281 27146249 BSR/Beta 1000 . -Y 27167859 27206241 BSR/Beta 1000 . -Y 27206778 27229502 BSR/Beta 1000 . -Y 27263848 27268411 BSR/Beta 1000 . -Y 27269388 27280315 BSR/Beta 1000 . -Y 27286226 27288494 BSR/Beta 1000 . -Y 27289462 27305895 BSR/Beta 1000 . -Y 27337415 27347656 BSR/Beta 1000 . -Y 27352996 27375497 BSR/Beta 1000 . -Y 27813984 27814119 TAR1 1000 . -Y 28555026 28555353 TAR1 1000 . -Y 28784129 28819695 Satellite_repeat 1000 . -Y 58819367 58917648 (CATTC)n 1000 . -Y 58971913 58997782 (CATTC)n 1000 . -Y 59361267 59362785 TAR1 1000 . +1 564449 570371 High_Mappability_island 1000 . +1 724136 727043 Satellite_repeat 1000 . +1 825006 825115 BSR/Beta 1000 . +1 2583334 2634374 Low_mappability_island 1000 . +1 4363064 4363242 (CATTC)n 1000 . +1 5725866 5736651 Low_mappability_island 1000 . +1 16839923 16841396 Low_mappability_island 1000 . +1 38077347 38077423 Low_mappability_island 1000 . +1 91852785 91853147 LSU-rRNA_Hsa 1000 . +1 104163724 104163860 Low_mappability_island 1000 . +1 108112972 108113707 LSU-rRNA_Hsa 1000 . +1 121351474 121487059 centromeric_repeat 1000 . +1 142535434 142543081 Satellite_repeat 1000 . +1 142723256 142723968 Low_mappability_island 1000 . +1 142792613 142793303 Low_mappability_island 1000 . +1 142835822 142837333 Low_mappability_island 1000 . +1 143274490 143284340 centromeric_repeat 1000 . +1 145277108 145277572 LSU-rRNA_Hsa 1000 . +1 149033183 149035829 Satellite_repeat 1000 . +1 156186169 156186712 High_Mappability_island 1000 . +1 224199390 224204260 Satellite_repeat 1000 . +1 233318467 233318516 (CATTC)n 1000 . +1 236260366 236260821 Low_mappability_island 1000 . +1 237766308 237766764 LSU-rRNA_Hsa 1000 . +1 238105345 238105511 Low_mappability_island 1000 . +1 238108025 238108378 Low_mappability_island 1000 . +1 238108645 238109697 Low_mappability_island 1000 . +10 18841533 18862467 (CATTC)n 1000 . +10 20035661 20037171 Low_mappability_island 1000 . +10 36722282 36723650 Low_mappability_island 1000 . +10 38772277 38819357 Satellite_repeat 1000 . +10 38868892 38889025 Satellite_repeat 1000 . +10 39076515 39155771 Satellite_repeat 1000 . +10 42354835 42548642 centromeric_repeat 1000 . +10 42596676 42602082 Satellite_repeat 1000 . +10 42596700 42602110 Satellite_repeat 1000 . +10 42661264 42667623 Satellite_repeat 1000 . +10 42790522 42818398 Satellite_repeat 1000 . +10 135498649 135502716 Satellite_repeat 1000 . +11 6831669 6831838 ALR/Alpha 1000 . +11 10529403 10531969 Low_mappability_island 1000 . +11 48671444 48902406 centromeric_repeat 1000 . +11 48931242 48964015 centromeric_repeat 1000 . +11 50318471 50784078 centromeric_repeat 1000 . +11 51090700 51374066 centromeric_repeat 1000 . +11 51567242 51594226 centromeric_repeat 1000 . +11 54694046 55027975 centromeric_repeat 1000 . +11 73221660 73221946 Low_mappability_island 1000 . +11 85194913 85195322 LSU-rRNA_Hsa 1000 . +11 87524468 87525005 Low_mappability_island 1000 . +11 103275584 103281729 Low_mappability_island 1000 . +11 122874287 122874443 Low_mappability_island 1000 . +12 20704285 20704583 SSU-rRNA_Hsa 1000 . +12 34372315 34372825 LSU-rRNA_Hsa 1000 . +12 34432130 34857010 centromeric_repeat 1000 . +12 37989447 38441828 centromeric_repeat 1000 . +12 38531376 38531930 LSU-rRNA_Hsa 1000 . +12 41757383 41757545 Low_mappability_island 1000 . +12 127650407 127651075 LSU-rRNA_Hsa 1000 . +12 132061320 132062046 Low_mappability_island 1000 . +13 56545728 56545925 Low_mappability_island 1000 . +13 110076444 110076782 Low_mappability_island 1000 . +14 18999935 19056900 centromeric_repeat 1000 . +14 32953263 32954381 Low_mappability_island 1000 . +14 84637832 84639038 Low_mappability_island 1000 . +14 90341302 90341516 SSU-rRNA_Hsa 1000 . +15 19999941 20044132 centromeric_repeat 1000 . +16 32493036 32570826 ALR/Alpha 1000 . +16 32590063 32598801 ALR/Alpha 1000 . +16 33237130 33241330 Low_mappability_island 1000 . +16 33864355 34023306 centromeric_repeat 1000 . +16 34180542 34197081 Satellite_repeat 1000 . +16 34530115 34542632 BSR/Beta 1000 . +16 35193580 35285885 centromeric_repeat 1000 . +16 46385718 46456668 Satellite_repeat 1000 . +16 46497639 46500515 Satellite_repeat 1000 . +16 47538629 47539297 LSU-rRNA_Hsa 1000 . +17 19355538 19356096 LSU-rRNA_Hsa 1000 . +17 19502495 19506773 Low_mappability_island 1000 . +17 21905167 21906712 centromeric_repeat 1000 . +17 22018524 22032049 Low_mappability_island 1000 . +17 22221073 22263006 centromeric_repeat 1000 . +17 25263010 25268059 Satellite_repeat 1000 . +17 25415551 25417559 telomeric_repeat 1000 . +17 31149365 31149981 High_Mappability_island 1000 . +17 33478114 33478372 LSU-rRNA_Hsa 1000 . +17 41381502 41382591 High_Mappability_island 1000 . +17 41463538 41464075 High_Mappability_island 1000 . +17 41464478 41465015 snRNA 1000 . +17 41465562 41467288 High_Mappability_island 1000 . +17 51183038 51183763 Low_mappability_island 1000 . +17 55868618 55868752 LSU-rRNA_Hsa 1000 . +17 75158031 75158430 LSU-rRNA_Hsa 1000 . +18 96416 97552 Satellite_repeat 1000 . +18 105658 112233 Satellite_repeat 1000 . +18 2842252 2842356 Low_mappability_island 1000 . +18 15393801 15393992 centromeric_repeat 1000 . +18 18510894 18520356 centromeric_repeat 1000 . +18 44126235 44126593 (CATTC)n 1000 . +18 45379603 45379864 Low_mappability_island 1000 . +18 50319086 50319301 Low_mappability_island 1000 . +18 77772846 77773065 LSU-rRNA_Hsa 1000 . +19 246006 247844 TAR1 1000 . +19 22877614 22877696 SSU-rRNA_Hsa 1000 . +19 23235030 23235504 BSR/Beta 1000 . +19 24182398 24186210 LSU-rRNA_Hsa 1000 . +19 24385474 24633168 centromeric_repeat 1000 . +19 27730611 28262682 centromeric_repeat 1000 . +19 36066445 36066810 LSU-rRNA_Hsa 1000 . +19 36756398 36800948 centromeric_repeat 1000 . +19 37759473 37797722 centromeric_repeat 1000 . +19 44914313 44916340 ACRO1 1000 . +19 44960681 44962681 ACRO1 1000 . +2 739925 740994 Low_mappability_island 1000 . +2 49456729 49457067 Low_mappability_island 1000 . +2 88124390 88124903 Low_mappability_island 1000 . +2 89830421 89880514 Satellite_repeat 1000 . +2 90371401 90394776 Satellite_repeat 1000 . +2 90443001 90545431 Low_mappability_island 1000 . +2 91595080 91616015 Satellite_repeat 1000 . +2 92267428 92326280 centromeric_repeat 1000 . +2 115695017 115695281 LSU-rRNA_Hsa 1000 . +2 117781085 117781300 Low_mappability_island 1000 . +2 132966248 132989300 centromeric_repeat 1000 . +2 132994855 133007983 ALR/Alpha 1000 . +2 133011824 133013298 SSU-rRNA_Hsa 1000 . +2 133036250 133040042 LSU-rRNA_Hsa 1000 . +2 133044095 133045945 ACRO1 1000 . +2 143848503 143848792 Low_mappability_island 1000 . +2 148022736 148022878 Low_mappability_island 1000 . +2 149639207 149639515 Low_mappability_island 1000 . +2 156120500 156120610 Low_mappability_island 1000 . +2 162135000 162139241 Low_mappability_island 1000 . +2 230045426 230045796 LSU-rRNA_Hsa 1000 . +20 26257032 26320267 centromeric_repeat 1000 . +20 29517710 29521147 centromeric_repeat 1000 . +20 29803876 29833334 centromeric_repeat 1000 . +20 55932703 55936114 chrM 1000 . +20 62916702 62918053 telomeric_repeat 1000 . +21 9647205 9648529 Low_mappability_island 1000 . +21 9694896 9704962 centromeric_repeat 1000 . +21 9825451 9827612 High_Mappability_island 1000 . +21 9827612 9845233 Low_mappability_island 1000 . +21 9881895 9882569 TAR1 1000 . +21 10084922 10088004 Satellite_repeat 1000 . +21 10492876 10493049 Low_mappability_island 1000 . +21 10599428 10599915 TAR1 1000 . +21 10697886 10860890 centromeric_repeat 1000 . +21 11186054 11188131 Satellite_repeat 1000 . +21 14338127 14369791 centromeric_repeat 1000 . +21 18800575 18800997 (GAGTG)n 1000 . +21 27228003 27228242 SSU-rRNA_Hsa 1000 . +21 46796081 46796336 Low_mappability_island 1000 . +22 16847814 16862659 Satellite_repeat 1000 . +22 18876789 18884510 Satellite_repeat 1000 . +3 25508897 25509131 Low_mappability_island 1000 . +3 73159606 73161131 snRNA 1000 . +3 75696297 75699304 BSR/Beta 1000 . +3 75717841 75720426 Satellite_repeat 1000 . +3 80995858 81014459 ALR/Alpha 1000 . +3 90311686 90507410 centromeric_repeat 1000 . +3 93504815 93519133 centromeric_repeat 1000 . +3 96335934 96337436 Low_mappability_island 1000 . +3 160665423 160665642 Low_mappability_island 1000 . +3 196625514 196625860 Satellite_repeat 1000 . +3 197825427 197834080 Low_mappability_island 1000 . +4 9987 12694 telomeric_repeat 1000 . +4 12276463 12292424 ALR/Alpha 1000 . +4 12641862 12642305 Low_mappability_island 1000 . +4 21583630 21583719 (GAATG)n 1000 . +4 27732004 27732240 Low_mappability_island 1000 . +4 47774268 47774416 Low_mappability_island 1000 . +4 49085372 49342114 centromeric_repeat 1000 . +4 49488472 49662085 centromeric_repeat 1000 . +4 52659961 52688986 centromeric_repeat 1000 . +4 56194229 56194584 Low_mappability_island 1000 . +4 65473858 65473941 Low_mappability_island 1000 . +4 68264186 68266830 centromeric_repeat 1000 . +4 70296565 70296841 LSU-rRNA_Hsa 1000 . +4 76807083 76807320 LSU-rRNA_Hsa 1000 . +4 78929660 78929920 Low_mappability_island 1000 . +4 156374749 156377226 chrM 1000 . +4 156384860 156387314 Low_mappability_island 1000 . +4 163342479 163342744 Low_mappability_island 1000 . +4 190190746 190203442 Low_mappability_island 1000 . +4 190801869 190802909 Low_mappability_island 1000 . +4 190943802 190943962 Satellite_repeat 1000 . +4 190987268 190990949 Satellite_repeat 1000 . +4 191026302 191044344 telomeric_repeat 1000 . +5 17517177 17600940 Low_mappability_island 1000 . +5 21477365 21497415 Low_mappability_island 1000 . +5 34177882 34197574 Low_mappability_island 1000 . +5 45908253 46411114 centromeric_repeat 1000 . +5 49405493 49554574 centromeric_repeat 1000 . +5 71146650 71146996 LSU-rRNA_Hsa 1000 . +5 79945807 79948223 Low_mappability_island 1000 . +5 93903068 93906726 Low_mappability_island 1000 . +5 97746525 97746679 Low_mappability_island 1000 . +5 99381556 99390873 Low_mappability_island 1000 . +5 105889063 105889263 chrM 1000 . +5 123095972 123097432 chrM 1000 . +5 134258949 134264271 Low_mappability_island 1000 . +5 174541634 174542177 SSU-rRNA_Hsa 1000 . +6 58735349 58739031 centromeric_repeat 1000 . +6 58745955 58780547 centromeric_repeat 1000 . +6 61880095 61944008 centromeric_repeat 1000 . +6 62189892 62206612 ALR/Alpha 1000 . +6 62207809 62230644 ALR/Alpha 1000 . +6 62283966 62284581 Low_mappability_island 1000 . +6 133593944 133594201 LSU-rRNA_Hsa 1000 . +6 137059142 137059326 SSU-rRNA_Hsa 1000 . +6 150665074 150665281 SSU-rRNA_Hsa 1000 . +6 157731310 157735525 Low_mappability_island 1000 . +7 43878355 43878530 TAR1 1000 . +7 45291517 45291740 Low_mappability_island 1000 . +7 56437808 56442977 Low_mappability_island 1000 . +7 57253980 57254183 Low_mappability_island 1000 . +7 57255310 57255444 Low_mappability_island 1000 . +7 57261829 57261998 Low_mappability_island 1000 . +7 57544726 57556913 Satellite_repeat 1000 . +7 57811488 57836990 centromeric_repeat 1000 . +7 57939184 58055539 centromeric_repeat 1000 . +7 61054285 62454680 centromeric_repeat 1000 . +7 64059157 64066183 BSR/Beta 1000 . +7 64951348 64956223 centromeric_repeat 1000 . +7 68201468 68201673 Low_mappability_island 1000 . +7 68527370 68527788 LSU-rRNA_Hsa 1000 . +7 80962907 80963147 SSU-rRNA_Hsa 1000 . +7 100550640 100551321 Low_mappability_island 1000 . +7 142372972 142375638 Low_mappability_island 1000 . +7 145694403 145694561 Low_mappability_island 1000 . +8 155512 157639 TAR1 1000 . +8 21455971 21456306 LSU-rRNA_Hsa 1000 . +8 32868966 32873279 Low_mappability_island 1000 . +8 43092737 43097573 Satellite_repeat 1000 . +8 43399486 43843604 centromeric_repeat 1000 . +8 46838215 47457541 centromeric_repeat 1000 . +8 47739043 47742797 Low_mappability_island 1000 . +8 47750844 47776101 BSR/Beta 1000 . +8 56754955 56755418 LSU-rRNA_Hsa 1000 . +8 69218401 69218922 LSU-rRNA_Hsa 1000 . +8 70602248 70602620 LSU-rRNA_Hsa 1000 . +8 77114154 77114389 Low_mappability_island 1000 . +8 100508010 100508287 Low_mappability_island 1000 . +9 10435 11574 TAR1 1000 . +9 4799734 4800000 SSU-rRNA_Hsa 1000 . +9 33656606 33659249 Low_mappability_island 1000 . +9 42819021 42832395 centromeric_repeat 1000 . +9 44070617 44070871 Low_mappability_island 1000 . +9 44873123 44902307 centromeric_repeat 1000 . +9 45355954 45357644 telomeric_repeat 1000 . +9 45435109 45443517 centromeric_repeat 1000 . +9 66494170 66494805 TAR1 1000 . +9 66767710 66864329 centromeric_repeat 1000 . +9 66970914 67005594 centromeric_repeat 1000 . +9 67315122 67321036 centromeric_repeat 1000 . +9 67789868 67792893 centromeric_repeat 1000 . +9 68410775 68435115 Low_mappability_island 1000 . +9 69677073 69687998 centromeric_repeat 1000 . +9 69689770 69711497 centromeric_repeat 1000 . +9 69947961 70011196 centromeric_repeat 1000 . +9 70076144 70076855 centromeric_repeat 1000 . +9 70318723 70327683 centromeric_repeat 1000 . +9 72653073 72653572 Satellite_repeat 1000 . +9 78790077 78790255 (GAATG)n 1000 . +9 79186574 79187026 LSU-rRNA_Hsa 1000 . +9 141019938 141021783 TAR1 1000 . +MT 1 16569 chrM 1000 . +X 55206111 55206740 Low_mappability_island 1000 . +X 55207753 55208152 Low_mappability_island 1000 . +X 55208300 55208643 Low_mappability_island 1000 . +X 55208980 55209208 Low_mappability_island 1000 . +X 55209655 55210006 Low_mappability_island 1000 . +X 58330488 58330843 centromeric_repeat 1000 . +X 58373806 58373962 centromeric_repeat 1000 . +X 58377680 58377864 centromeric_repeat 1000 . +X 58415350 58416387 centromeric_repeat 1000 . +X 58432411 58432680 centromeric_repeat 1000 . +X 58485887 58486241 centromeric_repeat 1000 . +X 58488898 58494528 centromeric_repeat 1000 . +X 58499466 58504235 centromeric_repeat 1000 . +X 58506076 58528214 centromeric_repeat 1000 . +X 58528184 58536883 centromeric_repeat 1000 . +X 58544061 58582415 centromeric_repeat 1000 . +X 61681834 61919683 centromeric_repeat 1000 . +X 62003205 62041580 centromeric_repeat 1000 . +X 83658929 83659019 Low_mappability_island 1000 . +X 108297348 108297886 LSU-rRNA_Hsa 1000 . +X 114959057 115006437 Low_mappability_island 1000 . +X 125605623 125607351 Low_mappability_island 1000 . +X 125714985 125715338 Low_mappability_island 1000 . +X 125864844 125864980 Low_mappability_island 1000 . +X 125865719 125865874 Low_mappability_island 1000 . +Y 313470 313613 ALR/Alpha 1000 . +Y 3004989 3005175 LSU-rRNA_Hsa 1000 . +Y 4212807 4212910 Low_mappability_island 1000 . +Y 7671817 7694928 BSR/Beta 1000 . +Y 7726064 7730229 BSR/Beta 1000 . +Y 7730734 7731598 BSR/Beta 1000 . +Y 7735811 7752887 BSR/Beta 1000 . +Y 7785067 7806311 BSR/Beta 1000 . +Y 7806856 7814704 BSR/Beta 1000 . +Y 7815230 7820478 BSR/Beta 1000 . +Y 7829937 7832032 BSR/Beta 1000 . +Y 7832744 7848695 BSR/Beta 1000 . +Y 7870343 7873582 BSR/Beta 1000 . +Y 7874115 7874584 BSR/Beta 1000 . +Y 7875409 7885257 BSR/Beta 1000 . +Y 7886545 7894591 BSR/Beta 1000 . +Y 7898927 7916812 BSR/Beta 1000 . +Y 7918790 7921352 BSR/Beta 1000 . +Y 7926344 7936705 BSR/Beta 1000 . +Y 7941130 7947438 BSR/Beta 1000 . +Y 7948790 7964448 BSR/Beta 1000 . +Y 8179010 8181143 BSR/Beta 1000 . +Y 8181757 8213330 BSR/Beta 1000 . +Y 8214629 8215637 BSR/Beta 1000 . +Y 8220421 8230061 BSR/Beta 1000 . +Y 8230686 8231546 BSR/Beta 1000 . +Y 8240772 8265916 BSR/Beta 1000 . +Y 8291535 8292942 BSR/Beta 1000 . +Y 8294002 8295175 BSR/Beta 1000 . +Y 8296944 8321375 BSR/Beta 1000 . +Y 8325813 8325929 BSR/Beta 1000 . +Y 8326678 8333466 BSR/Beta 1000 . +Y 8334027 8342387 BSR/Beta 1000 . +Y 8356544 8369346 BSR/Beta 1000 . +Y 8909560 8909925 TAR1 1000 . +Y 8979478 8979585 Low_mappability_island 1000 . +Y 9072781 9072993 TAR1 1000 . +Y 9908430 9925608 centromeric_repeat 1000 . +Y 9981952 9982126 BSR/Beta 1000 . +Y 10034864 10036712 SSU-rRNA_Hsa 1000 . +Y 10040627 10045657 ALR/Alpha 1000 . +Y 10047773 10052533 ALR/Alpha 1000 . +Y 10053695 10057722 ALR/Alpha 1000 . +Y 10059394 10073694 ALR/Alpha 1000 . +Y 10075082 10075781 ALR/Alpha 1000 . +Y 10080736 10104539 ALR/Alpha 1000 . +Y 13104530 13144368 centromeric_repeat 1000 . +Y 13193966 13196535 Low_mappability_island 1000 . +Y 13252193 13259484 centromeric_repeat 1000 . +Y 13290177 13290667 chrM 1000 . +Y 13445957 13490591 Satellite_repeat 1000 . +Y 13642186 13749784 Satellite_repeat 1000 . +Y 13798522 13870984 Satellite_repeat 1000 . +Y 19691913 19692524 LSU-rRNA_Hsa 1000 . +Y 19764063 19776198 ALR/Alpha 1000 . +Y 19780600 19781704 ALR/Alpha 1000 . +Y 19783669 19796396 ALR/Alpha 1000 . +Y 19800068 19801419 ALR/Alpha 1000 . +Y 19808085 19817100 ALR/Alpha 1000 . +Y 19944298 19944581 TAR1 1000 . +Y 20235195 20235478 TAR1 1000 . +Y 20362679 20371694 ALR/Alpha 1000 . +Y 20378360 20379711 ALR/Alpha 1000 . +Y 20383383 20396110 ALR/Alpha 1000 . +Y 20398075 20399179 ALR/Alpha 1000 . +Y 20403581 20415713 ALR/Alpha 1000 . +Y 20487248 20487859 LSU-rRNA_Hsa 1000 . +Y 23124788 23125577 BSR/Beta 1000 . +Y 23149027 23151205 BSR/Beta 1000 . +Y 23157969 23158245 BSR/Beta 1000 . +Y 23159001 23167737 BSR/Beta 1000 . +Y 23178886 23181770 BSR/Beta 1000 . +Y 23220740 23223625 BSR/Beta 1000 . +Y 23234125 23235822 BSR/Beta 1000 . +Y 23236898 23248080 BSR/Beta 1000 . +Y 23248729 23248851 BSR/Beta 1000 . +Y 23899295 23899388 TAR1 1000 . +Y 23956449 23956628 TAR1 1000 . +Y 24247659 24247700 TAR1 1000 . +Y 24630999 24631040 TAR1 1000 . +Y 24953159 24975657 BSR/Beta 1000 . +Y 24980997 24991235 BSR/Beta 1000 . +Y 25022753 25039185 BSR/Beta 1000 . +Y 25040153 25042421 BSR/Beta 1000 . +Y 25048332 25059258 BSR/Beta 1000 . +Y 25060235 25064798 BSR/Beta 1000 . +Y 25099139 25121882 BSR/Beta 1000 . +Y 25122419 25160800 BSR/Beta 1000 . +Y 25182404 25192372 BSR/Beta 1000 . +Y 25217722 25219409 BSR/Beta 1000 . +Y 25493588 25495275 BSR/Beta 1000 . +Y 26148315 26148450 TAR1 1000 . +Y 26586905 26609405 BSR/Beta 1000 . +Y 26614745 26624983 BSR/Beta 1000 . +Y 26656502 26672934 BSR/Beta 1000 . +Y 26673902 26676170 BSR/Beta 1000 . +Y 26682081 26693007 BSR/Beta 1000 . +Y 26693984 26698547 BSR/Beta 1000 . +Y 26732883 26755623 BSR/Beta 1000 . +Y 26756160 26794538 BSR/Beta 1000 . +Y 26816148 26826116 BSR/Beta 1000 . +Y 26851466 26853153 BSR/Beta 1000 . +Y 27109247 27110934 BSR/Beta 1000 . +Y 27136281 27146249 BSR/Beta 1000 . +Y 27167859 27206241 BSR/Beta 1000 . +Y 27206778 27229502 BSR/Beta 1000 . +Y 27263848 27268411 BSR/Beta 1000 . +Y 27269388 27280315 BSR/Beta 1000 . +Y 27286226 27288494 BSR/Beta 1000 . +Y 27289462 27305895 BSR/Beta 1000 . +Y 27337415 27347656 BSR/Beta 1000 . +Y 27352996 27375497 BSR/Beta 1000 . +Y 27813984 27814119 TAR1 1000 . +Y 28555026 28555353 TAR1 1000 . +Y 28784129 28819695 Satellite_repeat 1000 . +Y 58819367 58917648 (CATTC)n 1000 . +Y 58971913 58997782 (CATTC)n 1000 . +Y 59361267 59362785 TAR1 1000 . From f94f5244a42e7957061cbdcf209cb341a276e0ae Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:26:42 +0100 Subject: [PATCH 330/538] Rename GRCh37 blacklist --- .../v1.0/{GRCh37-blacklist.bed => GRCh37-blacklist.v1.bed} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/blacklists/v1.0/{GRCh37-blacklist.bed => GRCh37-blacklist.v1.bed} (100%) diff --git a/assets/blacklists/v1.0/GRCh37-blacklist.bed b/assets/blacklists/v1.0/GRCh37-blacklist.v1.bed similarity index 100% rename from assets/blacklists/v1.0/GRCh37-blacklist.bed rename to assets/blacklists/v1.0/GRCh37-blacklist.v1.bed From b7eb970cb257cb0bef5f05c239a76a30946dc815 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:29:17 +0100 Subject: [PATCH 331/538] Template update for nf-core/tools version 2.2 --- LICENSE | 2 +- README.md | 2 +- docs/images/nf-core-chipseq_logo_light.png | Bin 428 -> 73788 bytes nextflow.config | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 2a0f576bc..e6309f574 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Philip Ewels +Copyright (c) Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 5dcdd654d..541726426 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ The nf-core/chipseq pipeline comes with documentation about the pipeline [usage] ## Credits -nf-core/chipseq was originally written by Philip Ewels. +nf-core/chipseq was originally written by Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel. We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/docs/images/nf-core-chipseq_logo_light.png b/docs/images/nf-core-chipseq_logo_light.png index d46347c2d217dd9a7c090367c55a068226f937c1..51a83b3d789d5852acc2bb044650b13785c6bf41 100644 GIT binary patch literal 73788 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| 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 H?aKcGF<{p3 literal 428 zcmZ`#K~BRk5WM>pOV3aj5H~9lG(l7

J-waT~81OO72jb}RoLJM9sUyE8jGGwP=P zT({r52Hx8DE$sF$+szslcT#Se_EpNdtuM&KawTQ+v8aUV!(c1b6Y4w!6D(Cvt4H`E zKADbS@9>1i;=z)V7g#7c)78Q2R21&3KiPRN)L6AW!IagA!AuZn7(F8!n;^O(3&GEL z`IdZS!SoYp3ZUbR4QN~-hc4sVpItBmfoJG&#Lk2yM)p}|n3k}!gi}7^1bED6U@;Ic zl^ka$&sv*cyhCf#Eg<}pQxJ33KjQ@CIv?|QCJpD_6tkR+I~LC|e?kXMA=kc(1G!N4 VJvv>8IrcTl)qtG)%H@^D#V=*Sk$eCE diff --git a/nextflow.config b/nextflow.config index e5ae4e45b..d771f6620 100644 --- a/nextflow.config +++ b/nextflow.config @@ -154,7 +154,7 @@ dag { manifest { name = 'nf-core/chipseq' - author = 'Philip Ewels' + author = 'Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel' homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' From 66bfcfcb4789ecf08e50da5f7ce14a4de0de162e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:32:44 +0100 Subject: [PATCH 332/538] Template update for nf-core/tools version 2.3.dev0 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/workflows/awsfulltest.yml | 8 +-- .github/workflows/awstest.yml | 8 +-- .github/workflows/linting.yml | 28 ++++------ .gitpod.yml | 14 +++++ .nf-core.yml | 1 + .yamllint.yml | 6 ++ README.md | 2 +- conf/base.config | 4 +- conf/igenomes.config | 80 +++++++++++++-------------- conf/modules.config | 10 ++-- conf/test.config | 4 +- conf/test_full.config | 4 +- docs/usage.md | 19 +++++-- lib/NfcoreSchema.groovy | 4 +- lib/Utils.groovy | 4 +- lib/WorkflowChipseq.groovy | 4 +- main.nf | 24 ++++---- nextflow.config | 7 ++- nextflow_schema.json | 16 ++++++ workflows/chipseq.nf | 28 +++++----- 21 files changed, 158 insertions(+), 118 deletions(-) create mode 100644 .gitpod.yml create mode 100644 .nf-core.yml create mode 100644 .yamllint.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b0d2788d9..ecfb25027 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,3 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index a5e2cade9..b6dc1488b 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters @@ -23,12 +23,12 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index b8f720cbe..8a2ea6259 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,18 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773c..fda934c03 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -51,9 +49,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -64,14 +60,13 @@ jobs: YAML: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - name: Checkout + uses: actions/checkout@master + - name: 'Yamllint' + uses: karancode/yamllint-github-action@master with: - node-version: '10' - - name: Install yaml-lint - run: npm install -g yaml-lint - - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + yamllint_file_or_dir: '.' + yamllint_config_filepath: '.yamllint.yml' # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -84,10 +79,11 @@ jobs: To keep the code consistent with lots of contributors, we run automated code consistency checks. To fix this CI test, please run: - * Install `yaml-lint` - * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Install `yamllint` + * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) + instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` * Fix any reported errors in your YAML files Once you push these changes the test should pass, and you can hide this comment :+1: diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..b7d4cee18 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,14 @@ +image: nfcore/gitpod:latest + +vscode: + extensions: # based on nf-core.nf-core-extensionpack + - codezombiech.gitignore # Language support for .gitignore files + # - cssho.vscode-svgviewer # SVG viewer + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + # - nextflow.nextflow # Nextflow syntax highlighting + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 000000000..3805dc81c --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1 @@ +repository_type: pipeline diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 000000000..d466deec9 --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,6 @@ +extends: default + +rules: + document-start: disable + line-length: disable + truthy: disable diff --git a/README.md b/README.md index 541726426..9fe7977b5 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ On release, automated continuous integration tests run the pipeline on a full-si > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/conf/base.config b/conf/base.config index 07779064b..8231c4796 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq Nextflow base config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. diff --git a/conf/igenomes.config b/conf/igenomes.config index 855948def..7a1b3ac6d 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for iGenomes paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines reference genomes using iGenome paths. Can be used by any config that customises the base path using: $params.igenomes_base / --igenomes_base @@ -13,7 +13,7 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" @@ -26,7 +26,7 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" @@ -38,7 +38,7 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" @@ -51,7 +51,7 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" @@ -62,7 +62,7 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" @@ -72,7 +72,7 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" @@ -83,7 +83,7 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" @@ -94,7 +94,7 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" @@ -105,7 +105,7 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" @@ -115,7 +115,7 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" @@ -126,7 +126,7 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" @@ -137,7 +137,7 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" @@ -147,7 +147,7 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" @@ -157,7 +157,7 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" @@ -167,7 +167,7 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" @@ -178,7 +178,7 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" @@ -188,7 +188,7 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" @@ -199,7 +199,7 @@ params { } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" @@ -209,7 +209,7 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" @@ -219,7 +219,7 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" @@ -230,7 +230,7 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" @@ -242,7 +242,7 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" @@ -252,7 +252,7 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" @@ -263,7 +263,7 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" @@ -273,7 +273,7 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" @@ -285,7 +285,7 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" @@ -298,7 +298,7 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" @@ -311,7 +311,7 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" @@ -321,7 +321,7 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" @@ -333,7 +333,7 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" @@ -344,7 +344,7 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" @@ -355,7 +355,7 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" @@ -366,7 +366,7 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" @@ -377,7 +377,7 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" @@ -388,7 +388,7 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" @@ -399,7 +399,7 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" @@ -409,7 +409,7 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" @@ -419,7 +419,7 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" diff --git a/conf/modules.config b/conf/modules.config index a0506a4db..6b9870439 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Config file for defining DSL2 per module options and publishing paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Available keys to override module options: ext.args = Additional arguments appended to command in module. ext.args2 = Second set of arguments appended to command in module (multi-tool modules). @@ -14,14 +14,14 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] withName: SAMPLESHEET_CHECK { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -33,7 +33,7 @@ process { withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*_versions.yml' ] } diff --git a/conf/test.config b/conf/test.config index 3a199a627..c31e8db7a 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running minimal tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: diff --git a/conf/test_full.config b/conf/test_full.config index d8fe4234c..49cf8e434 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running full-size tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a full size pipeline test. Use as follows: diff --git a/docs/usage.md b/docs/usage.md index d1e7eebc7..7eb149bae 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -141,11 +141,11 @@ Whilst the default requirements set within the pipeline will hopefully work for For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: ```console -[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' +[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' Caused by: - Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) + Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) Command executed: STAR \ @@ -169,17 +169,24 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). +The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. +The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. +Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. +The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: STAR_ALIGN { + withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { memory = 100.GB } } ``` -> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. +> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f20..b3d092f80 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 1b88aec0e..28567bd70 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -29,12 +29,12 @@ class Utils { conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) if (conda_check_failed) { - log.warn "=============================================================================\n" + + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + " NB: The order of the channels matters!\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } } diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 4ca6323ae..547194f75 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -48,11 +48,11 @@ class WorkflowChipseq { // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + + log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" System.exit(1) } } diff --git a/main.nf b/main.nf index 7a90164a5..cf50b1183 100644 --- a/main.nf +++ b/main.nf @@ -1,8 +1,8 @@ #!/usr/bin/env nextflow /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/chipseq Website: https://nf-co.re/chipseq Slack : https://nfcore.slack.com/channels/chipseq @@ -12,25 +12,25 @@ nextflow.enable.dsl = 2 /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENOME PARAMETER VALUES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ WorkflowMain.initialise(workflow, params, log) /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOW FOR PIPELINE -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { CHIPSEQ } from './workflows/chipseq' @@ -43,9 +43,9 @@ workflow NFCORE_CHIPSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN ALL WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -57,7 +57,7 @@ workflow { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/nextflow.config b/nextflow.config index d771f6620..407e69049 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq Nextflow config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- */ @@ -26,6 +26,7 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -121,7 +122,7 @@ if (!params.igenomes_ignore) { } // Export these variables to prevent local Python/R libraries from conflicting with those in the container -// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. env { diff --git a/nextflow_schema.json b/nextflow_schema.json index 91a37921a..b74007bf8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -178,6 +178,22 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], + "hidden": true + }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 5714aa820..0a51968e9 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,18 +18,18 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -38,9 +38,9 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { INPUT_CHECK } from '../subworkflows/local/input_check' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -51,9 +51,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // Info required for completion email and summary @@ -104,9 +104,9 @@ workflow CHIPSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -117,7 +117,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From bfc515e083db981285a148a12d57fc39868853dd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:46:51 +0100 Subject: [PATCH 333/538] Fix YAMLLint in pipeline --- .github/workflows/branch.yml | 1 - .github/workflows/ci.yml | 8 +-- .github/workflows/linting.yml | 1 - .github/workflows/linting_comment.yml | 2 - CHANGELOG.md | 12 ++-- README.md | 8 +-- assets/multiqc_config.yaml | 80 +++++++++++++-------------- 7 files changed, 54 insertions(+), 58 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 0615f2af9..df47787a7 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -43,4 +43,3 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b07666f23..a47a74e65 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,8 +53,8 @@ jobs: strategy: matrix: parameters: - - "--skip_trimming" - - "--skip_consensus_peaks" + - "--skip_trimming" + - "--skip_consensus_peaks" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -75,8 +75,8 @@ jobs: strategy: matrix: aligner: - - "bowtie2" - - "star" + - "bowtie2" + - "star" steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fda934c03..29088e5bb 100755 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -138,4 +138,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994b..04758f61e 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork @@ -27,4 +26,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - diff --git a/CHANGELOG.md b/CHANGELOG.md index b42ead40f..edff6dcd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,9 +33,9 @@ via the `--aligner` parameter | | `--save_unaligned` | | `--skip_diff_analysis` | `--skip_deseq2_qc` | -> **NB:** Parameter has been __updated__ if both old and new parameter information is present. -> **NB:** Parameter has been __added__ if just the new parameter information is present. -> **NB:** Parameter has been __removed__ if parameter information isn't present. +> __NB:__ Parameter has been __updated__ if both old and new parameter information is present. +> __NB:__ Parameter has been __added__ if just the new parameter information is present. +> __NB:__ Parameter has been __removed__ if parameter information isn't present. ### Software dependencies @@ -49,9 +49,9 @@ TODO: update all new dependencies | `deeptools` | 3.4.3 | 3.5.1 | | `samtools` | 1.10 | 1.13 | -> **NB:** Dependency has been __updated__ if both old and new version information is present. -> **NB:** Dependency has been __added__ if just the new version information is present. -> **NB:** Dependency has been __removed__ if version information isn't present. +> __NB:__ Dependency has been __updated__ if both old and new version information is present. +> __NB:__ Dependency has been __added__ if just the new version information is present. +> __NB:__ Dependency has been __removed__ if version information isn't present. ## [1.2.2] - 2021-04-22 diff --git a/README.md b/README.md index 54124fd8b..e31aa418b 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool * reads that are unmapped ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) * reads that map to multiple locations ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) * reads containing > 4 mismatches ([`BAMTools`](https://github.com/pezmaster31/bamtools)) - * reads that have an insert size > 2kb ([`BAMTools`](https://github.com/pezmaster31/bamtools); *paired-end only*) - * reads that map to different chromosomes ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); *paired-end only*) - * reads that arent in FR orientation ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); *paired-end only*) - * reads where only one read of the pair fails the above criteria ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); *paired-end only*) + * reads that have an insert size > 2kb ([`BAMTools`](https://github.com/pezmaster31/bamtools); _paired-end only_) + * reads that map to different chromosomes ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) + * reads that arent in FR orientation ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) + * reads where only one read of the pair fails the above criteria ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) 3. Alignment-level QC and estimation of library complexity ([`picard`](https://broadinstitute.github.io/picard/), [`Preseq`](http://smithlabresearch.org/software/preseq/)) 4. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html)) diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 689795628..5d17a2139 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -21,56 +21,56 @@ exclude_modules: module_order: - fastqc: - name: 'LIB: FastQC (raw)' - info: 'This section of the report shows FastQC results before adapter trimming for individual libraries.' - path_filters: - - './fastqc/*.zip' + name: 'LIB: FastQC (raw)' + info: 'This section of the report shows FastQC results before adapter trimming for individual libraries.' + path_filters: + - './fastqc/*.zip' - cutadapt: - name: 'LIB: cutadapt (trimmed)' - info: 'This section of the report shows the length of trimmed reads by cutadapt for individual libraries.' + name: 'LIB: cutadapt (trimmed)' + info: 'This section of the report shows the length of trimmed reads by cutadapt for individual libraries.' - fastqc: - name: 'LIB: FastQC (trimmed)' - info: 'This section of the report shows FastQC results after adapter trimming for individual libraries.' - path_filters: - - './trimgalore/fastqc/*.zip' + name: 'LIB: FastQC (trimmed)' + info: 'This section of the report shows FastQC results after adapter trimming for individual libraries.' + path_filters: + - './trimgalore/fastqc/*.zip' - samtools: - name: 'LIB: SAMTools' - info: 'This section of the report shows SAMTools results for individual libraries.' - path_filters: - - './alignment/library/*' + name: 'LIB: SAMTools' + info: 'This section of the report shows SAMTools results for individual libraries.' + path_filters: + - './alignment/library/*' - samtools: - name: 'MERGED LIB: SAMTools (unfiltered)' - info: 'This section of the report shows SAMTools results after merging libraries and before filtering.' - path_filters: - - './alignment/mergedLibrary/unfiltered/*.mLb.mkD.sorted.bam*' + name: 'MERGED LIB: SAMTools (unfiltered)' + info: 'This section of the report shows SAMTools results after merging libraries and before filtering.' + path_filters: + - './alignment/mergedLibrary/unfiltered/*.mLb.mkD.sorted.bam*' - picard: - name: 'MERGED LIB: Picard (unfiltered)' - info: 'This section of the report shows picard results after merging libraries and before filtering.' - path_filters: - - './alignment/mergedLibrary/unfiltered/picard_metrics/*' + name: 'MERGED LIB: Picard (unfiltered)' + info: 'This section of the report shows picard results after merging libraries and before filtering.' + path_filters: + - './alignment/mergedLibrary/unfiltered/picard_metrics/*' - preseq: - name: 'MERGED LIB: Preseq (unfiltered)' - info: 'This section of the report shows Preseq results after merging libraries and before filtering.' + name: 'MERGED LIB: Preseq (unfiltered)' + info: 'This section of the report shows Preseq results after merging libraries and before filtering.' - samtools: - name: 'MERGED LIB: SAMTools (filtered)' - info: 'This section of the report shows SAMTools results after merging libraries and after filtering.' - path_filters: - - './alignment/mergedLibrary/filtered/*.mLb.clN.sorted.bam*' + name: 'MERGED LIB: SAMTools (filtered)' + info: 'This section of the report shows SAMTools results after merging libraries and after filtering.' + path_filters: + - './alignment/mergedLibrary/filtered/*.mLb.clN.sorted.bam*' - picard: - name: 'MERGED LIB: Picard (filtered)' - info: 'This section of the report shows picard results after merging libraries and after filtering.' - path_filters: - - './alignment/mergedLibrary/filtered/picard_metrics/*' + name: 'MERGED LIB: Picard (filtered)' + info: 'This section of the report shows picard results after merging libraries and after filtering.' + path_filters: + - './alignment/mergedLibrary/filtered/picard_metrics/*' - deeptools: - name: 'MERGED LIB: deepTools' - anchor: 'mlib_deeptools' - info: 'This section of the report shows ChIP-seq QC plots generated by deepTools.' + name: 'MERGED LIB: deepTools' + anchor: 'mlib_deeptools' + info: 'This section of the report shows ChIP-seq QC plots generated by deepTools.' - featureCounts: - name: 'MERGED LIB: featureCounts' - anchor: 'mlib_featurecounts' - info: 'This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks.' - path_filters: - - './macs/consensus/*.summary' + name: 'MERGED LIB: featureCounts' + anchor: 'mlib_featurecounts' + info: 'This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks.' + path_filters: + - './macs/consensus/*.summary' report_section_order: peak_count: From 755cc3223145e60a41f483c9f5e3e255a3ddad7c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 2 Mar 2022 17:50:38 +0100 Subject: [PATCH 334/538] Fix nf-core linting --- .nf-core.yml | 7 ++++++- CHANGELOG.md | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 966dc6f35..aca9e11fa 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,7 +3,12 @@ lint: - .markdownlint.yml - assets/email_template.html - assets/email_template.txt - - lib/NfcoreTemplate.groovy - assets/multiqc_config.yaml + - lib/NfcoreTemplate.groovy + - lib/NfcoreSchema.groovy + - .github/ISSUE_TEMPLATE/bug_report.yml + - .github/workflows/branch.yml + - .github/workflows/linting_comment.yml + - .github/workflows/linting.yml repository_type: pipeline diff --git a/CHANGELOG.md b/CHANGELOG.md index edff6dcd5..98b5d4b01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -156,7 +156,7 @@ TODO: update all new dependencies ### `Fixed` -* **Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#Deprecated))** +* Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#Deprecated)) * [nf-core/atacseq#44](https://github.com/nf-core/atacseq/issues/44) - Output directory missing: macs2/consensus/deseq2 * [nf-core/atacseq#45](https://github.com/nf-core/atacseq/issues/45) - Wrong x-axis scale for the HOMER: Peak annotation Counts tab plot? * [nf-core/atacseq#46](https://github.com/nf-core/atacseq/issues/46) - Stage blacklist file in channel properly From 4bb1c93e6a91200b2ab612455751fc5c1506030d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 11:19:32 +0100 Subject: [PATCH 335/538] Reformat chr ids from mm10 to GRCm38 --- .../blacklists/v2.0/GRCm38-blacklist.v2.bed | 3435 +++++++++++++++++ 1 file changed, 3435 insertions(+) create mode 100644 assets/blacklists/v2.0/GRCm38-blacklist.v2.bed diff --git a/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed b/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed new file mode 100644 index 000000000..41007eb72 --- /dev/null +++ b/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed @@ -0,0 +1,3435 @@ +10 0 3135400 High Signal Region +10 3218900 3276600 Low Mappability +10 3576900 3627700 Low Mappability +10 4191100 4197600 Low Mappability +10 4613500 4615400 High Signal Region +10 4761300 4763900 High Signal Region +10 5080800 5096600 Low Mappability +10 5580100 5586600 Low Mappability +10 6281200 6286700 High Signal Region +10 6740200 6742100 High Signal Region +10 7396300 7429800 High Signal Region +10 7633600 7636600 Low Mappability +10 7889700 7897500 High Signal Region +10 8144900 8153000 High Signal Region +10 8264000 8269200 High Signal Region +10 8382400 8404400 High Signal Region +10 8599200 8606400 Low Mappability +10 10012200 10033400 High Signal Region +10 10566900 10593500 High Signal Region +10 11218400 11224800 Low Mappability +10 11351800 11406300 Low Mappability +10 11491200 11493100 High Signal Region +10 11612300 11642500 High Signal Region +10 11692500 11701300 Low Mappability +10 12266500 12273000 High Signal Region +10 12385800 12396000 High Signal Region +10 13401200 13403100 High Signal Region +10 14559900 14577100 High Signal Region +10 14646300 14664500 Low Mappability +10 14923800 14928300 High Signal Region +10 15047600 15083100 High Signal Region +10 15528600 15534200 High Signal Region +10 15567000 15641800 High Signal Region +10 16967500 16971600 High Signal Region +10 17499600 17501700 High Signal Region +10 18555500 18558100 High Signal Region +10 19427600 19429100 High Signal Region +10 19538800 19546100 Low Mappability +10 19772200 19801600 High Signal Region +10 20458900 20460800 High Signal Region +10 21208600 21216600 Low Mappability +10 21278500 21313500 High Signal Region +10 21642200 21649600 Low Mappability +10 21727800 21736400 Low Mappability +10 22031300 22063500 High Signal Region +10 22127200 22164500 High Signal Region +10 22186700 22290500 High Signal Region +10 22369100 22472300 High Signal Region +10 22683100 22690600 Low Mappability +10 22935900 22941800 High Signal Region +10 24687500 24691700 Low Mappability +10 25091400 25106900 Low Mappability +10 25622900 25629400 Low Mappability +10 25968400 25973400 Low Mappability +10 26641500 26662800 Low Mappability +10 27403200 27407600 High Signal Region +10 27904000 27909500 High Signal Region +10 28908500 28940600 High Signal Region +10 29243900 29249600 High Signal Region +10 29924300 29930700 Low Mappability +10 29954000 29971900 High Signal Region +10 30553000 30577100 High Signal Region +10 31054900 31095900 Low Mappability +10 31406500 31411100 High Signal Region +10 31750000 31757100 Low Mappability +10 31878400 31885800 High Signal Region +10 31980100 32000400 Low Mappability +10 32039700 32045000 High Signal Region +10 32176100 32182400 High Signal Region +10 32499200 32529900 High Signal Region +10 32816400 32857200 High Signal Region +10 33315300 33319800 High Signal Region +10 33492300 33508900 High Signal Region +10 33886600 33901100 Low Mappability +10 34739400 34749100 Low Mappability +10 35669300 35725500 High Signal Region +10 36130200 36135500 High Signal Region +10 36160700 36166700 High Signal Region +10 36594500 36597500 Low Mappability +10 36942200 36948800 Low Mappability +10 37186500 37189300 High Signal Region +10 37799700 37821400 High Signal Region +10 37964600 37970100 High Signal Region +10 38590100 38606100 High Signal Region +10 38637900 38644200 High Signal Region +10 38729400 38782700 High Signal Region +10 38933500 38956500 High Signal Region +10 39126700 39129400 High Signal Region +10 39760700 39764700 High Signal Region +10 41185700 41195800 High Signal Region +10 41840500 41859100 Low Mappability +10 43769400 43773800 High Signal Region +10 44206300 44254100 High Signal Region +10 45515000 45588000 Low Mappability +10 45624800 45628400 High Signal Region +10 46136500 46139300 High Signal Region +10 46468300 46472100 High Signal Region +10 46500500 46538800 High Signal Region +10 46789300 46812500 High Signal Region +10 46966700 47009000 High Signal Region +10 47048600 47074700 Low Mappability +10 47663600 47683500 High Signal Region +10 47743600 47758500 High Signal Region +10 47875400 47881600 High Signal Region +10 48032400 48058800 High Signal Region +10 48677400 48682800 High Signal Region +10 49823500 49842200 High Signal Region +10 50029200 50035300 High Signal Region +10 50109900 50115500 High Signal Region +10 50178500 50184800 High Signal Region +10 50253700 50296500 High Signal Region +10 50333400 50335300 High Signal Region +10 50524000 50553900 High Signal Region +10 51126200 51132900 High Signal Region +10 51436800 51448000 High Signal Region +10 51470300 51474900 High Signal Region +10 51882900 51888000 Low Mappability +10 52052600 52059000 Low Mappability +10 52089600 52148500 High Signal Region +10 52522600 52599800 High Signal Region +10 53073900 53081100 High Signal Region +10 53569600 53576000 Low Mappability +10 54216200 54222900 High Signal Region +10 54588800 54619900 Low Mappability +10 55080400 55090500 High Signal Region +10 55654500 55659600 High Signal Region +10 55715600 55751000 High Signal Region +10 55841700 55847900 High Signal Region +10 56250200 56293900 High Signal Region +10 56701000 56728000 High Signal Region +10 56894100 56897300 High Signal Region +10 57099200 57153200 High Signal Region +10 57239100 57245400 High Signal Region +10 57326900 57333900 High Signal Region +10 57434000 57456500 High Signal Region +10 57678600 57684900 High Signal Region +10 57862800 58240900 High Signal Region +10 58566200 58570900 High Signal Region +10 59381400 59396800 Low Mappability +10 59850500 59922300 Low Mappability +10 60444900 60446800 High Signal Region +10 60546600 60553100 Low Mappability +10 61373100 61375000 High Signal Region +10 63103900 63111200 Low Mappability +10 63508800 63519000 High Signal Region +10 63833800 63835000 High Signal Region +10 64418600 64420000 High Signal Region +10 65166300 65172600 High Signal Region +10 65450400 65477700 High Signal Region +10 65638900 65670200 High Signal Region +10 65938900 65956300 Low Mappability +10 66422900 66431000 High Signal Region +10 66662400 66678300 High Signal Region +10 69030100 69065800 High Signal Region +10 70657500 70668500 High Signal Region +10 70785400 70798600 Low Mappability +10 71012700 71019200 Low Mappability +10 71111600 71114200 Low Mappability +10 71510600 71637800 High Signal Region +10 71691300 71698600 Low Mappability +10 72292400 72314300 High Signal Region +10 72359200 72360700 High Signal Region +10 72493500 72499200 High Signal Region +10 72590700 72591900 High Signal Region +10 72690900 72709500 High Signal Region +10 73378200 73380100 High Signal Region +10 73576400 73601900 High Signal Region +10 74433300 74439500 High Signal Region +10 74655700 74672200 High Signal Region +10 74715300 74746600 High Signal Region +10 74857500 74888000 High Signal Region +10 76835100 76852400 High Signal Region +10 77950600 77979500 Low Mappability +10 78008300 78028800 Low Mappability +10 78637000 78696000 High Signal Region +10 78731500 78735800 High Signal Region +10 78803500 78823100 Low Mappability +10 79207800 79259400 High Signal Region +10 79314000 79354000 Low Mappability +10 80102300 80116000 High Signal Region +10 80928600 80996300 Low Mappability +10 81167600 81199400 High Signal Region +10 81600900 81997900 High Signal Region +10 82517500 82538800 High Signal Region +10 82571100 82575200 High Signal Region +10 82939800 82956300 High Signal Region +10 83386600 83392400 Low Mappability +10 83670800 83678100 Low Mappability +10 83768200 83792700 Low Mappability +10 84155900 84180800 Low Mappability +10 84436900 84473700 Low Mappability +10 84744500 84750100 Low Mappability +10 85413200 85419700 Low Mappability +10 85696600 85732800 High Signal Region +10 85840200 85872500 High Signal Region +10 86561700 86565700 High Signal Region +10 88628700 88658500 Low Mappability +10 88963900 88968200 Low Mappability +10 89398700 89400100 High Signal Region +10 89949700 89964500 High Signal Region +10 90249000 90255300 High Signal Region +10 90324500 90329800 Low Mappability +10 90471200 90474200 Low Mappability +10 91252200 91256900 High Signal Region +10 91928900 91944500 High Signal Region +10 92909200 92915800 High Signal Region +10 94362500 94369300 Low Mappability +10 94591500 94610000 High Signal Region +10 94871200 94873100 High Signal Region +10 96068700 96078800 High Signal Region +10 96157200 96162600 Low Mappability +10 96192400 96199800 Low Mappability +10 97320500 97329700 High Signal Region +10 97525500 97534200 Low Mappability +10 97755000 97761200 High Signal Region +10 97896600 97920300 High Signal Region +10 98337800 98343700 High Signal Region +10 98433100 98444100 High Signal Region +10 100310500 100395900 High Signal Region +10 102667700 102669600 High Signal Region +10 102859800 102861500 High Signal Region +10 103500200 103519100 High Signal Region +10 103547000 103548600 High Signal Region +10 103569600 103575200 High Signal Region +10 103600400 103684400 High Signal Region +10 103936700 103942500 High Signal Region +10 104380700 104382300 High Signal Region +10 104493600 104499800 High Signal Region +10 104539700 104562500 Low Mappability +10 104748100 104771500 High Signal Region +10 104819400 104862500 Low Mappability +10 104966900 105001700 Low Mappability +10 105177000 105181900 Low Mappability +10 105672500 105678000 Low Mappability +10 106166900 106235700 High Signal Region +10 106382800 106403000 High Signal Region +10 106427100 106453600 High Signal Region +10 106529600 106535200 Low Mappability +10 107125500 107136900 Low Mappability +10 107551800 107560700 High Signal Region +10 107845300 107863900 High Signal Region +10 107978900 108006700 Low Mappability +10 109212600 109216800 High Signal Region +10 109315100 109322400 Low Mappability +10 109941600 109948000 High Signal Region +10 110104900 110111300 Low Mappability +10 110504500 110516000 High Signal Region +10 110667700 110700900 Low Mappability +10 111217500 111219000 High Signal Region +10 112013700 112021700 High Signal Region +10 112053500 112058400 Low Mappability +10 112540600 112542100 High Signal Region +10 112587000 112611100 High Signal Region +10 112682400 112722100 Low Mappability +10 113722600 113729800 Low Mappability +10 114167300 114174900 High Signal Region +10 114736400 114738300 High Signal Region +10 114860600 114866900 High Signal Region +10 115641300 115643100 High Signal Region +10 116606200 116613400 Low Mappability +10 116762000 116764200 High Signal Region +10 116878000 116879900 High Signal Region +10 117476200 117491000 High Signal Region +10 118014300 118033200 High Signal Region +10 118054000 118076600 High Signal Region +10 118199900 118279700 Low Mappability +10 118910200 118917100 High Signal Region +10 118937400 118953000 Low Mappability +10 119698800 119701600 Low Mappability +10 120974800 120977500 High Signal Region +10 121136000 121143400 Low Mappability +10 121164700 121169300 Low Mappability +10 121566100 121580200 High Signal Region +10 121707800 121713500 High Signal Region +10 121762300 121769400 High Signal Region +10 122141100 122166000 High Signal Region +10 122346900 122371300 Low Mappability +10 122632400 122638000 High Signal Region +10 122832900 122839300 High Signal Region +10 123792900 123797100 High Signal Region +10 124412900 124433300 High Signal Region +10 124576300 124583500 Low Mappability +10 124605700 124611000 Low Mappability +10 124680500 124686200 Low Mappability +10 124760500 124788800 High Signal Region +10 125819500 125825700 High Signal Region +10 125869000 125871400 High Signal Region +10 126262200 126291600 Low Mappability +10 127779500 127797900 High Signal Region +10 129189500 129217200 High Signal Region +10 129388700 129419600 Low Mappability +10 129443000 129454800 High Signal Region +10 129734500 129736400 High Signal Region +10 129925300 129940600 Low Mappability +10 130039500 130052900 High Signal Region +10 130396900 130408000 High Signal Region +10 130542000 130694900 High Signal Region +11 0 3201000 High Signal Region +11 5167600 5182600 High Signal Region +11 5361500 5365400 Low Mappability +11 5552700 5558200 Low Mappability +11 6141300 6148700 Low Mappability +11 7489400 7492300 High Signal Region +11 7752300 7774500 Low Mappability +11 8058600 8083100 Low Mappability +11 8354900 8370700 High Signal Region +11 8907200 8936100 Low Mappability +11 9707900 9715100 Low Mappability +11 9807600 9814200 Low Mappability +11 10252000 10266800 High Signal Region +11 10760200 10770800 Low Mappability +11 11287200 11295100 High Signal Region +11 12129400 12163100 High Signal Region +11 12507200 12512700 Low Mappability +11 12561900 12569100 Low Mappability +11 12750500 12802700 High Signal Region +11 12856200 12863700 High Signal Region +11 12953900 12960700 Low Mappability +11 14896500 14922100 High Signal Region +11 15227600 15235000 Low Mappability +11 16022400 16029000 High Signal Region +11 16326500 16331700 High Signal Region +11 16418200 16419600 High Signal Region +11 16567100 16573100 High Signal Region +11 17401400 17407800 High Signal Region +11 18330900 18342700 High Signal Region +11 18773800 18780100 High Signal Region +11 19566100 19570600 Low Mappability +11 19788600 19809400 Low Mappability +11 20310000 20312000 High Signal Region +11 20377900 20380400 High Signal Region +11 22322000 22340700 Low Mappability +11 22395200 22432900 Low Mappability +11 22534700 22537000 Low Mappability +11 23218500 23258100 Low Mappability +11 23522600 23552900 High Signal Region +11 24527400 24529500 Low Mappability +11 25196800 25217300 High Signal Region +11 25796400 25802200 Low Mappability +11 26898500 26900500 High Signal Region +11 27525200 27541400 High Signal Region +11 28097200 28104500 Low Mappability +11 29064100 29129900 Low Mappability +11 29259900 29291300 High Signal Region +11 29586000 29592400 Low Mappability +11 30511100 30535400 High Signal Region +11 31343800 31345700 Low Mappability +11 33062300 33068800 Low Mappability +11 34541000 34683100 High Signal Region +11 37482400 37484900 High Signal Region +11 40230800 40248400 High Signal Region +11 40625500 40640300 Low Mappability +11 40796600 40860600 High Signal Region +11 40887700 40915600 High Signal Region +11 41631700 41633600 High Signal Region +11 43237300 43239300 Low Mappability +11 43286400 43329800 High Signal Region +11 43454800 43462300 Low Mappability +11 43659700 43682100 Low Mappability +11 45584200 45655700 Low Mappability +11 46412300 46415000 Low Mappability +11 46492800 46514400 Low Mappability +11 47847500 47860600 High Signal Region +11 48451800 48536100 High Signal Region +11 48929800 49060400 Low Mappability +11 50445100 50469600 High Signal Region +11 51437600 51456700 High Signal Region +11 51664900 51690400 Low Mappability +11 54135500 54141600 High Signal Region +11 54576500 54583300 Low Mappability +11 55240500 55248100 Low Mappability +11 56588500 56594500 High Signal Region +11 57301700 57303600 High Signal Region +11 60558900 60699000 Low Mappability +11 61407400 61427800 Low Mappability +11 61593700 61596500 Low Mappability +11 62879300 62901500 High Signal Region +11 63467600 63475000 Low Mappability +11 64568100 64574200 High Signal Region +11 64681700 64683600 Low Mappability +11 64791900 64827100 Low Mappability +11 65451700 65458800 Low Mappability +11 66629900 66634100 High Signal Region +11 66947700 66958600 Low Mappability +11 67866400 67872800 Low Mappability +11 70155800 70162400 Low Mappability +11 71505700 71512100 Low Mappability +11 71875200 71881700 Low Mappability +11 73436900 73439100 Low Mappability +11 74128800 74136200 Low Mappability +11 74199900 74226800 Low Mappability +11 74301700 74319600 High Signal Region +11 74540000 74548400 Low Mappability +11 74884300 74899000 Low Mappability +11 76828100 76868600 Low Mappability +11 77255000 77257100 Low Mappability +11 79845100 79847300 Low Mappability +11 79872400 79877100 Low Mappability +11 79917300 79920800 Low Mappability +11 81545400 81552800 Low Mappability +11 82123300 82144400 High Signal Region +11 82333900 82338400 Low Mappability +11 83050300 83093600 High Signal Region +11 83126000 83172300 Low Mappability +11 85046500 85067800 High Signal Region +11 85285400 85292700 High Signal Region +11 88910900 88917600 Low Mappability +11 88965900 88971900 High Signal Region +11 89080800 89101300 High Signal Region +11 90504000 90510500 High Signal Region +11 90829400 90835000 Low Mappability +11 90901700 90908400 Low Mappability +11 90958500 91026800 Low Mappability +11 91047200 91049300 Low Mappability +11 92099000 92108200 High Signal Region +11 93409300 93428900 High Signal Region +11 94622900 94629900 Low Mappability +11 96065000 96093900 High Signal Region +11 98586900 98673900 Low Mappability +11 99712600 99717300 High Signal Region +11 100662800 100669700 Low Mappability +11 101731800 101741400 High Signal Region +11 102992300 103049900 Low Mappability +11 104239000 104242600 Low Mappability +11 106028100 106037400 High Signal Region +11 106254800 106297600 High Signal Region +11 106943500 106950100 Low Mappability +11 107188200 107200400 High Signal Region +11 107281300 107283200 High Signal Region +11 108377600 108404500 Low Mappability +11 108649800 108655400 Low Mappability +11 109010700 109024400 High Signal Region +11 109998500 110024600 Low Mappability +11 110421300 110423200 High Signal Region +11 111182400 111189800 Low Mappability +11 111215500 111234900 Low Mappability +11 111353300 111360000 Low Mappability +11 111855400 111857100 High Signal Region +11 112010600 112016400 High Signal Region +11 114456300 114462800 Low Mappability +11 115014300 115046900 Low Mappability +11 115611200 115665700 High Signal Region +11 115754800 115766900 Low Mappability +11 116389300 116395200 Low Mappability +11 116742700 116792800 Low Mappability +11 117499800 117505100 Low Mappability +11 119299800 119340300 Low Mappability +11 120305300 120357300 Low Mappability +11 120515100 120644700 High Signal Region +11 121069800 121075100 High Signal Region +11 121203000 121207500 Low Mappability +11 121396100 121422700 Low Mappability +11 121611900 121614000 Low Mappability +11 121981400 122082500 High Signal Region +12 0 3070900 High Signal Region +12 3102800 3111000 High Signal Region +12 4110500 4112400 High Signal Region +12 4218500 4235300 High Signal Region +12 4751600 4790100 High Signal Region +12 5050300 5065400 High Signal Region +12 6514000 6525100 High Signal Region +12 6606500 6612600 High Signal Region +12 7447300 7449900 High Signal Region +12 7801900 7808600 High Signal Region +12 7925300 7939600 High Signal Region +12 8572000 8640600 High Signal Region +12 10693000 10704200 High Signal Region +12 10961300 11004600 High Signal Region +12 11187600 11194100 High Signal Region +12 11642900 11658000 High Signal Region +12 12092500 12097600 High Signal Region +12 14844600 14848200 High Signal Region +12 15026600 15032400 High Signal Region +12 15252700 15259600 High Signal Region +12 15866100 15871800 High Signal Region +12 16746900 16748800 High Signal Region +12 17116400 17129400 High Signal Region +12 17243500 17248500 High Signal Region +12 18340700 18354800 High Signal Region +12 18856500 18909700 High Signal Region +12 19312600 19413500 High Signal Region +12 19442600 19590100 High Signal Region +12 19627700 19633600 High Signal Region +12 19777500 19781600 High Signal Region +12 19879300 19901200 High Signal Region +12 19931800 19948600 High Signal Region +12 20031900 20205100 High Signal Region +12 20225600 20298300 High Signal Region +12 21914300 21916000 Low Mappability +12 21972100 21987900 High Signal Region +12 22021600 22680500 Low Mappability +12 22896100 22902300 High Signal Region +12 23140700 23225200 High Signal Region +12 23283500 24030600 High Signal Region +12 24295300 24365100 Low Mappability +12 24692300 24727100 High Signal Region +12 25591800 25595300 Low Mappability +12 25840400 25842100 High Signal Region +12 27556800 27592000 High Signal Region +12 28491400 28494000 High Signal Region +12 28954800 28964000 High Signal Region +12 29379500 29400800 High Signal Region +12 30965100 31016300 High Signal Region +12 32020400 32032500 Low Mappability +12 32217700 32219200 High Signal Region +12 33388100 33410100 Low Mappability +12 33748900 33771800 High Signal Region +12 33869500 33880600 High Signal Region +12 34056800 34074100 High Signal Region +12 34128700 34139700 High Signal Region +12 34623000 34629000 Low Mappability +12 35783900 35814400 High Signal Region +12 36099400 36107200 High Signal Region +12 36679100 36700200 Low Mappability +12 36952200 36957900 High Signal Region +12 38746900 38749300 High Signal Region +12 41363500 41385500 High Signal Region +12 41502600 41516100 High Signal Region +12 41860000 41870200 High Signal Region +12 42124500 42126300 High Signal Region +12 42437900 42443400 High Signal Region +12 42666800 42690800 High Signal Region +12 43335600 43349300 High Signal Region +12 43659100 43675300 High Signal Region +12 43953900 43986900 High Signal Region +12 44064500 44070600 High Signal Region +12 44765600 44795900 Low Mappability +12 45768700 45773700 High Signal Region +12 45949200 45962200 High Signal Region +12 46707000 46709200 High Signal Region +12 47027300 47039300 High Signal Region +12 47280500 47286800 High Signal Region +12 47328600 47331300 High Signal Region +12 47646800 47648300 High Signal Region +12 47833000 47834900 High Signal Region +12 47995600 47997600 High Signal Region +12 48842900 48849500 High Signal Region +12 49124800 49155700 High Signal Region +12 49245200 49272100 High Signal Region +12 49606200 49612000 High Signal Region +12 50784600 50789900 High Signal Region +12 51486000 51492000 High Signal Region +12 52157900 52176400 High Signal Region +12 52200400 52223200 High Signal Region +12 52579600 52581200 High Signal Region +12 52730000 52735400 Low Mappability +12 52906200 52952300 High Signal Region +12 54358500 54369200 High Signal Region +12 54705400 54743600 High Signal Region +12 55079600 55267300 Low Mappability +12 56104100 56110600 Low Mappability +12 56423700 56425000 High Signal Region +12 56747800 56752200 High Signal Region +12 56911000 56914000 High Signal Region +12 58294800 58339800 High Signal Region +12 58659000 58692900 High Signal Region +12 58858800 58867600 High Signal Region +12 59034800 59039300 Low Mappability +12 59112800 59124700 High Signal Region +12 59270000 59276700 High Signal Region +12 59297800 59323200 High Signal Region +12 59601000 59605800 High Signal Region +12 60069500 60084400 High Signal Region +12 60501200 60506200 High Signal Region +12 61044200 61045300 High Signal Region +12 61289100 61293700 High Signal Region +12 61892600 61896100 High Signal Region +12 61964500 61971300 High Signal Region +12 62035300 62090200 High Signal Region +12 62959800 62999500 High Signal Region +12 63041800 63048200 High Signal Region +12 63289500 63322400 High Signal Region +12 63728400 63745100 High Signal Region +12 63838200 63840100 High Signal Region +12 65260100 65292400 High Signal Region +12 65784500 65808300 High Signal Region +12 66103800 66127200 High Signal Region +12 67058200 67060800 High Signal Region +12 67433500 67459300 High Signal Region +12 67519200 67571500 High Signal Region +12 67828900 67836600 High Signal Region +12 68696500 68711800 High Signal Region +12 68745100 68750600 Low Mappability +12 69059900 69061300 High Signal Region +12 69653100 69657800 High Signal Region +12 70641800 70668400 Low Mappability +12 71077100 71093600 Low Mappability +12 71589600 71596000 High Signal Region +12 72203000 72209300 High Signal Region +12 72634700 72641300 High Signal Region +12 74620800 74642100 High Signal Region +12 74775800 74778200 High Signal Region +12 74803000 74805400 High Signal Region +12 74857200 74862700 High Signal Region +12 75241800 75248400 High Signal Region +12 77160700 77166000 High Signal Region +12 77383500 77411300 High Signal Region +12 77547200 77553900 High Signal Region +12 78260000 78373200 High Signal Region +12 78462400 78468500 High Signal Region +12 80417200 80449700 High Signal Region +12 80894500 80916600 High Signal Region +12 81550400 81555100 High Signal Region +12 81985400 82064000 Low Mappability +12 83093000 83094900 High Signal Region +12 85401000 85408600 High Signal Region +12 87585600 87771500 Low Mappability +12 87802800 88006400 High Signal Region +12 88119800 88169700 Low Mappability +12 88229600 88312400 High Signal Region +12 88493200 88516700 Low Mappability +12 91221400 91256000 High Signal Region +12 91439200 91475500 High Signal Region +12 92393800 92395800 Low Mappability +12 92839700 92892700 High Signal Region +12 93233800 93265600 High Signal Region +12 93564200 93590500 High Signal Region +12 93915400 93951600 High Signal Region +12 94268500 94273900 High Signal Region +12 94550200 94556100 High Signal Region +12 94694300 94713700 High Signal Region +12 95976100 96021400 High Signal Region +12 97038100 97062700 High Signal Region +12 97616600 97622400 High Signal Region +12 98173700 98176600 High Signal Region +12 99644200 99649400 High Signal Region +12 100490600 100492300 High Signal Region +12 100766900 100825300 High Signal Region +12 101427900 101453500 High Signal Region +12 101839700 101849500 High Signal Region +12 102892000 102893900 High Signal Region +12 103458100 103472900 High Signal Region +12 103776900 103813700 High Signal Region +12 105300300 105307000 High Signal Region +12 105435200 105437100 High Signal Region +12 105523800 105525700 High Signal Region +12 105628200 105631400 High Signal Region +12 108078800 108084400 High Signal Region +12 109901900 109909200 Low Mappability +12 110011800 110013700 High Signal Region +12 111388200 111417100 High Signal Region +12 112542200 112548700 High Signal Region +12 112775700 112830900 Low Mappability +12 113423500 113461500 High Signal Region +12 114584600 114597100 High Signal Region +12 114941500 114943900 High Signal Region +12 115725800 115748700 High Signal Region +12 116796500 116853000 High Signal Region +12 118341100 118358400 High Signal Region +12 118794900 118797400 High Signal Region +12 119013600 119018100 High Signal Region +12 119554500 119598100 High Signal Region +12 119659100 119670900 High Signal Region +12 120023800 120129000 High Signal Region +13 0 3038200 High Signal Region +13 3350900 3378900 High Signal Region +13 3404500 3438200 High Signal Region +13 3901100 3903100 Low Mappability +13 4762900 4770300 High Signal Region +13 5171400 5178400 High Signal Region +13 7601300 7604100 High Signal Region +13 7806100 7810900 High Signal Region +13 7893500 7899700 High Signal Region +13 9828900 9855900 High Signal Region +13 10174800 10181100 Low Mappability +13 12684400 13073000 High Signal Region +13 13752100 13774000 High Signal Region +13 13859900 13907900 High Signal Region +13 13981000 13983000 High Signal Region +13 14690600 14777500 Low Mappability +13 18932700 18963600 Low Mappability +13 21753300 21847200 Low Mappability +13 23620800 23647900 Low Mappability +13 25006900 25051500 High Signal Region +13 26440600 26448200 High Signal Region +13 27164600 27169100 High Signal Region +13 27875800 27888500 High Signal Region +13 29880700 29886800 Low Mappability +13 32889400 32895200 High Signal Region +13 33280200 33319400 High Signal Region +13 33350500 33491800 High Signal Region +13 35687400 35695700 High Signal Region +13 36794200 36797400 High Signal Region +13 37036700 37043900 High Signal Region +13 38633900 38659300 Low Mappability +13 42435800 42437700 High Signal Region +13 44868600 44870900 High Signal Region +13 46316600 46324000 High Signal Region +13 50633400 50741800 High Signal Region +13 53269000 53270900 High Signal Region +13 60675600 60682600 High Signal Region +13 62291600 62346800 Low Mappability +13 62409800 62426300 High Signal Region +13 63142500 63184600 High Signal Region +13 64878100 64885300 High Signal Region +13 65352900 66254300 Low Mappability +13 71381400 71387500 High Signal Region +13 74521500 74565200 High Signal Region +13 74684000 74712200 High Signal Region +13 76472300 76501300 High Signal Region +13 77304000 77305900 High Signal Region +13 77430600 77440000 High Signal Region +13 79563400 79570800 High Signal Region +13 80276300 80279400 High Signal Region +13 80489100 80491400 High Signal Region +13 83419000 83444300 High Signal Region +13 85125800 85145900 High Signal Region +13 86149500 86190600 High Signal Region +13 86502700 86511700 High Signal Region +13 88324900 88345400 High Signal Region +13 92599100 92625400 Low Mappability +13 93279200 93294800 High Signal Region +13 93650100 93651500 High Signal Region +13 93940300 93955300 High Signal Region +13 94016300 94020800 High Signal Region +13 97189600 97206100 High Signal Region +13 98418200 98420500 Low Mappability +13 99774000 99792100 High Signal Region +13 102381900 102387900 High Signal Region +13 105123500 105128600 Low Mappability +13 107839000 107860300 Low Mappability +13 110602100 110615800 High Signal Region +13 110729600 110745400 High Signal Region +13 111187700 111189500 High Signal Region +13 111499700 111515900 Low Mappability +13 112577200 112595200 High Signal Region +13 113171200 113173100 High Signal Region +13 113272600 113310700 High Signal Region +13 115498200 115504200 High Signal Region +13 115741300 115743200 Low Mappability +13 116191900 116193900 High Signal Region +13 119188100 119230700 High Signal Region +13 119486800 119618500 High Signal Region +13 119660800 119674100 High Signal Region +13 119899200 120147600 Low Mappability +13 120320500 120421600 High Signal Region +14 0 4323000 High Signal Region +14 4372100 4741400 High Signal Region +14 4762800 5839200 High Signal Region +14 5959700 6479300 High Signal Region +14 6500100 6791800 High Signal Region +14 6993800 7734200 High Signal Region +14 7869900 7872200 High Signal Region +14 8005200 8018900 High Signal Region +14 8285700 8287800 High Signal Region +14 8652200 8658800 Low Mappability +14 10086500 10118400 High Signal Region +14 10178800 10198700 Low Mappability +14 11046200 11050200 High Signal Region +14 12536700 12538700 High Signal Region +14 14333600 14340200 High Signal Region +14 15460700 15467200 High Signal Region +14 16907800 16914000 High Signal Region +14 16937900 16941100 High Signal Region +14 18487900 18494100 High Signal Region +14 19251900 19255700 High Signal Region +14 19277200 19279100 High Signal Region +14 19414800 19633500 High Signal Region +14 21360400 21366100 High Signal Region +14 21878600 21884500 High Signal Region +14 22542900 22570000 High Signal Region +14 22902100 22934800 High Signal Region +14 25875200 26292200 High Signal Region +14 26946900 26948800 High Signal Region +14 29001300 29003200 Low Mappability +14 29343900 29345700 Low Mappability +14 30748800 30754700 High Signal Region +14 31919300 31923900 High Signal Region +14 32115300 32120500 Low Mappability +14 33667700 33670000 Low Mappability +14 33981000 33987500 Low Mappability +14 35275300 35281500 High Signal Region +14 35709400 35722200 High Signal Region +14 36429100 36440100 High Signal Region +14 37229100 37260800 Low Mappability +14 37619400 37635200 Low Mappability +14 38086800 38116800 High Signal Region +14 38280800 38283100 High Signal Region +14 38455100 38462200 Low Mappability +14 39580800 39607200 High Signal Region +14 39731900 39737200 High Signal Region +14 39905500 39911100 High Signal Region +14 41053200 41061900 Low Mappability +14 41326900 43109000 High Signal Region +14 43132400 43668900 High Signal Region +14 43803900 43850200 High Signal Region +14 44149300 44152100 High Signal Region +14 44273800 44343500 High Signal Region +14 44514200 44516000 Low Mappability +14 45726200 45753500 High Signal Region +14 45811900 45813800 High Signal Region +14 46269900 46274300 High Signal Region +14 47609500 47630400 High Signal Region +14 50538900 50606000 High Signal Region +14 50626200 50638500 High Signal Region +14 51472000 51515400 High Signal Region +14 51730700 51768100 High Signal Region +14 51814200 51837200 High Signal Region +14 52821200 53035800 Low Mappability +14 53146700 53340000 High Signal Region +14 53475200 53479600 High Signal Region +14 53515600 53530500 Low Mappability +14 56447800 56455700 High Signal Region +14 56693100 56695000 High Signal Region +14 58052600 58059800 Low Mappability +14 58462700 58464600 Low Mappability +14 58657800 58659700 High Signal Region +14 58831400 58833300 High Signal Region +14 59250300 59270000 High Signal Region +14 59488900 59490800 High Signal Region +14 59980800 59995700 High Signal Region +14 60328300 60357300 High Signal Region +14 60960000 60961900 Low Mappability +14 61580500 61586700 High Signal Region +14 61855000 61856300 High Signal Region +14 62107300 62126200 High Signal Region +14 64290100 64292500 High Signal Region +14 64463300 64478500 Low Mappability +14 65128900 65135300 Low Mappability +14 66427000 66428400 High Signal Region +14 68232600 68278200 High Signal Region +14 69161000 69163400 High Signal Region +14 70974500 70975600 High Signal Region +14 71121300 71126700 High Signal Region +14 71449700 71453700 High Signal Region +14 71783600 71804000 High Signal Region +14 72900100 72921400 High Signal Region +14 73644600 73679900 High Signal Region +14 73847900 73861200 High Signal Region +14 74039300 74066900 High Signal Region +14 74124400 74138500 High Signal Region +14 74435600 74447800 High Signal Region +14 75425300 75440500 High Signal Region +14 78162300 78168200 High Signal Region +14 78401700 78403200 High Signal Region +14 79145300 79196400 High Signal Region +14 80148100 80150800 High Signal Region +14 80422800 80439400 High Signal Region +14 80622600 80627700 High Signal Region +14 81333200 81337500 High Signal Region +14 81495300 81519300 High Signal Region +14 82077600 82084900 High Signal Region +14 82846900 82867200 High Signal Region +14 82958700 82964100 High Signal Region +14 83292900 83306500 High Signal Region +14 83507000 83512600 High Signal Region +14 84354700 84409800 High Signal Region +14 84855100 84881600 Low Mappability +14 85177800 85203300 Low Mappability +14 85521200 85535200 Low Mappability +14 86198000 86200000 High Signal Region +14 86590500 86614400 High Signal Region +14 87354600 87373000 High Signal Region +14 87671400 87677500 High Signal Region +14 87790500 87852200 High Signal Region +14 88450200 88453600 High Signal Region +14 88478400 88480300 High Signal Region +14 90018300 90019500 High Signal Region +14 90294700 90301800 High Signal Region +14 90910200 90912200 High Signal Region +14 91415900 91418400 High Signal Region +14 91510800 91514900 High Signal Region +14 91672700 91694800 High Signal Region +14 91951700 91976400 High Signal Region +14 92032500 92040900 High Signal Region +14 92383600 92389900 High Signal Region +14 92411600 92432900 High Signal Region +14 92792600 92798500 High Signal Region +14 92921100 92953200 High Signal Region +14 93017600 93020400 High Signal Region +14 93355600 93360200 High Signal Region +14 94319700 94327000 High Signal Region +14 95561600 95567600 High Signal Region +14 96048000 96054300 High Signal Region +14 96093600 96116100 High Signal Region +14 97323800 97326500 High Signal Region +14 98226800 98237000 High Signal Region +14 98731900 98757200 High Signal Region +14 99207100 99208200 High Signal Region +14 99649700 99655500 High Signal Region +14 101076400 101098900 Low Mappability +14 101404800 101414800 High Signal Region +14 102548900 102565300 High Signal Region +14 102755800 102762600 High Signal Region +14 103300300 103302400 High Signal Region +14 103858600 103872900 High Signal Region +14 103999500 104025500 High Signal Region +14 104104800 104128100 Low Mappability +14 104704500 104716800 High Signal Region +14 105758200 105764900 Low Mappability +14 105911400 105978300 High Signal Region +14 106002700 106005700 Low Mappability +14 106301000 106352700 High Signal Region +14 106444800 106483100 Low Mappability +14 106722600 106728700 High Signal Region +14 106895300 106897000 Low Mappability +14 108115100 108174900 Low Mappability +14 108283900 108303500 High Signal Region +14 109675300 109681200 High Signal Region +14 109911500 109917800 High Signal Region +14 110057000 110108200 Low Mappability +14 110356200 110373800 High Signal Region +14 110492000 110495700 Low Mappability +14 110906100 110908200 High Signal Region +14 110992800 110994500 High Signal Region +14 111903200 111909800 High Signal Region +14 112074600 112092300 High Signal Region +14 112210500 112215800 High Signal Region +14 112285400 112291900 High Signal Region +14 112332800 112340000 Low Mappability +14 112517900 112519900 High Signal Region +14 112627800 112663100 Low Mappability +14 114505900 114512900 High Signal Region +14 114822000 114823900 Low Mappability +14 115109700 115117400 High Signal Region +14 115272500 115280200 High Signal Region +14 115379200 115385600 High Signal Region +14 115911100 115912900 High Signal Region +14 115958100 115965000 High Signal Region +14 116402700 116407700 High Signal Region +14 116817000 116822900 High Signal Region +14 117285800 117292800 High Signal Region +14 118144700 118168500 Low Mappability +14 119286000 119287900 High Signal Region +14 120180000 120202600 High Signal Region +14 120742600 120749700 High Signal Region +14 120777500 120802300 High Signal Region +14 121007000 121010900 Low Mappability +14 122502500 122534800 High Signal Region +14 123349400 123351300 Low Mappability +14 123412000 123452600 High Signal Region +14 123674600 123695600 High Signal Region +14 124334000 124340200 High Signal Region +14 124415600 124436400 High Signal Region +14 124491600 124497700 High Signal Region +14 124739500 124902200 High Signal Region +15 0 3125600 High Signal Region +15 3150900 3170400 High Signal Region +15 3313900 3336200 High Signal Region +15 3360500 3363700 High Signal Region +15 3538600 3551000 High Signal Region +15 3712200 3732700 High Signal Region +15 3793500 3823000 High Signal Region +15 4155900 4160900 High Signal Region +15 4278500 4284100 High Signal Region +15 4852000 4894600 Low Mappability +15 4980200 4987600 Low Mappability +15 5369000 5385500 High Signal Region +15 5681700 5690400 High Signal Region +15 5910000 5911700 High Signal Region +15 5993500 5995400 High Signal Region +15 6074100 6087100 Low Mappability +15 6192800 6200000 Low Mappability +15 6316000 6317900 High Signal Region +15 6510500 6539100 High Signal Region +15 6674800 6701400 High Signal Region +15 6801200 6808300 High Signal Region +15 7539900 7548600 Low Mappability +15 7800800 7803000 Low Mappability +15 7849400 7855600 High Signal Region +15 7904400 7929500 Low Mappability +15 8517500 8520400 High Signal Region +15 8548000 8576100 Low Mappability +15 8800200 8808700 High Signal Region +15 8985200 9054800 High Signal Region +15 9219000 9224900 Low Mappability +15 9293200 9333300 High Signal Region +15 9379300 9409100 High Signal Region +15 9437100 9443600 High Signal Region +15 9536500 9554100 High Signal Region +15 9992700 10045700 High Signal Region +15 10579600 10591500 Low Mappability +15 10753400 10810200 High Signal Region +15 10835200 10854700 Low Mappability +15 11921000 11933300 High Signal Region +15 12055800 12063200 Low Mappability +15 12526800 12531900 Low Mappability +15 12872000 12873900 High Signal Region +15 12932300 12934200 Low Mappability +15 13919500 13948300 High Signal Region +15 14414600 14439100 Low Mappability +15 14722200 14732900 High Signal Region +15 14873900 14902400 High Signal Region +15 15043600 15059700 High Signal Region +15 15525500 15551900 High Signal Region +15 16168200 16186400 High Signal Region +15 16303700 16309500 High Signal Region +15 16716400 16717500 High Signal Region +15 16901300 16907100 High Signal Region +15 16939800 16955100 Low Mappability +15 17139000 17169100 High Signal Region +15 17562100 17581400 High Signal Region +15 18314600 18325000 High Signal Region +15 19038400 19063800 Low Mappability +15 19402600 19405500 High Signal Region +15 19448100 19453900 High Signal Region +15 19557200 19578000 High Signal Region +15 19626800 19631800 High Signal Region +15 19678400 19685800 High Signal Region +15 20063000 20067500 High Signal Region +15 20155100 20170700 Low Mappability +15 20474900 20510100 High Signal Region +15 20531400 20537100 High Signal Region +15 20821500 20826700 High Signal Region +15 20972700 20978300 Low Mappability +15 21114000 21115900 High Signal Region +15 21262100 21268500 Low Mappability +15 21423200 21487200 High Signal Region +15 21655500 21657500 High Signal Region +15 21815500 21820800 High Signal Region +15 21853700 21892400 High Signal Region +15 22268700 22293500 High Signal Region +15 22751400 22756700 Low Mappability +15 22799300 22809700 Low Mappability +15 23240200 23255600 Low Mappability +15 23465300 23467800 High Signal Region +15 23886000 23887900 Low Mappability +15 23926900 23939700 High Signal Region +15 24309300 24325700 Low Mappability +15 24761100 24766700 High Signal Region +15 24801600 24837300 High Signal Region +15 24880900 24898600 Low Mappability +15 25051400 25065200 Low Mappability +15 26112700 26118900 High Signal Region +15 26905000 26919300 Low Mappability +15 27286100 27326800 High Signal Region +15 27384100 27390300 Low Mappability +15 27638200 27640500 High Signal Region +15 28564400 28578800 High Signal Region +15 29285200 29291500 Low Mappability +15 29347600 29395600 High Signal Region +15 29463900 29470200 High Signal Region +15 29969800 30001400 High Signal Region +15 30117700 30126200 High Signal Region +15 30441400 30448200 Low Mappability +15 30747900 30755000 High Signal Region +15 30996700 31016300 High Signal Region +15 31066700 31083700 High Signal Region +15 32783900 32806700 High Signal Region +15 32832800 32880300 High Signal Region +15 33138700 33140800 Low Mappability +15 33308700 33310800 Low Mappability +15 33444200 33454100 High Signal Region +15 33710200 33745700 High Signal Region +15 33781400 33849400 High Signal Region +15 33869800 33884700 High Signal Region +15 34494500 34502100 Low Mappability +15 34763100 34769400 High Signal Region +15 34987600 34992800 High Signal Region +15 35013200 35015400 High Signal Region +15 35366800 35406000 High Signal Region +15 36715200 36737400 High Signal Region +15 36966700 36997400 Low Mappability +15 37072900 37150800 Low Mappability +15 38462300 38484300 Low Mappability +15 39172900 39178300 Low Mappability +15 39335600 39348800 Low Mappability +15 39496100 39499100 High Signal Region +15 39695600 39718600 Low Mappability +15 40049600 40056000 High Signal Region +15 40086800 40101400 High Signal Region +15 41531400 41533200 High Signal Region +15 41890400 41896900 Low Mappability +15 42354900 42361100 High Signal Region +15 42925300 42942800 High Signal Region +15 43287300 43346300 High Signal Region +15 44469100 44476400 High Signal Region +15 44649000 44659600 Low Mappability +15 44723200 44728200 Low Mappability +15 44769700 44796100 High Signal Region +15 45005100 45009300 High Signal Region +15 45194600 45197100 High Signal Region +15 45577500 45590900 High Signal Region +15 45635600 45650500 High Signal Region +15 45774400 45779700 High Signal Region +15 45890700 45932500 High Signal Region +15 46255700 46257800 Low Mappability +15 46355600 46368400 High Signal Region +15 46502200 46506800 Low Mappability +15 46562500 46566200 Low Mappability +15 47232800 47256000 High Signal Region +15 47356500 47363700 Low Mappability +15 47539000 47555300 High Signal Region +15 48666900 48671000 High Signal Region +15 49283300 49299700 High Signal Region +15 49322600 49327300 Low Mappability +15 50426100 50442800 High Signal Region +15 50557700 50642600 High Signal Region +15 51113200 51117800 High Signal Region +15 51531900 51533900 Low Mappability +15 52125800 52131200 High Signal Region +15 52329800 52353100 High Signal Region +15 53039200 53044200 Low Mappability +15 53831000 53834900 High Signal Region +15 53870700 53872700 High Signal Region +15 53918300 53929500 High Signal Region +15 54180700 54211500 Low Mappability +15 56032900 56038200 High Signal Region +15 56175800 56183100 Low Mappability +15 56363800 56367900 High Signal Region +15 56400500 56402200 High Signal Region +15 56941600 56993500 High Signal Region +15 57279500 57285000 High Signal Region +15 57412200 57433600 High Signal Region +15 57889500 57913700 Low Mappability +15 58437200 58441100 High Signal Region +15 59421400 59435400 Low Mappability +15 59850100 59875200 Low Mappability +15 60153100 60203900 High Signal Region +15 60592000 60594300 Low Mappability +15 60931800 60986500 High Signal Region +15 61148600 61150700 High Signal Region +15 61903100 61915500 High Signal Region +15 62367600 62370100 High Signal Region +15 62553200 62555200 High Signal Region +15 62686500 62693700 High Signal Region +15 63329400 63346600 Low Mappability +15 63626000 63627900 High Signal Region +15 63791700 63796000 High Signal Region +15 63837600 63922800 High Signal Region +15 64591700 64598200 Low Mappability +15 64673500 64681900 High Signal Region +15 65115600 65123500 Low Mappability +15 65598500 65604500 High Signal Region +15 65666600 65673800 High Signal Region +15 65714400 65753500 High Signal Region +15 66045100 66065700 High Signal Region +15 66208300 66210200 High Signal Region +15 68136300 68137800 Low Mappability +15 68980000 68986500 High Signal Region +15 69122300 69164500 High Signal Region +15 69264900 69268800 High Signal Region +15 69390300 69409400 High Signal Region +15 69642000 69646000 High Signal Region +15 70083000 70088800 High Signal Region +15 70609300 70611100 High Signal Region +15 70896600 70914000 High Signal Region +15 71104600 71112200 High Signal Region +15 71206600 71237500 Low Mappability +15 73060200 73087900 Low Mappability +15 73373200 73378200 Low Mappability +15 73873000 73880400 Low Mappability +15 74360700 74368000 Low Mappability +15 74814300 74826700 Low Mappability +15 74992000 75104600 High Signal Region +15 75205600 75212800 Low Mappability +15 75298000 75299500 High Signal Region +15 75437000 75440500 High Signal Region +15 75523600 75529700 High Signal Region +15 76102000 76106500 High Signal Region +15 76559900 76577900 Low Mappability +15 76964600 76971400 Low Mappability +15 77336200 77439100 High Signal Region +15 77718300 77735600 Low Mappability +15 77895000 77934800 Low Mappability +15 79685000 79775700 Low Mappability +15 79869700 79892600 Low Mappability +15 79974400 79978400 Low Mappability +15 80232400 80267100 High Signal Region +15 81145400 81152000 Low Mappability +15 81492300 81523600 High Signal Region +15 82338000 82368000 Low Mappability +15 82590700 82608900 Low Mappability +15 82675500 82677200 High Signal Region +15 83172100 83202200 Low Mappability +15 84746600 84753000 Low Mappability +15 85176800 85196600 Low Mappability +15 85541200 85543100 High Signal Region +15 86193800 86196100 High Signal Region +15 86312100 86326400 Low Mappability +15 87293900 87301200 Low Mappability +15 87967000 87969000 High Signal Region +15 88779400 88783900 Low Mappability +15 88974800 88976800 High Signal Region +15 89597900 89621300 High Signal Region +15 89808500 89809700 High Signal Region +15 89943000 89982000 Low Mappability +15 90636400 90643600 Low Mappability +15 91115900 91134800 Low Mappability +15 91419400 91422200 High Signal Region +15 91720600 91723200 Low Mappability +15 91905900 91911200 High Signal Region +15 92470100 92475100 Low Mappability +15 92613700 92618300 Low Mappability +15 92722600 92730100 Low Mappability +15 92796100 92820000 Low Mappability +15 93044100 93062000 High Signal Region +15 93467800 93469500 Low Mappability +15 93867100 93873600 High Signal Region +15 94088400 94124100 High Signal Region +15 94150500 94156800 High Signal Region +15 94373000 94379600 High Signal Region +15 95087600 95092100 High Signal Region +15 95306000 95312300 High Signal Region +15 95729500 95756400 High Signal Region +15 96551700 96559500 Low Mappability +15 96977900 96983600 Low Mappability +15 97082100 97084300 High Signal Region +15 97472900 97487400 Low Mappability +15 99168800 99171900 High Signal Region +15 99552100 99553900 Low Mappability +15 100331500 100339800 Low Mappability +15 100360000 100379700 Low Mappability +15 100541700 100617400 Low Mappability +15 101655700 101662100 High Signal Region +15 102596800 102603200 High Signal Region +15 103271900 103277100 High Signal Region +15 103406700 103418500 High Signal Region +15 103606700 103611400 High Signal Region +15 103814500 104043600 High Signal Region +16 0 3427800 High Signal Region +16 3450300 3519700 Low Mappability +16 4300400 4366800 Low Mappability +16 4585000 4591300 High Signal Region +16 5708200 5710200 High Signal Region +16 7460800 7463600 High Signal Region +16 7937100 7958400 Low Mappability +16 8256700 8286200 High Signal Region +16 9577100 9579600 Low Mappability +16 10631200 10633200 Low Mappability +16 10974100 11013900 High Signal Region +16 11134600 11145200 High Signal Region +16 11248000 11249900 Low Mappability +16 11679900 11687500 Low Mappability +16 12327300 12345900 Low Mappability +16 12417900 12423400 High Signal Region +16 12829200 12831000 High Signal Region +16 12976200 12981700 Low Mappability +16 13087700 13107000 Low Mappability +16 13903200 13925900 Low Mappability +16 14316200 14341200 Low Mappability +16 15502700 15510100 Low Mappability +16 15741400 15757700 Low Mappability +16 17199900 17236000 High Signal Region +16 17751400 17761300 High Signal Region +16 17910400 17955500 High Signal Region +16 18532200 18534200 High Signal Region +16 18957500 18979200 High Signal Region +16 19334200 19375100 High Signal Region +16 19581200 19602400 Low Mappability +16 19711900 19748700 High Signal Region +16 19928600 19946300 Low Mappability +16 22923300 22929100 High Signal Region +16 26419300 26421200 High Signal Region +16 26808500 26814800 High Signal Region +16 27071900 27087600 High Signal Region +16 27212200 27218300 High Signal Region +16 28170600 28197500 High Signal Region +16 30828600 30830500 High Signal Region +16 31223800 31234300 Low Mappability +16 31339100 31358900 High Signal Region +16 31818700 31825200 Low Mappability +16 32147700 32153500 Low Mappability +16 32489700 32520100 Low Mappability +16 32579100 32598800 Low Mappability +16 33847200 33852600 Low Mappability +16 34581100 34591200 Low Mappability +16 34742000 34744000 High Signal Region +16 35980600 35983300 High Signal Region +16 36764900 36770500 Low Mappability +16 38714200 38721600 Low Mappability +16 39563700 39568200 High Signal Region +16 41270700 41273100 High Signal Region +16 42657300 42661200 High Signal Region +16 42773100 42779900 High Signal Region +16 42931600 42950000 High Signal Region +16 43764000 43771600 Low Mappability +16 44040400 44063900 Low Mappability +16 44709800 44726400 Low Mappability +16 44920200 44950700 Low Mappability +16 45292600 45293900 High Signal Region +16 45352100 45354000 High Signal Region +16 46364600 46369100 High Signal Region +16 47099100 47147300 High Signal Region +16 47552300 47564100 Low Mappability +16 48579900 48581300 Low Mappability +16 49024900 49031400 Low Mappability +16 49148400 49150300 Low Mappability +16 49447700 49489300 High Signal Region +16 50084900 50101400 Low Mappability +16 50909100 50926800 Low Mappability +16 51087100 51094300 Low Mappability +16 51945800 51980200 High Signal Region +16 53412000 53428900 High Signal Region +16 53571500 53595400 Low Mappability +16 54298300 54307600 Low Mappability +16 54861600 54869000 High Signal Region +16 54959000 54965200 High Signal Region +16 55647800 55681600 Low Mappability +16 56038100 56065100 Low Mappability +16 56988400 57008400 High Signal Region +16 57085500 57095800 High Signal Region +16 57390200 57392600 High Signal Region +16 57792800 57811700 Low Mappability +16 58310800 58343000 High Signal Region +16 58632300 58670400 Low Mappability +16 59121800 59129100 Low Mappability +16 59310100 59378100 High Signal Region +16 60921200 60970900 High Signal Region +16 61312500 61325200 Low Mappability +16 62564300 62599200 High Signal Region +16 62875900 62880400 Low Mappability +16 63114300 63151200 High Signal Region +16 63301300 63313600 High Signal Region +16 64384600 64425600 High Signal Region +16 65176900 65181400 Low Mappability +16 66229300 66247600 Low Mappability +16 67328200 67334700 High Signal Region +16 68272300 68274300 High Signal Region +16 70542300 70558300 Low Mappability +16 70633900 70639700 Low Mappability +16 70892400 70898400 High Signal Region +16 70976900 70982900 High Signal Region +16 71687000 71691500 Low Mappability +16 72019300 72023900 Low Mappability +16 72056200 72062100 High Signal Region +16 72724800 72730900 Low Mappability +16 73656700 73688600 High Signal Region +16 74771800 74781500 Low Mappability +16 76057000 76065000 Low Mappability +16 76487100 76519600 High Signal Region +16 76988700 76991600 High Signal Region +16 77116900 77121900 Low Mappability +16 78977100 79013600 High Signal Region +16 79368600 79376000 Low Mappability +16 79782000 79786700 High Signal Region +16 79943000 79948600 Low Mappability +16 80269400 80309700 Low Mappability +16 81071700 81079200 Low Mappability +16 81779900 81782000 High Signal Region +16 81859300 81865600 High Signal Region +16 82079700 82099600 High Signal Region +16 82237800 82243200 Low Mappability +16 82828200 82845600 High Signal Region +16 83077300 83081800 High Signal Region +16 83360600 83368000 Low Mappability +16 84260500 84283300 High Signal Region +16 84380600 84407600 High Signal Region +16 84440100 84446000 High Signal Region +16 85671600 85673000 High Signal Region +16 85713500 85720100 High Signal Region +16 86333000 86354300 High Signal Region +16 86539500 86570300 High Signal Region +16 86819800 86822100 High Signal Region +16 87055400 87060300 High Signal Region +16 87287400 87302500 Low Mappability +16 87372300 87391700 Low Mappability +16 88022900 88029900 High Signal Region +16 88790600 88797900 Low Mappability +16 88957900 88967800 High Signal Region +16 89145200 89196100 Low Mappability +16 89431800 89448400 Low Mappability +16 89636000 89642900 High Signal Region +16 89877500 89879700 High Signal Region +16 90056200 90072300 Low Mappability +16 90341200 90350100 Low Mappability +16 91533700 91551800 High Signal Region +16 92254500 92259400 Low Mappability +16 93581500 93622800 High Signal Region +16 93685800 93711200 High Signal Region +16 93785700 93790200 High Signal Region +16 93991400 93997900 High Signal Region +16 94258100 94282000 Low Mappability +16 95782000 95788900 High Signal Region +16 95991000 96010400 Low Mappability +16 97996400 98207700 High Signal Region +17 0 3039300 High Signal Region +17 3075400 3085400 High Signal Region +17 3378900 3380800 High Signal Region +17 5863900 5885100 High Signal Region +17 6219100 6717500 High Signal Region +17 6877300 7037900 High Signal Region +17 7302300 7430200 High Signal Region +17 7615300 7617200 High Signal Region +17 7950200 8052300 High Signal Region +17 11097900 11105100 High Signal Region +17 13018500 13469100 High Signal Region +17 13492200 13555800 High Signal Region +17 13584800 13656200 High Signal Region +17 14961200 15054300 Low Mappability +17 20859400 20865200 High Signal Region +17 23426600 23537000 High Signal Region +17 23730600 23732500 High Signal Region +17 24095300 24097300 High Signal Region +17 29101000 29109600 High Signal Region +17 31569500 31571400 High Signal Region +17 35367400 35480300 Low Mappability +17 36230300 36232500 High Signal Region +17 38498200 38500800 High Signal Region +17 39842000 39849700 High Signal Region +17 40422500 40427000 High Signal Region +17 50569500 50571400 High Signal Region +17 53034300 53056100 High Signal Region +17 53151500 53153500 High Signal Region +17 53807400 53820300 High Signal Region +17 54112300 54134200 High Signal Region +17 57368400 57399900 High Signal Region +17 62736600 62738500 High Signal Region +17 66798500 66800400 High Signal Region +17 67740400 67742500 High Signal Region +17 70962200 70964800 High Signal Region +17 82975900 82991600 High Signal Region +17 84458800 84464500 Low Mappability +17 85264100 85266000 High Signal Region +17 93017000 93047400 High Signal Region +17 93623500 93646700 High Signal Region +17 94886200 94987200 High Signal Region +18 0 3063700 High Signal Region +18 3085500 3142600 High Signal Region +18 3568100 3570100 Low Mappability +18 3619800 3652100 Low Mappability +18 3779700 3785600 High Signal Region +18 3815100 3819300 High Signal Region +18 3873200 3889000 High Signal Region +18 4194700 4199900 High Signal Region +18 4456700 4504600 High Signal Region +18 4658000 4664400 Low Mappability +18 4695200 4701800 Low Mappability +18 5499400 5502000 Low Mappability +18 5895900 5900400 Low Mappability +18 6043700 6046600 Low Mappability +18 6343100 6376400 Low Mappability +18 6663800 6669200 High Signal Region +18 6796200 6803600 Low Mappability +18 6853600 6868500 Low Mappability +18 7032800 7035500 High Signal Region +18 7527500 7534800 High Signal Region +18 7782300 7798400 High Signal Region +18 7998000 8018800 Low Mappability +18 8164900 8183000 High Signal Region +18 8243000 8271800 High Signal Region +18 8292000 8294000 Low Mappability +18 8721900 8747000 High Signal Region +18 9095200 9127300 High Signal Region +18 9248500 9269200 Low Mappability +18 9420000 9426100 High Signal Region +18 9890700 9915900 High Signal Region +18 11168900 11192100 High Signal Region +18 11247700 11293200 High Signal Region +18 11626000 11648000 Low Mappability +18 12945100 12956300 High Signal Region +18 13030000 13041900 High Signal Region +18 13161400 13180500 High Signal Region +18 13241200 13251100 Low Mappability +18 13296400 13300000 High Signal Region +18 13513200 13517200 High Signal Region +18 14732900 14739600 Low Mappability +18 15225500 15232800 High Signal Region +18 15366900 15382100 High Signal Region +18 15695100 15737600 High Signal Region +18 16283100 16288900 High Signal Region +18 16988600 17013600 Low Mappability +18 17116100 17119600 High Signal Region +18 17346100 17352400 High Signal Region +18 17425100 17480600 High Signal Region +18 17513300 17517900 High Signal Region +18 17541300 17559000 High Signal Region +18 17593300 17598500 High Signal Region +18 17938300 17951600 Low Mappability +18 18816600 18823800 High Signal Region +18 18916300 18917900 High Signal Region +18 18976900 18992400 High Signal Region +18 19240600 19289100 High Signal Region +18 19345800 19352600 Low Mappability +18 19430400 19448100 High Signal Region +18 19679600 19681600 Low Mappability +18 19812100 19836500 High Signal Region +18 20352500 20369800 High Signal Region +18 20896200 20910000 Low Mappability +18 21261800 21268900 Low Mappability +18 21528200 21541600 High Signal Region +18 21943200 21945200 Low Mappability +18 22297400 22304000 High Signal Region +18 23186200 23215300 High Signal Region +18 25045100 25047300 High Signal Region +18 25253000 25259500 High Signal Region +18 25905600 25928600 High Signal Region +18 26003000 26008100 Low Mappability +18 26829800 26837100 Low Mappability +18 26998200 27005600 Low Mappability +18 27062000 27068200 High Signal Region +18 28151300 28167300 High Signal Region +18 28441700 28446600 Low Mappability +18 28482900 28484900 High Signal Region +18 28814100 28816900 High Signal Region +18 28960100 28966000 Low Mappability +18 29014700 29022000 High Signal Region +18 29557800 29559800 High Signal Region +18 29713000 29719200 High Signal Region +18 31281100 31294300 High Signal Region +18 32758400 32793400 High Signal Region +18 33212800 33221500 Low Mappability +18 33275100 33331000 High Signal Region +18 33697400 33722600 Low Mappability +18 34083600 34087300 Low Mappability +18 34397100 34409800 Low Mappability +18 35318500 35320400 Low Mappability +18 36454200 36494600 Low Mappability +18 36981500 36988700 Low Mappability +18 37031800 37045800 High Signal Region +18 37364600 37398900 Low Mappability +18 37545500 37645000 High Signal Region +18 39598600 39604900 High Signal Region +18 40306300 40309300 High Signal Region +18 40708500 40713600 Low Mappability +18 41381600 41387500 High Signal Region +18 41465300 41471500 High Signal Region +18 41820100 41826100 High Signal Region +18 41960600 41966100 High Signal Region +18 42556800 42559800 High Signal Region +18 42913000 42914900 High Signal Region +18 43335500 43337900 High Signal Region +18 43889500 43900400 High Signal Region +18 44033600 44050200 High Signal Region +18 44228000 44263100 High Signal Region +18 44291600 44295600 High Signal Region +18 44361600 44380500 High Signal Region +18 44873100 44875100 Low Mappability +18 44981000 45032700 High Signal Region +18 45131400 45133400 High Signal Region +18 45291700 45314300 Low Mappability +18 45357300 45364700 Low Mappability +18 45392200 45397700 High Signal Region +18 45506800 45513400 High Signal Region +18 45998300 46038000 Low Mappability +18 46082000 46101400 High Signal Region +18 46439100 46444100 Low Mappability +18 46791400 46793400 Low Mappability +18 47648600 47654100 Low Mappability +18 47769900 47783100 Low Mappability +18 48009500 48011400 High Signal Region +18 48208100 48220300 High Signal Region +18 48705800 48713100 Low Mappability +18 48831300 48836100 High Signal Region +18 49387700 49397800 High Signal Region +18 49669200 49695600 High Signal Region +18 50253400 50268700 High Signal Region +18 50632100 50700200 Low Mappability +18 51072000 51077600 Low Mappability +18 51658600 51698300 High Signal Region +18 52020200 52059300 High Signal Region +18 52256200 52262200 High Signal Region +18 52378900 52395000 Low Mappability +18 52876200 52883200 High Signal Region +18 53828800 53839900 Low Mappability +18 53869300 53876600 Low Mappability +18 54023900 54030000 High Signal Region +18 54288100 54335900 Low Mappability +18 54698000 54707800 High Signal Region +18 55222400 55224400 Low Mappability +18 55311000 55321100 Low Mappability +18 55414800 55436200 Low Mappability +18 55899800 55901700 High Signal Region +18 55938500 55954100 High Signal Region +18 56273000 56276900 High Signal Region +18 56302600 56304500 High Signal Region +18 56341200 56346000 High Signal Region +18 56826900 56830200 Low Mappability +18 57560400 57562500 Low Mappability +18 58992700 58999300 Low Mappability +18 59496300 59511000 High Signal Region +18 59929900 59955000 High Signal Region +18 60042400 60044400 Low Mappability +18 60206100 60238100 High Signal Region +18 60525200 60533800 Low Mappability +18 62237400 62247700 High Signal Region +18 62273700 62292800 Low Mappability +18 62752700 62755100 High Signal Region +18 64131300 64132600 High Signal Region +18 64448400 64454900 Low Mappability +18 65103100 65105000 High Signal Region +18 65385700 65405100 Low Mappability +18 65492400 65494700 Low Mappability +18 65716300 65719400 Low Mappability +18 66543200 66548900 High Signal Region +18 66750000 66759900 Low Mappability +18 66881200 66887200 High Signal Region +18 68381300 68387800 High Signal Region +18 68412100 68425800 Low Mappability +18 68461300 68489000 High Signal Region +18 68691100 68693200 High Signal Region +18 69759300 69761300 Low Mappability +18 70489500 70515400 High Signal Region +18 70775600 70791900 High Signal Region +18 70842100 70849200 Low Mappability +18 71032500 71038800 High Signal Region +18 71139200 71145200 High Signal Region +18 71208200 71211300 Low Mappability +18 71267000 71273300 Low Mappability +18 71630400 71641100 Low Mappability +18 72753900 72794900 High Signal Region +18 72987900 72991000 High Signal Region +18 73259600 73264100 Low Mappability +18 74553100 74566400 High Signal Region +18 74745500 74758500 Low Mappability +18 74880300 74882000 High Signal Region +18 76177900 76184300 Low Mappability +18 76579700 76586300 Low Mappability +18 77264400 77271000 High Signal Region +18 78197300 78199300 High Signal Region +18 78407800 78428500 Low Mappability +18 78861400 78867900 High Signal Region +18 80021700 80028900 Low Mappability +18 80307500 80309600 Low Mappability +18 80455500 80518400 Low Mappability +18 81299700 81306200 Low Mappability +18 82052100 82058200 High Signal Region +18 82160100 82227800 High Signal Region +18 82319500 82339900 High Signal Region +18 82692900 82717900 Low Mappability +18 83171100 83178400 Low Mappability +18 83700500 83707900 Low Mappability +18 84828700 84833000 High Signal Region +18 85035000 85080600 High Signal Region +18 85105800 85112200 High Signal Region +18 85169900 85175900 High Signal Region +18 85377800 85382800 Low Mappability +18 85697000 85699200 High Signal Region +18 85783600 85789900 High Signal Region +18 86508300 86510200 High Signal Region +18 86560600 86586100 High Signal Region +18 86828500 86849500 High Signal Region +18 87006300 87009800 High Signal Region +18 87141500 87161200 High Signal Region +18 87568300 87574300 High Signal Region +18 88149300 88155400 High Signal Region +18 89030400 89036400 High Signal Region +18 89615900 89650500 Low Mappability +18 89983200 89989700 Low Mappability +18 90055500 90092500 High Signal Region +18 90113400 90125400 Low Mappability +18 90464100 90501300 High Signal Region +18 90601200 90702600 High Signal Region +19 0 3140800 High Signal Region +19 3161400 3248600 High Signal Region +19 4061100 4066400 Low Mappability +19 6581000 6594300 High Signal Region +19 7713600 7774800 High Signal Region +19 7810700 7843900 Low Mappability +19 8203200 8285500 Low Mappability +19 9250500 9357700 High Signal Region +19 9502000 9565000 Low Mappability +19 9745800 9803300 High Signal Region +19 9823500 9837700 High Signal Region +19 10507900 10510300 High Signal Region +19 10954500 10960300 Low Mappability +19 11199700 11239800 High Signal Region +19 12447200 12454600 Low Mappability +19 13203500 13216400 High Signal Region +19 13330600 13357100 High Signal Region +19 13685000 13693300 High Signal Region +19 13760500 13777200 High Signal Region +19 15256700 15263000 High Signal Region +19 15433400 15438100 High Signal Region +19 15711800 15719800 High Signal Region +19 15839200 15846600 High Signal Region +19 15956500 15958500 Low Mappability +19 16670500 16673100 High Signal Region +19 18358000 18364200 High Signal Region +19 18532700 18535600 High Signal Region +19 19132200 19161200 High Signal Region +19 19509000 19514900 High Signal Region +19 19870300 19876900 Low Mappability +19 20080700 20081800 High Signal Region +19 20140700 20144100 Low Mappability +19 20288200 20297900 Low Mappability +19 20455400 20462700 Low Mappability +19 20839700 20843900 Low Mappability +19 21218200 21243800 High Signal Region +19 21532400 21534400 Low Mappability +19 22644100 22651700 High Signal Region +19 22722400 22728400 Low Mappability +19 23356500 23358400 High Signal Region +19 23739200 23754000 High Signal Region +19 24040300 24042300 Low Mappability +19 24911900 24919200 High Signal Region +19 25741800 25770100 High Signal Region +19 25917500 25920000 High Signal Region +19 27751400 27758100 High Signal Region +19 28149600 28156600 High Signal Region +19 30907400 30908700 High Signal Region +19 30963600 30968000 Low Mappability +19 31722800 31735800 High Signal Region +19 32203200 32211600 Low Mappability +19 32441800 32449100 Low Mappability +19 32822000 32824000 Low Mappability +19 33439100 33446100 Low Mappability +19 33864200 33877900 High Signal Region +19 33949100 33958200 High Signal Region +19 34131200 34161200 Low Mappability +19 34581900 34613000 High Signal Region +19 35076400 35079800 High Signal Region +19 35650200 35673500 High Signal Region +19 36702500 36723400 High Signal Region +19 37298800 37301800 Low Mappability +19 37617300 37624600 Low Mappability +19 38490200 38495300 Low Mappability +19 39078100 39079500 High Signal Region +19 39106700 39156300 High Signal Region +19 39244700 39270400 High Signal Region +19 39331700 39424100 High Signal Region +19 39599900 39607200 Low Mappability +19 39658700 39695100 Low Mappability +19 40020400 40026800 Low Mappability +19 40094100 40153300 High Signal Region +19 40328500 40330000 Low Mappability +19 41142700 41150000 Low Mappability +19 41424200 41473100 Low Mappability +19 42346000 42350500 Low Mappability +19 42647600 42649700 Low Mappability +19 43118800 43124600 High Signal Region +19 43236000 43238000 Low Mappability +19 43321500 43323700 High Signal Region +19 44145700 44171700 Low Mappability +19 44218500 44225000 Low Mappability +19 44862100 44864300 High Signal Region +19 45004900 45096500 Low Mappability +19 45182300 45190200 High Signal Region +19 45649000 45661500 High Signal Region +19 45699400 45706300 Low Mappability +19 47590300 47602700 Low Mappability +19 48484600 48496700 High Signal Region +19 48743800 48746300 High Signal Region +19 50107900 50114400 Low Mappability +19 50309700 50311600 High Signal Region +19 50754100 50755900 Low Mappability +19 50828900 50835600 High Signal Region +19 51649700 51655800 High Signal Region +19 51949000 51955700 Low Mappability +19 52303100 52309700 Low Mappability +19 52927900 52932300 Low Mappability +19 52967800 52991100 Low Mappability +19 53522200 53527100 High Signal Region +19 53767900 53777800 High Signal Region +19 54235200 54236600 High Signal Region +19 54884700 54936800 High Signal Region +19 54994900 55001700 Low Mappability +19 55976700 55984000 Low Mappability +19 56248700 56259000 Low Mappability +19 56846600 56849100 High Signal Region +19 57514200 57520700 Low Mappability +19 57634000 57635600 Low Mappability +19 57827000 57832700 Low Mappability +19 58012500 58014600 Low Mappability +19 58112400 58114500 High Signal Region +19 58481300 58483200 High Signal Region +19 59221800 59240400 High Signal Region +19 59763100 59779900 High Signal Region +19 60082500 60089900 High Signal Region +19 60906900 60934000 High Signal Region +19 61162600 61174300 Low Mappability +19 61197700 61268100 High Signal Region +19 61330300 61431500 High Signal Region +1 8628600 8719100 High Signal Region +1 12038300 12041400 High Signal Region +1 14958600 14992600 High Signal Region +1 17466800 17479900 High Signal Region +1 18872500 18901300 High Signal Region +1 19175300 19177200 High Signal Region +1 22555000 22556900 High Signal Region +1 24610600 24617100 High Signal Region +1 24683100 24685100 High Signal Region +1 26685100 26689200 High Signal Region +1 43776800 43779800 High Signal Region +1 44198000 44202200 High Signal Region +1 46701700 46756600 High Signal Region +1 48880600 48882500 High Signal Region +1 56119600 56143500 High Signal Region +1 56772200 56783300 High Signal Region +1 58613000 58614900 High Signal Region +1 63629100 63631600 High Signal Region +1 69455800 69457800 High Signal Region +1 71078400 71085500 High Signal Region +1 71250600 71256700 High Signal Region +1 73549100 73555300 High Signal Region +1 73832600 73902400 High Signal Region +1 78572900 78575400 High Signal Region +1 84953500 85663200 High Signal Region +1 88209400 88311700 High Signal Region +1 94093800 94109400 High Signal Region +1 95451000 95452900 High Signal Region +1 95783900 95789700 High Signal Region +1 95810200 95851700 High Signal Region +1 100737900 100760500 High Signal Region +1 101040100 101046300 High Signal Region +1 102627300 102644300 High Signal Region +1 105226800 105230700 High Signal Region +1 110170400 110188300 High Signal Region +1 113602700 113604800 High Signal Region +1 114557300 114579100 High Signal Region +1 114643300 114660500 High Signal Region +1 115447500 115482800 High Signal Region +1 122356200 122358200 High Signal Region +1 133593600 133611300 High Signal Region +1 142651800 142672300 High Signal Region +1 145444500 145449100 High Signal Region +1 146120600 146128200 High Signal Region +1 151181600 151212000 High Signal Region +1 165862800 165864700 Low Mappability +1 171033000 171112400 High Signal Region +1 172716800 172738200 High Signal Region +1 172878700 172885100 High Signal Region +1 178538700 178540700 High Signal Region +1 181742100 181752400 High Signal Region +1 182628900 182630800 High Signal Region +1 183298200 183300500 High Signal Region +1 190299400 190304600 High Signal Region +1 192453100 192471800 High Signal Region +1 193226900 193228800 High Signal Region +1 195239800 195257400 High Signal Region +1 195278100 195280200 High Signal Region +1 195320700 195471900 High Signal Region +2 0 3086300 High Signal Region +2 3474900 3488800 High Signal Region +2 3932700 3939100 Low Mappability +2 3963500 3986100 High Signal Region +2 4515100 4518600 High Signal Region +2 4600600 4620300 High Signal Region +2 5378100 5394600 High Signal Region +2 5545900 5561600 High Signal Region +2 6078200 6095300 High Signal Region +2 6773100 6777500 Low Mappability +2 6832200 6846700 High Signal Region +2 7137500 7139600 High Signal Region +2 7404000 7458100 High Signal Region +2 7571700 7609800 High Signal Region +2 7656300 7669700 Low Mappability +2 7752800 7758500 High Signal Region +2 8034600 8042900 High Signal Region +2 8266200 8275600 High Signal Region +2 8528400 8535700 High Signal Region +2 8938000 8940500 High Signal Region +2 9212600 9219300 High Signal Region +2 10177100 10183400 Low Mappability +2 10483200 10501500 Low Mappability +2 10677000 10697600 Low Mappability +2 12605500 12668600 High Signal Region +2 13824000 13869200 High Signal Region +2 13946300 13948900 High Signal Region +2 14014100 14035300 High Signal Region +2 14359100 14386600 High Signal Region +2 14919000 14924500 High Signal Region +2 15301300 15334700 High Signal Region +2 15430100 15435500 Low Mappability +2 15575900 15602800 High Signal Region +2 15716700 15721100 High Signal Region +2 15768300 15770500 High Signal Region +2 16192400 16198500 High Signal Region +2 16320200 16326500 Low Mappability +2 16762800 16787000 High Signal Region +2 17383200 17385100 High Signal Region +2 17612500 17654500 Low Mappability +2 17747200 17753000 High Signal Region +2 19209900 19212900 High Signal Region +2 19498400 19510300 High Signal Region +2 19707900 19712200 High Signal Region +2 20038500 20067400 Low Mappability +2 20426800 20433300 Low Mappability +2 20898900 20901100 High Signal Region +2 21062600 21082200 Low Mappability +2 22049700 22087700 High Signal Region +2 22137300 22165500 High Signal Region +2 22389900 22608700 High Signal Region +2 22737300 22745800 High Signal Region +2 23009600 23015000 Low Mappability +2 23274600 23304900 High Signal Region +2 23693700 23707900 High Signal Region +2 24193300 24199000 High Signal Region +2 26333100 26351900 Low Mappability +2 26759100 26763600 High Signal Region +2 26998200 27004400 Low Mappability +2 28183200 28205000 High Signal Region +2 30204600 30239600 Low Mappability +2 32381300 32488200 Low Mappability +2 33933000 33935300 High Signal Region +2 34049900 34051800 High Signal Region +2 34903900 34935900 Low Mappability +2 35090800 35109900 High Signal Region +2 35505000 35526700 Low Mappability +2 36008600 36019300 Low Mappability +2 36401900 36413100 High Signal Region +2 36508600 36515200 High Signal Region +2 36542800 36549100 High Signal Region +2 36761000 36766500 High Signal Region +2 36951900 36970700 High Signal Region +2 37156900 37185900 High Signal Region +2 37339700 37359400 Low Mappability +2 38564700 38566600 Low Mappability +2 39225400 39293200 High Signal Region +2 39360600 39367900 Low Mappability +2 39517800 39534800 High Signal Region +2 39778500 39785700 Low Mappability +2 39887500 39915800 High Signal Region +2 40131200 40240800 High Signal Region +2 40262500 40268600 High Signal Region +2 40766400 40794000 High Signal Region +2 41059500 41070200 Low Mappability +2 41168700 41171400 High Signal Region +2 41692800 41694800 High Signal Region +2 41744300 41751600 Low Mappability +2 41775100 41781500 High Signal Region +2 41895300 41897200 High Signal Region +2 42044500 42051600 High Signal Region +2 42200300 42240700 High Signal Region +2 42950100 42956600 High Signal Region +2 43347900 43356400 High Signal Region +2 44936600 44942400 High Signal Region +2 46224800 46226700 High Signal Region +2 46343100 46348100 Low Mappability +2 46574200 46579600 Low Mappability +2 47008600 47023500 High Signal Region +2 47196300 47199300 High Signal Region +2 47533600 47642600 High Signal Region +2 47942200 47943800 High Signal Region +2 48483000 48491000 Low Mappability +2 50543200 50545500 High Signal Region +2 50679600 50686800 Low Mappability +2 51552600 51555600 High Signal Region +2 51750900 51756000 High Signal Region +2 51881600 51890600 Low Mappability +2 51945900 51948400 High Signal Region +2 52695900 52718600 High Signal Region +2 52786800 52796300 High Signal Region +2 53317700 53321600 Low Mappability +2 53347800 53367000 High Signal Region +2 53633400 53642900 High Signal Region +2 53745700 53799800 High Signal Region +2 54252600 54258500 High Signal Region +2 54698000 54747900 High Signal Region +2 54862600 54895300 High Signal Region +2 55197500 55216400 High Signal Region +2 55308300 55353700 High Signal Region +2 55823800 55829000 High Signal Region +2 55860200 55874300 Low Mappability +2 55942000 55947800 High Signal Region +2 56192800 56194600 High Signal Region +2 56298700 56304900 High Signal Region +2 56465200 56471900 High Signal Region +2 56834300 56879100 High Signal Region +2 56988500 56990600 Low Mappability +2 57166400 57172900 Low Mappability +2 57214400 57223500 Low Mappability +2 57417400 57446500 High Signal Region +2 57628500 57633800 High Signal Region +2 57726600 57728500 High Signal Region +2 58212900 58263100 High Signal Region +2 58648300 58691900 High Signal Region +2 58881200 58902500 High Signal Region +2 59971300 59972800 Low Mappability +2 61038200 61042700 High Signal Region +2 61959600 61965300 High Signal Region +2 62022900 62040100 High Signal Region +2 62861100 62867200 High Signal Region +2 63297300 63302700 Low Mappability +2 63368100 63403900 High Signal Region +2 63462300 63483800 High Signal Region +2 63641200 63654600 High Signal Region +2 63718200 63725400 High Signal Region +2 63838100 63845300 Low Mappability +2 64309200 64319600 High Signal Region +2 64608400 64633400 Low Mappability +2 64698700 64703300 High Signal Region +2 65592500 65602200 High Signal Region +2 65737700 65781500 Low Mappability +2 66721600 66750400 High Signal Region +2 66845100 66852300 High Signal Region +2 67408400 67414500 High Signal Region +2 67939700 67946000 High Signal Region +2 68770400 68776700 High Signal Region +2 68917800 68924100 Low Mappability +2 69353900 69356600 High Signal Region +2 70263100 70270000 Low Mappability +2 70880100 70892900 High Signal Region +2 71054700 71071300 Low Mappability +2 71942000 71949500 Low Mappability +2 72270200 72275700 Low Mappability +2 73867000 73868900 High Signal Region +2 74364300 74402600 Low Mappability +2 74437600 74444900 Low Mappability +2 75499500 75504600 High Signal Region +2 77224000 77230500 Low Mappability +2 78318000 78339500 High Signal Region +2 79437700 79441900 High Signal Region +2 79936500 79943700 High Signal Region +2 80119000 80121500 High Signal Region +2 80220600 80257700 Low Mappability +2 80795600 80838700 High Signal Region +2 80879000 80880200 High Signal Region +2 80956500 81006000 High Signal Region +2 81069000 81075100 High Signal Region +2 81639400 81644800 High Signal Region +2 81750800 81756800 High Signal Region +2 81790000 81795900 High Signal Region +2 82329800 82340100 High Signal Region +2 82673800 82679900 High Signal Region +2 82714300 82728500 High Signal Region +2 82783900 82789500 High Signal Region +2 82868800 82887900 High Signal Region +2 82916300 82936800 High Signal Region +2 83120100 83146100 High Signal Region +2 83185100 83193200 High Signal Region +2 83325900 83328200 High Signal Region +2 83413500 83587500 High Signal Region +2 83865600 83893100 High Signal Region +2 83931600 83995800 Low Mappability +2 84080900 84085600 High Signal Region +2 84505000 84510500 Low Mappability +2 84532500 84534600 Low Mappability +2 84564800 84576000 Low Mappability +2 85685600 85701800 Low Mappability +2 85874000 85896300 High Signal Region +2 86018200 86021700 Low Mappability +2 86303400 86317700 High Signal Region +2 86339600 86346900 Low Mappability +2 86612700 86617500 High Signal Region +2 87381000 87382800 High Signal Region +2 87875700 87941300 High Signal Region +2 88167400 88212600 High Signal Region +2 88776200 88780800 High Signal Region +2 89206600 89277100 Low Mappability +2 89345700 89350400 High Signal Region +2 89761200 89775100 High Signal Region +2 89856400 89920100 High Signal Region +2 90127200 90132700 High Signal Region +2 90157100 90249100 High Signal Region +2 90273200 90279100 High Signal Region +2 90309300 90396100 High Signal Region +2 92092600 92094700 High Signal Region +2 92167200 92169100 High Signal Region +2 93824700 93850200 High Signal Region +2 94602800 94607800 Low Mappability +2 94633900 94656500 High Signal Region +2 94801000 94809400 Low Mappability +2 94852800 94891200 High Signal Region +2 95064700 95093500 Low Mappability +2 95148000 95167800 High Signal Region +2 95215900 95320600 High Signal Region +2 95414700 95420600 High Signal Region +2 95536400 95538400 Low Mappability +2 95647900 95654300 High Signal Region +2 95794500 95799200 High Signal Region +2 95929300 95934400 High Signal Region +2 96191400 96208900 High Signal Region +2 96547800 96566800 Low Mappability +2 96954700 96977300 High Signal Region +2 97021000 97034600 High Signal Region +2 97308000 97327600 High Signal Region +2 97671600 97686300 High Signal Region +2 97760700 97765800 High Signal Region +2 97872400 97958200 High Signal Region +2 98361700 98449600 High Signal Region +2 98659400 98668200 High Signal Region +2 98796500 98801900 High Signal Region +2 99020000 99057500 High Signal Region +2 99300200 99320300 High Signal Region +2 99944600 99970200 High Signal Region +2 100112000 100114300 High Signal Region +2 100223900 100238300 High Signal Region +2 100418400 100777900 Low Mappability +2 101127200 101153600 Low Mappability +2 101313100 101350600 High Signal Region +2 102828400 102830400 High Signal Region +2 103231300 103232300 High Signal Region +2 103852300 103872800 High Signal Region +2 104684900 104697300 High Signal Region +2 105249300 105259000 High Signal Region +2 105539300 105563200 Low Mappability +2 105825900 105865100 High Signal Region +2 106555100 106569300 High Signal Region +2 107134100 107140900 High Signal Region +2 107593900 107601200 Low Mappability +2 107710100 107712400 High Signal Region +2 108608600 108614000 High Signal Region +2 108945100 108972800 High Signal Region +2 109629400 109636000 High Signal Region +2 110016800 110025500 High Signal Region +2 110091100 110128700 High Signal Region +2 110157100 110163300 High Signal Region +2 110292700 110294600 High Signal Region +2 110545800 110583400 High Signal Region +2 110752400 110780100 High Signal Region +2 111007400 111018600 High Signal Region +2 111042000 111046600 High Signal Region +2 111172700 111179800 High Signal Region +2 111281500 111287900 Low Mappability +2 111545600 111553300 Low Mappability +2 111716900 111722900 High Signal Region +2 111844900 111866400 High Signal Region +2 111890900 111898900 High Signal Region +2 112053900 112086000 High Signal Region +2 112319700 112326200 Low Mappability +2 112522900 112570500 High Signal Region +2 112602800 112605100 High Signal Region +2 112701400 112707900 High Signal Region +2 113095800 113102400 Low Mappability +2 113330900 113333000 Low Mappability +2 113518400 113524900 Low Mappability +2 113564300 113565700 High Signal Region +2 113659300 113673200 High Signal Region +2 114180800 114187400 Low Mappability +2 114242400 114244000 High Signal Region +2 114469200 114504000 High Signal Region +2 116454300 116524000 High Signal Region +2 117829600 117835500 High Signal Region +2 118017700 118020200 High Signal Region +2 120608600 120650200 High Signal Region +2 120810300 120821000 High Signal Region +2 121435600 121523600 High Signal Region +2 121938800 121957600 High Signal Region +2 122680400 122683200 High Signal Region +2 123288000 123294300 Low Mappability +2 123496800 123525300 High Signal Region +2 123785200 123790700 High Signal Region +2 124002700 124004600 High Signal Region +2 124798800 124835800 High Signal Region +2 125625000 125635900 Low Mappability +2 126217400 126263800 High Signal Region +2 126445400 126447400 Low Mappability +2 126964900 126972100 Low Mappability +2 127720400 127734000 Low Mappability +2 128050800 128053200 High Signal Region +2 128480400 128486900 Low Mappability +2 128772500 128774500 Low Mappability +2 129499400 129523400 High Signal Region +2 129602700 129613700 Low Mappability +2 131791800 131793800 High Signal Region +2 131908300 131931100 Low Mappability +2 131963900 131983700 High Signal Region +2 132885700 132890400 High Signal Region +2 132952400 132954500 Low Mappability +2 133053200 133083400 High Signal Region +2 133239300 133261800 High Signal Region +2 133934000 133937500 High Signal Region +2 134560100 134577900 High Signal Region +2 134661800 134673000 High Signal Region +2 134746600 134751100 High Signal Region +2 135146800 135151900 High Signal Region +2 135987600 135989700 High Signal Region +2 136234300 136286800 Low Mappability +2 137028200 137037000 High Signal Region +2 137345900 137369900 High Signal Region +2 137394500 137405600 High Signal Region +2 137640000 137642300 High Signal Region +2 137890200 137895000 High Signal Region +2 138035000 138056400 Low Mappability +2 138573700 138580400 High Signal Region +2 138621500 138624200 High Signal Region +2 138833600 138853100 High Signal Region +2 138904300 138935000 High Signal Region +2 139433200 139476200 High Signal Region +2 140345800 140352400 Low Mappability +2 142197000 142204400 Low Mappability +2 142464200 142483300 Low Mappability +2 142789100 142795600 Low Mappability +2 143275500 143290300 High Signal Region +2 143725900 143764700 High Signal Region +2 144627800 144636700 Low Mappability +2 144975200 144977100 High Signal Region +2 145001300 145003200 High Signal Region +2 145118300 145146300 Low Mappability +2 145236800 145242600 Low Mappability +2 145625100 145630800 Low Mappability +2 145732700 145734600 High Signal Region +2 146135700 146176900 High Signal Region +2 146995700 147013200 Low Mappability +2 147675300 147677500 High Signal Region +2 147864800 147871300 High Signal Region +2 147918800 147925100 Low Mappability +2 148410500 148416000 Low Mappability +2 148459900 148473800 High Signal Region +2 148612700 148620200 Low Mappability +2 148939300 148984200 High Signal Region +2 149049800 149056000 High Signal Region +2 149269400 149292700 High Signal Region +2 150413500 150452500 High Signal Region +2 150728300 150749700 Low Mappability +2 151029700 151385300 High Signal Region +2 151408800 151496700 High Signal Region +2 152157000 152159000 Low Mappability +2 152206800 152227500 High Signal Region +2 152263400 152269900 Low Mappability +2 153674800 153693100 Low Mappability +2 154174200 154180000 High Signal Region +2 154353800 154359700 Low Mappability +2 155016300 155051500 High Signal Region +2 155235400 155258100 High Signal Region +2 156185100 156214400 Low Mappability +2 157566000 157655300 Low Mappability +2 157833200 157835600 High Signal Region +2 158286300 158292800 High Signal Region +2 159455200 159469500 High Signal Region +2 160620300 160638500 High Signal Region +2 161368800 161376200 High Signal Region +2 161984900 161990900 High Signal Region +2 162369100 162376700 High Signal Region +2 162594500 162602700 High Signal Region +2 162843800 162847600 High Signal Region +2 163519100 163533100 Low Mappability +2 163644500 163655100 High Signal Region +2 163788900 163796100 Low Mappability +2 163833800 163849200 Low Mappability +2 163958100 163963000 Low Mappability +2 164201000 164202700 High Signal Region +2 165477300 165529900 Low Mappability +2 165675100 165679500 Low Mappability +2 165848700 165953000 Low Mappability +2 166530600 166535100 Low Mappability +2 166780500 166832200 Low Mappability +2 167269400 167291100 High Signal Region +2 167407900 167423000 Low Mappability +2 170315100 170320000 High Signal Region +2 170503800 170509800 High Signal Region +2 171814300 171816700 High Signal Region +2 171912800 171932200 Low Mappability +2 172007100 172014300 High Signal Region +2 172743600 172751100 Low Mappability +2 173098700 173101000 Low Mappability +2 173706700 173708800 High Signal Region +2 174961800 176745500 High Signal Region +2 176767100 177166600 High Signal Region +2 177232400 177490200 High Signal Region +2 177526700 177841000 High Signal Region +2 178775000 178794400 High Signal Region +2 180025600 180093500 Low Mappability +2 181169900 181188000 Low Mappability +2 181285900 181298800 High Signal Region +2 181739800 181745800 High Signal Region +2 181885000 181933400 High Signal Region +2 182003800 182113200 High Signal Region +3 0 3052500 High Signal Region +3 3084100 3098300 High Signal Region +3 3123200 3150800 High Signal Region +3 3443300 3493700 High Signal Region +3 4698100 4725500 High Signal Region +3 5517700 5525000 Low Mappability +3 5859400 5863500 High Signal Region +3 6115100 6117100 High Signal Region +3 6601900 6627400 High Signal Region +3 6900700 6916400 High Signal Region +3 6941100 6946600 High Signal Region +3 7178300 7223900 High Signal Region +3 7477600 7482500 High Signal Region +3 7910300 7916600 High Signal Region +3 8225200 8247500 High Signal Region +3 8574000 8589900 High Signal Region +3 8815300 8838700 High Signal Region +3 9091900 9096900 Low Mappability +3 9777500 9778500 High Signal Region +3 9904100 9910700 High Signal Region +3 9952100 9967100 High Signal Region +3 10453800 10464500 High Signal Region +3 10961700 10971700 High Signal Region +3 11050200 11070500 High Signal Region +3 11120700 11143300 High Signal Region +3 11518700 11524700 High Signal Region +3 11779200 11806000 High Signal Region +3 11933500 11938400 High Signal Region +3 11961500 11973100 High Signal Region +3 12107500 12131400 High Signal Region +3 12221200 12262000 High Signal Region +3 12336000 12339700 High Signal Region +3 12814500 12857800 Low Mappability +3 12906200 12907300 High Signal Region +3 13219400 13222800 High Signal Region +3 13821100 13826600 Low Mappability +3 13965800 13972000 High Signal Region +3 14272100 14336300 High Signal Region +3 14449600 14478500 High Signal Region +3 14593200 14597400 High Signal Region +3 14668900 14744700 High Signal Region +3 15028800 15045100 High Signal Region +3 15079500 15087400 High Signal Region +3 15451600 15872400 High Signal Region +3 15964200 15967200 High Signal Region +3 16351400 16357100 High Signal Region +3 16626000 16633700 High Signal Region +3 16995700 17021400 High Signal Region +3 17419700 17447600 High Signal Region +3 17679600 17682100 High Signal Region +3 17954200 17997400 High Signal Region +3 18379800 18395100 High Signal Region +3 18432100 18437500 High Signal Region +3 18966900 18983600 High Signal Region +3 19357600 19359300 High Signal Region +3 19594900 19601100 High Signal Region +3 19917700 19940300 High Signal Region +3 21247500 21250200 High Signal Region +3 21317800 21324600 High Signal Region +3 21383700 21389000 High Signal Region +3 21512900 21519300 High Signal Region +3 21661800 21663700 Low Mappability +3 21685300 21709500 High Signal Region +3 22069200 22070500 High Signal Region +3 22240800 22250100 High Signal Region +3 22362000 22377000 High Signal Region +3 22517600 22521100 High Signal Region +3 22612100 22759200 High Signal Region +3 22933800 23015000 High Signal Region +3 23077300 23099800 High Signal Region +3 23173700 23180900 Low Mappability +3 23302200 23321100 High Signal Region +3 23353500 23360000 High Signal Region +3 23463300 23468200 High Signal Region +3 23579500 23584900 High Signal Region +3 23841700 23843800 Low Mappability +3 24624400 24627900 High Signal Region +3 24655200 24661300 High Signal Region +3 25210800 25228800 Low Mappability +3 25277500 25310400 High Signal Region +3 25416900 25421600 Low Mappability +3 25472900 25478900 High Signal Region +3 26089400 26113400 High Signal Region +3 26346800 26369700 High Signal Region +3 26724600 26737000 High Signal Region +3 26944500 26950800 High Signal Region +3 27010100 27023300 High Signal Region +3 27309300 27319800 Low Mappability +3 28198300 28201300 Low Mappability +3 28513900 28535500 High Signal Region +3 28983500 29014200 High Signal Region +3 29461500 29492300 High Signal Region +3 29675900 29680600 High Signal Region +3 31176300 31188900 Low Mappability +3 31340700 31364500 Low Mappability +3 31651800 31680100 High Signal Region +3 31819800 31826900 High Signal Region +3 33696500 33708400 High Signal Region +3 33768300 33798500 High Signal Region +3 33930000 33948800 Low Mappability +3 34516200 34518200 High Signal Region +3 35285400 35292700 High Signal Region +3 35707000 35713500 Low Mappability +3 35743300 35744600 High Signal Region +3 36106500 36109400 High Signal Region +3 36285400 36291100 High Signal Region +3 36847300 36853900 High Signal Region +3 39026800 39030900 High Signal Region +3 39183300 39189800 High Signal Region +3 40151300 40157700 High Signal Region +3 40347600 40352600 High Signal Region +3 40549300 40651700 High Signal Region +3 41871900 41887800 High Signal Region +3 41993500 41999500 High Signal Region +3 42170000 42187300 High Signal Region +3 42682100 42722800 High Signal Region +3 42820200 42827400 High Signal Region +3 43108100 43197200 High Signal Region +3 43466400 43492100 High Signal Region +3 43538900 43557700 High Signal Region +3 44185900 44191600 High Signal Region +3 44241200 44260000 High Signal Region +3 44401500 44407500 High Signal Region +3 44559600 44565200 High Signal Region +3 44884400 44890700 High Signal Region +3 45579200 45591900 High Signal Region +3 45848500 45863400 Low Mappability +3 45986000 45990700 High Signal Region +3 46141000 46148200 High Signal Region +3 46338200 46340300 Low Mappability +3 46735000 46741900 High Signal Region +3 46795400 46805400 High Signal Region +3 46910900 46936200 High Signal Region +3 47592800 47598000 High Signal Region +3 47798300 47799600 High Signal Region +3 47966600 47968700 High Signal Region +3 48437800 48462000 High Signal Region +3 49443600 49482800 High Signal Region +3 49727200 49734400 High Signal Region +3 50464900 50474400 High Signal Region +3 50763700 50814900 High Signal Region +3 50957300 50963000 High Signal Region +3 51233600 51245400 Low Mappability +3 51616000 51623700 Low Mappability +3 51765300 51784900 High Signal Region +3 52230000 52233400 High Signal Region +3 53426900 53431000 High Signal Region +3 54849100 54874300 Low Mappability +3 56069700 56075200 High Signal Region +3 56210900 56215900 High Signal Region +3 56513600 56576700 High Signal Region +3 56903800 56943000 High Signal Region +3 57059400 57070200 High Signal Region +3 57349800 57379400 High Signal Region +3 58051100 58081600 Low Mappability +3 59370700 59412200 High Signal Region +3 59565300 59632700 High Signal Region +3 59684600 59689200 High Signal Region +3 59791800 59804200 Low Mappability +3 59887400 59889300 High Signal Region +3 59919200 59921100 High Signal Region +3 60044300 60046800 High Signal Region +3 60489700 60495200 Low Mappability +3 61150800 61177900 High Signal Region +3 61260700 61275000 Low Mappability +3 61495400 61499700 High Signal Region +3 61672300 61678300 High Signal Region +3 61707600 61726600 Low Mappability +3 61853900 61858900 High Signal Region +3 62032400 62038600 High Signal Region +3 62108300 62160100 High Signal Region +3 62356900 62367700 High Signal Region +3 62543000 62549200 High Signal Region +3 62873000 62879300 High Signal Region +3 63515500 63530100 High Signal Region +3 63590100 63591500 High Signal Region +3 64171000 64172900 High Signal Region +3 64237900 64245700 High Signal Region +3 64453100 64512800 High Signal Region +3 64609600 64665300 Low Mappability +3 64697900 64730500 High Signal Region +3 67027900 67054100 High Signal Region +3 67262400 67264000 High Signal Region +3 67411100 67419400 High Signal Region +3 67747300 67752800 High Signal Region +3 67786800 67793600 High Signal Region +3 68114300 68119700 Low Mappability +3 68519400 68525100 High Signal Region +3 69228600 69230500 High Signal Region +3 69848400 69854900 High Signal Region +3 69944400 69949800 High Signal Region +3 71117300 71122800 High Signal Region +3 71369600 71447800 High Signal Region +3 72273600 72293700 High Signal Region +3 72698100 72704800 High Signal Region +3 73088300 73098500 High Signal Region +3 73733100 73738500 Low Mappability +3 74583300 74598400 Low Mappability +3 74865000 74881800 High Signal Region +3 75348300 75378700 Low Mappability +3 75409000 75424100 High Signal Region +3 76598800 76604700 High Signal Region +3 76886600 76892900 Low Mappability +3 77597400 77604300 Low Mappability +3 77667400 77711400 High Signal Region +3 77926800 77931400 High Signal Region +3 78281900 78283900 Low Mappability +3 79012700 79014900 High Signal Region +3 79046300 79052800 Low Mappability +3 79763800 79780000 High Signal Region +3 79959500 79965700 High Signal Region +3 80465400 80472000 High Signal Region +3 82283300 82288700 Low Mappability +3 82462100 82508600 Low Mappability +3 82589000 82616700 Low Mappability +3 82921400 82924800 High Signal Region +3 83123200 83125100 High Signal Region +3 83330900 83343400 High Signal Region +3 83845100 83867000 High Signal Region +3 84142200 84149700 Low Mappability +3 84359000 84366300 Low Mappability +3 85305200 85326800 Low Mappability +3 85622200 85629500 Low Mappability +3 87424200 87426100 High Signal Region +3 87469300 87474600 High Signal Region +3 88044000 88066500 High Signal Region +3 88666500 88673500 Low Mappability +3 88716700 88873000 Low Mappability +3 90761500 90810400 High Signal Region +3 90991100 90996800 Low Mappability +3 91856700 91898200 High Signal Region +3 92185400 92291300 High Signal Region +3 93059200 93107000 High Signal Region +3 93168500 93172800 High Signal Region +3 93203900 93229100 High Signal Region +3 93323700 93331700 Low Mappability +3 93860300 94093700 High Signal Region +3 94136200 94152300 High Signal Region +3 94658300 94665700 Low Mappability +3 94690000 94730800 High Signal Region +3 94757600 94765200 Low Mappability +3 96043600 96058900 High Signal Region +3 96196200 96288300 High Signal Region +3 96313200 96388900 Low Mappability +3 96446800 96463800 Low Mappability +3 96485600 96514300 High Signal Region +3 96840000 96863800 High Signal Region +3 97245200 97251500 High Signal Region +3 98396100 98411400 High Signal Region +3 98443100 98597600 Low Mappability +3 98709300 98778900 High Signal Region +3 98986000 99034100 High Signal Region +3 99406000 99434100 High Signal Region +3 99882900 99908100 High Signal Region +3 99980200 99982200 High Signal Region +3 100315500 100330900 High Signal Region +3 100484400 100486300 High Signal Region +3 102813400 102839300 High Signal Region +3 102983600 102989900 High Signal Region +3 103134600 103136000 High Signal Region +3 103427600 103447900 High Signal Region +3 103555000 103557000 Low Mappability +3 104116800 104123100 High Signal Region +3 104194200 104198800 High Signal Region +3 104588100 104595500 Low Mappability +3 105028200 105030500 High Signal Region +3 106118500 106311800 High Signal Region +3 106777900 106779700 High Signal Region +3 109258500 109277300 High Signal Region +3 109458000 109462700 High Signal Region +3 110319800 110325700 High Signal Region +3 110416300 110421800 High Signal Region +3 111256100 111268600 High Signal Region +3 111578400 111605200 Low Mappability +3 111794100 111799000 Low Mappability +3 111830400 111836300 High Signal Region +3 112274500 112287300 High Signal Region +3 112315500 112337400 High Signal Region +3 112561900 112586900 High Signal Region +3 112863500 112869300 High Signal Region +3 112913800 112918000 High Signal Region +3 113186300 113189100 High Signal Region +3 113250900 113527800 High Signal Region +3 113709900 113719000 High Signal Region +3 113742300 113748300 High Signal Region +3 114272600 114279400 High Signal Region +3 114472100 114499300 Low Mappability +3 114587900 114595900 High Signal Region +3 114976700 114982800 High Signal Region +3 115020700 115027100 Low Mappability +3 115367700 115372200 Low Mappability +3 115905900 115922900 High Signal Region +3 116817400 116843900 Low Mappability +3 117267200 117292400 High Signal Region +3 117379100 117386400 Low Mappability +3 118055100 118060000 High Signal Region +3 119211800 119212900 High Signal Region +3 120735000 120742200 High Signal Region +3 120825200 120851500 High Signal Region +3 121248900 121250900 High Signal Region +3 121694400 121696100 High Signal Region +3 122294000 122329300 High Signal Region +3 122654100 122657300 High Signal Region +3 122804300 122806600 High Signal Region +3 123471600 123476200 Low Mappability +3 123729200 123743200 High Signal Region +3 123924800 123957700 High Signal Region +3 124282300 124288300 High Signal Region +3 125902800 125908900 High Signal Region +3 126127300 126136000 Low Mappability +3 126905300 126910600 High Signal Region +3 127522400 127523700 Low Mappability +3 127771600 127780600 High Signal Region +3 128203600 128211000 High Signal Region +3 128440100 128446100 High Signal Region +3 128935800 128937700 High Signal Region +3 129020900 129032100 High Signal Region +3 129393000 129394900 High Signal Region +3 133123600 133130800 Low Mappability +3 133566400 133568700 High Signal Region +3 133636000 133642800 High Signal Region +3 133837100 133859400 High Signal Region +3 134007400 134026700 Low Mappability +3 134685700 134690700 High Signal Region +3 134862500 134888400 High Signal Region +3 135148300 135163000 High Signal Region +3 136173700 136181000 Low Mappability +3 137407500 137413500 High Signal Region +3 137469200 137470300 High Signal Region +3 138200900 138207900 High Signal Region +3 139365700 139417700 High Signal Region +3 140376900 140384200 Low Mappability +3 142190700 142192800 High Signal Region +3 142513000 142517200 High Signal Region +3 143840800 143847000 High Signal Region +3 144030200 144036300 High Signal Region +3 144655600 144660600 High Signal Region +3 145040500 145061800 High Signal Region +3 145109000 145114400 Low Mappability +3 145188100 145190400 High Signal Region +3 145301600 145303100 High Signal Region +3 146073300 146102400 High Signal Region +3 146358800 146362600 High Signal Region +3 146476200 146479000 High Signal Region +3 146918900 146924200 High Signal Region +3 147107400 147113000 High Signal Region +3 147769500 147781800 High Signal Region +3 147874500 147877600 High Signal Region +3 148704800 148716900 High Signal Region +3 148750100 148757400 Low Mappability +3 148797800 148799700 High Signal Region +3 149051500 149053800 High Signal Region +3 150120900 150123800 High Signal Region +3 150336900 150341400 Low Mappability +3 151028900 151031200 High Signal Region +3 151657500 151679800 High Signal Region +3 152313800 152332200 High Signal Region +3 152700700 152702700 High Signal Region +3 153090100 153109400 High Signal Region +3 154640300 154646700 High Signal Region +3 154931700 154932800 High Signal Region +3 155515800 155517600 High Signal Region +3 155765900 155771900 High Signal Region +3 156256900 156262800 Low Mappability +3 156285600 156322500 High Signal Region +3 156799400 156804900 Low Mappability +3 157646900 157678300 High Signal Region +3 157946200 157969400 High Signal Region +3 158095300 158119200 High Signal Region +3 158698600 158756800 High Signal Region +3 159165900 159179700 High Signal Region +3 159225800 159239300 Low Mappability +3 159478300 159479700 High Signal Region +3 159748800 159826500 High Signal Region +3 159938500 160039600 High Signal Region +4 0 3114800 High Signal Region +4 3139700 3333100 High Signal Region +4 18476200 18498400 High Signal Region +4 20168700 20213200 High Signal Region +4 20804100 20808300 High Signal Region +4 20982300 20983700 High Signal Region +4 21281300 21287700 High Signal Region +4 22535900 22542300 High Signal Region +4 24193400 24201100 High Signal Region +4 25471300 25473200 High Signal Region +4 28175900 28177900 High Signal Region +4 31353200 31355200 High Signal Region +4 34934800 34936700 High Signal Region +4 35042700 35048900 High Signal Region +4 38305900 38322000 High Signal Region +4 57979700 57981800 High Signal Region +4 64454600 64499000 High Signal Region +4 68427300 68447900 High Signal Region +4 70367200 70379200 High Signal Region +4 73196300 73209300 High Signal Region +4 80001800 80004900 High Signal Region +4 83536900 83541900 High Signal Region +4 90725600 90727500 High Signal Region +4 92230800 92236500 High Signal Region +4 93843500 93853100 High Signal Region +4 99380500 99382400 High Signal Region +4 110469700 110505300 High Signal Region +4 118546100 118549600 High Signal Region +4 131222500 131229300 High Signal Region +4 145404200 147840400 High Signal Region +4 149809200 149811700 High Signal Region +4 153152100 153154100 High Signal Region +4 156256000 156508100 High Signal Region +5 3175400 3186000 High Signal Region +5 12489500 12490600 High Signal Region +5 14899000 15726800 High Signal Region +5 17466700 17481500 High Signal Region +5 36629400 36662500 High Signal Region +5 46434800 46436700 High Signal Region +5 49722200 49755700 High Signal Region +5 60041900 60043900 Low Mappability +5 80499900 80501900 High Signal Region +5 93288700 93351800 High Signal Region +5 106126300 106177800 High Signal Region +5 110063700 110075500 High Signal Region +5 114921500 114923500 High Signal Region +5 137148800 137153800 High Signal Region +5 146260000 146262300 High Signal Region +5 151733600 151834600 High Signal Region +6 0 3255700 High Signal Region +6 3280700 3340300 High Signal Region +6 4922900 4925100 High Signal Region +6 5608000 5657900 High Signal Region +6 5704400 5706800 High Signal Region +6 6400000 6442800 High Signal Region +6 6700000 6727600 High Signal Region +6 8729200 8731100 High Signal Region +6 8906700 8932300 High Signal Region +6 9519200 9529100 High Signal Region +6 9580600 9610100 High Signal Region +6 9646900 9663400 High Signal Region +6 9720400 9733100 High Signal Region +6 9889000 9891100 High Signal Region +6 10228400 10269900 High Signal Region +6 10559100 10588400 High Signal Region +6 10623400 10633900 High Signal Region +6 11251100 11256800 High Signal Region +6 11406400 11457900 High Signal Region +6 11813900 11897100 High Signal Region +6 12671100 12680300 High Signal Region +6 13390500 13394900 High Signal Region +6 13700500 13743100 High Signal Region +6 14085000 14092300 Low Mappability +6 14793800 14805500 High Signal Region +6 14929200 14935100 High Signal Region +6 16299700 16310100 High Signal Region +6 16922600 16924800 High Signal Region +6 17004600 17042000 High Signal Region +6 17391200 17397900 High Signal Region +6 17981700 17983400 High Signal Region +6 18264800 18267200 High Signal Region +6 18836700 18848600 High Signal Region +6 19068900 19075400 High Signal Region +6 20113900 20143500 High Signal Region +6 21452400 21458100 High Signal Region +6 21801300 21803200 High Signal Region +6 21841300 21845300 High Signal Region +6 21873300 21876800 High Signal Region +6 22107700 22131800 High Signal Region +6 22479600 22483900 High Signal Region +6 22516700 22534300 High Signal Region +6 25505600 25566400 Low Mappability +6 26049500 26072100 High Signal Region +6 26247700 26278000 High Signal Region +6 26834800 26840700 High Signal Region +6 26988500 26992000 High Signal Region +6 27199000 27228400 High Signal Region +6 28924100 28929500 Low Mappability +6 29746800 29750000 High Signal Region +6 29974300 29978200 High Signal Region +6 30752800 30806400 High Signal Region +6 30929300 30936100 Low Mappability +6 31594900 31597200 High Signal Region +6 32740700 32746800 High Signal Region +6 32867600 32869000 High Signal Region +6 33490300 33495000 High Signal Region +6 33650500 33665400 High Signal Region +6 33743900 33749000 High Signal Region +6 36224300 36230500 High Signal Region +6 40535500 40559800 Low Mappability +6 40716600 40723700 High Signal Region +6 42122800 42174200 High Signal Region +6 42492600 42516600 High Signal Region +6 42617600 42620900 High Signal Region +6 44265200 44270800 High Signal Region +6 44497000 44513300 High Signal Region +6 44785200 44794100 High Signal Region +6 44836300 44837500 High Signal Region +6 46381300 46402000 High Signal Region +6 46678600 46685300 High Signal Region +6 47639000 47779200 High Signal Region +6 48120300 48122300 High Signal Region +6 48149300 48172900 High Signal Region +6 48231500 48292600 High Signal Region +6 48320300 48347000 High Signal Region +6 49235500 49237500 High Signal Region +6 50601400 50636700 Low Mappability +6 51046500 51048400 High Signal Region +6 53464100 53487500 Low Mappability +6 54976500 54993700 High Signal Region +6 56232700 56257500 High Signal Region +6 56455900 56465300 High Signal Region +6 57425200 57455700 High Signal Region +6 57588900 57634500 High Signal Region +6 57919500 57925700 High Signal Region +6 58068500 58073500 High Signal Region +6 58588700 58612800 High Signal Region +6 59123600 59130100 High Signal Region +6 59199600 59230600 High Signal Region +6 59584300 59598000 High Signal Region +6 59676000 59698200 High Signal Region +6 60622400 60625600 High Signal Region +6 60668000 60688200 High Signal Region +6 61023100 61029400 High Signal Region +6 61088400 61094600 High Signal Region +6 62525500 62527300 High Signal Region +6 64331600 64338900 Low Mappability +6 64778500 64812500 High Signal Region +6 64882100 64930500 High Signal Region +6 65100600 65106700 High Signal Region +6 65184300 65261600 High Signal Region +6 66070200 66095900 High Signal Region +6 66815600 66831600 High Signal Region +6 67311500 67312900 High Signal Region +6 67494800 67522100 Low Mappability +6 67576400 67630800 High Signal Region +6 67658300 67710900 High Signal Region +6 68011000 68012900 High Signal Region +6 68221900 68252400 Low Mappability +6 68641400 68661300 High Signal Region +6 68971900 68996400 High Signal Region +6 69017600 69035700 High Signal Region +6 70000300 70053000 High Signal Region +6 70187800 70213700 High Signal Region +6 70620700 70648600 High Signal Region +6 73105700 73113400 High Signal Region +6 73502200 73521000 High Signal Region +6 73671400 73672600 High Signal Region +6 74191700 74194400 High Signal Region +6 74365900 74386400 High Signal Region +6 74700100 74705300 High Signal Region +6 75054000 75083000 High Signal Region +6 76645400 76649100 High Signal Region +6 76847200 76854100 High Signal Region +6 78352900 78359500 High Signal Region +6 78456200 78491700 Low Mappability +6 78637400 78639700 High Signal Region +6 78716700 78722400 High Signal Region +6 79627500 79635200 High Signal Region +6 79817300 79819200 High Signal Region +6 79898900 79922800 Low Mappability +6 79959800 79967500 Low Mappability +6 81012200 81036700 High Signal Region +6 81829400 81875000 High Signal Region +6 81997000 82011600 High Signal Region +6 82213400 82218800 High Signal Region +6 84662700 84688200 High Signal Region +6 84712600 84720200 High Signal Region +6 89723500 89735600 High Signal Region +6 91768300 91770200 High Signal Region +6 92321600 92328300 High Signal Region +6 94988600 94990700 Low Mappability +6 95030100 95043800 Low Mappability +6 95475600 95479900 High Signal Region +6 95980800 95987100 High Signal Region +6 96877800 96896100 High Signal Region +6 97356800 97379400 High Signal Region +6 101571200 101621400 High Signal Region +6 102379600 102384100 High Signal Region +6 102483000 102505700 High Signal Region +6 102767600 102791400 High Signal Region +6 103313700 103315600 High Signal Region +6 103647900 103650200 High Signal Region +6 103750700 103752000 High Signal Region +6 105194700 105199600 High Signal Region +6 105253400 105257600 Low Mappability +6 105306000 105337600 High Signal Region +6 107141500 107146300 High Signal Region +6 107284300 107299800 High Signal Region +6 107860500 107920500 High Signal Region +6 109498200 109506200 High Signal Region +6 109641800 109648100 High Signal Region +6 109984000 110013000 High Signal Region +6 114340600 114343000 High Signal Region +6 114492200 114643400 High Signal Region +6 116021200 116043900 High Signal Region +6 116238700 116252600 High Signal Region +6 116566200 116593800 High Signal Region +6 117087400 117094300 High Signal Region +6 118209000 118234000 High Signal Region +6 119419600 119431100 High Signal Region +6 121690100 121703800 High Signal Region +6 122614200 122616600 High Signal Region +6 123132100 123179400 High Signal Region +6 123204800 123242900 High Signal Region +6 126135200 126137300 Low Mappability +6 128680200 128693700 High Signal Region +6 128861200 128865300 High Signal Region +6 129857800 129863300 High Signal Region +6 129935700 129948400 High Signal Region +6 131088300 131114900 High Signal Region +6 131208300 131252100 High Signal Region +6 131495900 131505900 High Signal Region +6 132497200 132523000 Low Mappability +6 132597000 132598700 High Signal Region +6 132635400 132642000 High Signal Region +6 133169000 133170900 High Signal Region +6 133891500 133899800 High Signal Region +6 134689500 134692700 High Signal Region +6 138216100 138221900 High Signal Region +6 138647300 138649100 High Signal Region +6 138685400 138700700 High Signal Region +6 142060700 142079300 High Signal Region +6 142396700 142400200 Low Mappability +6 142433400 142439400 High Signal Region +6 143014400 143016300 High Signal Region +6 143466500 143481400 High Signal Region +6 143883500 143886900 High Signal Region +6 144655200 144670000 High Signal Region +6 145784700 145787000 High Signal Region +6 145931800 145933900 Low Mappability +6 146018900 146080500 High Signal Region +6 147077200 147079900 High Signal Region +6 147459800 147465000 Low Mappability +6 147549600 147555000 Low Mappability +6 147881900 147908400 High Signal Region +6 148013100 148038400 High Signal Region +6 148121800 148124500 High Signal Region +6 148635700 148640300 Low Mappability +6 148662900 148665000 Low Mappability +6 149585500 149736500 High Signal Region +7 4558200 4594300 High Signal Region +7 4648600 4651500 High Signal Region +7 5153200 5244900 High Signal Region +7 5588700 5591600 High Signal Region +7 6050500 6056000 High Signal Region +7 6249400 6251400 High Signal Region +7 6590800 6597400 High Signal Region +7 7209500 7231000 High Signal Region +7 7273500 7327400 High Signal Region +7 7527500 7533900 High Signal Region +7 7556800 8278400 High Signal Region +7 8490800 9968800 High Signal Region +7 9992100 9998900 High Signal Region +7 10314900 10320900 High Signal Region +7 11097700 11123700 High Signal Region +7 11271100 11438600 High Signal Region +7 12009500 12084600 High Signal Region +7 12379600 12385400 High Signal Region +7 12526600 12548100 High Signal Region +7 13112300 13118100 High Signal Region +7 13591200 13620200 High Signal Region +7 14051300 14055900 High Signal Region +7 14767700 14823800 High Signal Region +7 14930100 15023000 High Signal Region +7 15128800 15623000 High Signal Region +7 16661400 16667800 High Signal Region +7 17112200 17123900 High Signal Region +7 17215800 17323400 High Signal Region +7 17800000 17806700 High Signal Region +7 17829700 17862600 High Signal Region +7 18487100 18493200 High Signal Region +7 19032600 19034500 High Signal Region +7 20799700 21103900 High Signal Region +7 21135700 23286800 High Signal Region +7 23494700 23503600 High Signal Region +7 24026200 24031700 High Signal Region +7 24103800 24108200 High Signal Region +7 24729400 24731300 High Signal Region +7 26022700 26066900 High Signal Region +7 26779000 26780900 High Signal Region +7 27082300 27098300 High Signal Region +7 27712800 27732500 High Signal Region +7 31365500 31387000 High Signal Region +7 31818200 31876700 High Signal Region +7 31934500 32043100 High Signal Region +7 32215700 32235200 High Signal Region +7 32629300 33098700 High Signal Region +7 33124200 33198000 High Signal Region +7 33949500 34004800 High Signal Region +7 34957200 34959100 High Signal Region +7 38396600 38787200 High Signal Region +7 38839800 39181000 High Signal Region +7 39227600 39404100 High Signal Region +7 39874600 39875900 High Signal Region +7 41791900 41851900 High Signal Region +7 43123800 43220300 High Signal Region +7 44737800 44739900 High Signal Region +7 47175100 47188600 High Signal Region +7 47414400 47519700 High Signal Region +7 48102600 48135800 High Signal Region +7 50940400 50986800 High Signal Region +7 51329800 51335900 High Signal Region +7 51800300 51812600 High Signal Region +7 51909200 51911200 High Signal Region +7 52095700 52104400 High Signal Region +7 52283300 52288900 High Signal Region +7 53677100 53683100 High Signal Region +7 53977800 54027400 High Signal Region +7 54336000 54351800 High Signal Region +7 54808900 54810100 High Signal Region +7 54923000 54971200 High Signal Region +7 55011500 55016500 High Signal Region +7 55080000 55086300 High Signal Region +7 55115400 55141000 High Signal Region +7 55657400 55667100 High Signal Region +7 56062300 56081700 High Signal Region +7 56160100 56163400 Low Mappability +7 56660300 56693600 High Signal Region +7 57367200 57374700 High Signal Region +7 58040300 58077100 High Signal Region +7 58161700 58177900 High Signal Region +7 59673100 59910900 High Signal Region +7 60209400 60215600 High Signal Region +7 60676300 60682800 High Signal Region +7 61320100 61395400 High Signal Region +7 62135200 62137500 High Signal Region +7 62651400 62693400 High Signal Region +7 63272500 63287100 High Signal Region +7 63431300 63432400 High Signal Region +7 63803700 63810800 High Signal Region +7 63908200 63910100 High Signal Region +7 64072600 64134600 High Signal Region +7 64465300 64496400 High Signal Region +7 64601000 64617900 High Signal Region +7 65187500 65198300 High Signal Region +7 68534700 68537900 High Signal Region +7 68775900 68778100 High Signal Region +7 69086500 69102900 High Signal Region +7 69785300 69792200 High Signal Region +7 70757900 70765000 High Signal Region +7 71971100 71984500 High Signal Region +7 72317400 72337900 High Signal Region +7 72630000 72679900 High Signal Region +7 73212000 73218800 High Signal Region +7 73671700 73680000 High Signal Region +7 75003200 75007700 High Signal Region +7 76067800 76079300 High Signal Region +7 76556000 76573000 High Signal Region +7 76703900 76708400 High Signal Region +7 77520600 77526000 High Signal Region +7 78416900 78422400 High Signal Region +7 80708100 80730100 Low Mappability +7 80787500 80813800 High Signal Region +7 81756100 81760500 High Signal Region +7 82770300 82772800 High Signal Region +7 85017700 85023600 High Signal Region +7 85757200 85768800 High Signal Region +7 86118700 86125800 High Signal Region +7 86497400 86503500 High Signal Region +7 86532600 86534000 High Signal Region +7 86805600 86807500 High Signal Region +7 87989300 88000600 High Signal Region +7 89683300 89704600 High Signal Region +7 90087300 90089400 High Signal Region +7 90441000 90442900 High Signal Region +7 91741500 91747500 High Signal Region +7 93259400 93278100 High Signal Region +7 93699600 93717500 High Signal Region +7 93744000 93766100 High Signal Region +7 93969600 93973700 High Signal Region +7 94293000 94299300 High Signal Region +7 94822500 94848800 High Signal Region +7 95177200 95193600 High Signal Region +7 95527400 95533200 High Signal Region +7 97795000 97797300 High Signal Region +7 103100800 103115000 High Signal Region +7 103195500 103202100 High Signal Region +7 103483000 103487500 High Signal Region +7 104097400 104126600 High Signal Region +7 104476800 104477900 High Signal Region +7 104770000 104801200 High Signal Region +7 105830300 106325300 High Signal Region +7 106979000 106984900 High Signal Region +7 107245200 107271400 High Signal Region +7 108780600 108789800 High Signal Region +7 110058500 110061600 High Signal Region +7 111228400 111230600 High Signal Region +7 112636600 112639800 High Signal Region +7 116432200 116453400 High Signal Region +7 119739900 119742100 High Signal Region +7 119795700 119797700 High Signal Region +7 119998800 120015100 High Signal Region +7 124522300 124528300 High Signal Region +7 125009800 125016600 High Signal Region +7 128171000 128189300 High Signal Region +7 130054200 130055700 High Signal Region +7 130591400 130596900 High Signal Region +7 130833500 130835600 High Signal Region +7 134100500 134107200 High Signal Region +7 134329200 134335200 High Signal Region +7 135006900 135008800 High Signal Region +7 135337800 135340900 High Signal Region +7 138590500 138594500 High Signal Region +7 139447400 139448900 High Signal Region +7 140288200 140307300 High Signal Region +7 140551100 140558800 High Signal Region +7 140580500 140585700 High Signal Region +7 141637000 141640700 High Signal Region +7 142828900 142845000 High Signal Region +7 145340000 145441400 High Signal Region +8 3753500 3779100 High Signal Region +8 14305800 14308200 High Signal Region +8 15508900 15521000 High Signal Region +8 19671800 19937800 High Signal Region +8 19960800 20868000 High Signal Region +8 20945500 20963700 High Signal Region +8 23085600 23096700 High Signal Region +8 35134000 35135900 High Signal Region +8 39132400 39157700 High Signal Region +8 55111200 55397300 High Signal Region +8 69416700 69597900 High Signal Region +8 71432100 71434100 High Signal Region +8 71796100 71863300 High Signal Region +8 73318700 73320700 High Signal Region +8 83755800 83757900 High Signal Region +8 114436000 114437900 High Signal Region +8 123537300 123638300 High Signal Region +8 125778100 125780100 High Signal Region +8 129272900 129401200 High Signal Region +9 0 3053100 High Signal Region +9 3240200 3259800 High Signal Region +9 3302000 3336000 High Signal Region +9 3461000 3466600 Low Mappability +9 3627400 3699700 Low Mappability +9 3802100 3806700 High Signal Region +9 3881100 3887600 High Signal Region +9 4238700 4245700 Low Mappability +9 4375700 4406800 High Signal Region +9 5248000 5254100 High Signal Region +9 5276200 5284600 Low Mappability +9 6431500 6467200 High Signal Region +9 6742900 6806200 Low Mappability +9 7294600 7300700 High Signal Region +9 7370900 7412600 Low Mappability +9 7520900 7525900 High Signal Region +9 8029400 8067100 Low Mappability +9 8275900 8292300 Low Mappability +9 8447200 8483700 High Signal Region +9 8628200 8633700 Low Mappability +9 8859900 8865500 High Signal Region +9 9598800 9626700 High Signal Region +9 9846900 9891900 Low Mappability +9 10193200 10198800 Low Mappability +9 10701300 10707400 High Signal Region +9 10964200 10970600 High Signal Region +9 11341900 11345100 High Signal Region +9 11722300 11747100 High Signal Region +9 11792800 11798400 Low Mappability +9 11821400 11845400 High Signal Region +9 12282000 12287500 High Signal Region +9 12364900 12379600 High Signal Region +9 12469100 12472900 Low Mappability +9 12768200 12773800 High Signal Region +9 12840100 12851100 High Signal Region +9 12917600 12922300 High Signal Region +9 12998400 13045600 Low Mappability +9 13324200 13426100 High Signal Region +9 13533500 13535700 High Signal Region +9 13994600 13996700 High Signal Region +9 14410500 14429300 Low Mappability +9 15123900 15136900 High Signal Region +9 16607400 16691900 Low Mappability +9 16833700 16861000 High Signal Region +9 16939400 16950500 Low Mappability +9 17059000 17088000 High Signal Region +9 17197900 17207600 High Signal Region +9 17261400 17263400 Low Mappability +9 17387200 17406200 High Signal Region +9 17525800 17527700 High Signal Region +9 17632000 17636100 High Signal Region +9 17916200 17919600 High Signal Region +9 18010000 18015600 High Signal Region +9 18117000 18162200 Low Mappability +9 18235100 18270100 High Signal Region +9 18893800 18900100 High Signal Region +9 18980400 18994100 High Signal Region +9 19268700 19294700 High Signal Region +9 19595400 19638400 High Signal Region +9 19720500 19725500 Low Mappability +9 19901400 19906100 High Signal Region +9 20183600 20196700 Low Mappability +9 20322100 20407900 High Signal Region +9 21879200 21928200 High Signal Region +9 22116600 22191600 High Signal Region +9 22699500 22731700 High Signal Region +9 22892700 22926500 Low Mappability +9 22947900 22956900 High Signal Region +9 23508700 23526900 High Signal Region +9 24523300 24576000 High Signal Region +9 25596700 25602700 High Signal Region +9 25842900 25863600 High Signal Region +9 26096100 26103500 Low Mappability +9 26700800 26708000 High Signal Region +9 26904600 26911000 High Signal Region +9 27212200 27232300 High Signal Region +9 27974400 27981700 High Signal Region +9 29739800 29741800 Low Mappability +9 30604400 30606300 Low Mappability +9 30641800 30696800 Low Mappability +9 30929800 30931100 High Signal Region +9 32059200 32083600 Low Mappability +9 32353900 32356500 High Signal Region +9 32839200 32846600 Low Mappability +9 32888700 32896000 Low Mappability +9 32953000 32958100 Low Mappability +9 33127100 33161100 Low Mappability +9 33392400 33402700 High Signal Region +9 33949500 33961900 Low Mappability +9 35071200 35091800 High Signal Region +9 35304300 35306500 High Signal Region +9 36235800 36241900 High Signal Region +9 36555000 36569100 High Signal Region +9 37331400 37349500 Low Mappability +9 37441700 37448100 High Signal Region +9 39330900 39359100 High Signal Region +9 39444100 39449600 High Signal Region +9 39835400 39899000 Low Mappability +9 44214200 44235400 Low Mappability +9 44305700 44408400 Low Mappability +9 47957400 47959300 High Signal Region +9 50082000 50088400 High Signal Region +9 51667400 51673700 High Signal Region +9 52601800 52617200 High Signal Region +9 52749000 52756100 High Signal Region +9 53089800 53107000 High Signal Region +9 53804100 53805400 High Signal Region +9 54916200 54928900 High Signal Region +9 55070600 55078000 Low Mappability +9 55150300 55152300 High Signal Region +9 55936900 55972500 High Signal Region +9 56222700 56224800 High Signal Region +9 56259500 56284300 High Signal Region +9 56991700 56993700 Low Mappability +9 57408000 57434800 High Signal Region +9 58766500 58785800 High Signal Region +9 59046200 59052700 Low Mappability +9 59103800 59125000 High Signal Region +9 60538500 60551200 High Signal Region +9 60726100 60733500 High Signal Region +9 61721500 61723400 High Signal Region +9 62811600 62868300 Low Mappability +9 64236700 64255000 Low Mappability +9 64410400 64417700 Low Mappability +9 65292600 65314200 High Signal Region +9 65867400 65909400 High Signal Region +9 67198600 67205000 Low Mappability +9 68451200 68461200 High Signal Region +9 68527100 68534600 High Signal Region +9 71080600 71120800 Low Mappability +9 71421100 71434600 High Signal Region +9 72895800 72900800 Low Mappability +9 72957900 72985700 Low Mappability +9 73285500 73311300 High Signal Region +9 73396800 73412500 Low Mappability +9 73861400 73863500 Low Mappability +9 73935600 73946700 High Signal Region +9 74615600 74641300 Low Mappability +9 74664800 74690900 High Signal Region +9 74768600 74774600 High Signal Region +9 75709200 75736000 Low Mappability +9 77079900 77082800 High Signal Region +9 77152800 77158800 High Signal Region +9 77972400 77974300 High Signal Region +9 78175200 78182700 Low Mappability +9 78230500 78296900 High Signal Region +9 78554700 78589200 Low Mappability +9 78755200 78757800 High Signal Region +9 78819200 78830500 Low Mappability +9 80234500 80235700 High Signal Region +9 80660700 80665600 High Signal Region +9 81251500 81303200 High Signal Region +9 81614000 81620700 High Signal Region +9 81906400 81937200 High Signal Region +9 83278800 83288100 High Signal Region +9 83558300 83560200 High Signal Region +9 83935500 83950000 High Signal Region +9 83992400 83998900 High Signal Region +9 84211900 84226800 High Signal Region +9 85898900 85918900 High Signal Region +9 86062600 86070000 Low Mappability +9 86120100 86137500 High Signal Region +9 86458200 86463100 High Signal Region +9 87098700 87112200 High Signal Region +9 87481400 87500900 High Signal Region +9 87576700 87594000 High Signal Region +9 87945600 87952400 High Signal Region +9 88011000 88013900 High Signal Region +9 88592100 88829800 High Signal Region +9 89031300 89075400 Low Mappability +9 89321400 89361800 High Signal Region +9 90147100 90149100 High Signal Region +9 90285200 90395300 High Signal Region +9 90455400 90456800 High Signal Region +9 90808100 90821900 Low Mappability +9 90857200 90876300 Low Mappability +9 91222100 91268200 High Signal Region +9 91598800 91647400 High Signal Region +9 92032700 92035300 High Signal Region +9 92075300 92113200 High Signal Region +9 92239700 92242900 High Signal Region +9 92624800 92654500 High Signal Region +9 93013300 93035300 High Signal Region +9 93286500 93296500 High Signal Region +9 93360800 93442100 Low Mappability +9 93618000 93668500 Low Mappability +9 94821700 94828100 Low Mappability +9 95245800 95299600 High Signal Region +9 95425000 95426900 High Signal Region +9 95829400 95831300 High Signal Region +9 96104900 96111400 Low Mappability +9 96852000 96854100 High Signal Region +9 98343300 98345700 Low Mappability +9 98451100 98458500 Low Mappability +9 98747700 98771800 Low Mappability +9 99266600 99273100 Low Mappability +9 99735800 99763300 High Signal Region +9 99922800 99937600 High Signal Region +9 100073800 100080700 High Signal Region +9 100516900 100519200 High Signal Region +9 100920400 100922300 High Signal Region +9 101085500 101110600 High Signal Region +9 101292500 101326600 Low Mappability +9 102277400 102283800 Low Mappability +9 102764700 102766800 Low Mappability +9 102812800 102815000 High Signal Region +9 102956300 102970000 Low Mappability +9 103296200 103305600 High Signal Region +9 103352800 103367100 Low Mappability +9 103988500 103990400 High Signal Region +9 104524500 104525700 High Signal Region +9 104848800 104850600 High Signal Region +9 105086200 105119300 High Signal Region +9 105818400 105820400 High Signal Region +9 107207900 107219900 High Signal Region +9 109036600 109083500 High Signal Region +9 109245000 109252200 High Signal Region +9 109272900 109374100 High Signal Region +9 110280300 110306700 High Signal Region +9 110443100 110455100 High Signal Region +9 110970300 110976000 High Signal Region +9 111661900 111668700 High Signal Region +9 112330100 112336900 High Signal Region +9 112956300 112990600 High Signal Region +9 113260500 113262400 High Signal Region +9 113535400 113541300 High Signal Region +9 114101400 114149500 Low Mappability +9 114172400 114322200 High Signal Region +9 114970100 114974700 Low Mappability +9 115077900 115085200 Low Mappability +9 115349900 115351800 High Signal Region +9 115496100 115498100 Low Mappability +9 116981500 116988600 High Signal Region +9 118088300 118151400 High Signal Region +9 118674000 118675900 High Signal Region +9 119861200 119895000 Low Mappability +9 120265300 120288700 High Signal Region +9 120633900 120641200 Low Mappability +9 121024600 121042700 Low Mappability +9 121178300 121184500 High Signal Region +9 121220100 121247600 High Signal Region +9 121313700 121385800 Low Mappability +9 121406300 121418400 Low Mappability +9 122161300 122163200 High Signal Region +9 122277700 122334500 Low Mappability +9 122401500 122441900 Low Mappability +9 122660600 122667200 Low Mappability +9 122703400 122730400 Low Mappability +9 122903900 122906600 High Signal Region +9 123190700 123197500 Low Mappability +9 123460900 123463100 High Signal Region +9 123742600 123753500 Low Mappability +9 123851700 123929500 High Signal Region +9 123966100 124009300 High Signal Region +9 124161300 124282600 High Signal Region +9 124494100 124595100 High Signal Region +X 3286700 4493800 High Signal Region +X 4524500 5370300 High Signal Region +X 8346400 8348200 High Signal Region +X 8550300 8557800 High Signal Region +X 8818900 8824300 High Signal Region +X 9345800 9395300 High Signal Region +X 9500200 9595700 High Signal Region +X 14739100 14741000 High Signal Region +X 21466500 21472700 High Signal Region +X 21846900 21896100 High Signal Region +X 26459300 26505100 High Signal Region +X 26907100 29639200 High Signal Region +X 29660500 35508900 High Signal Region +X 37612500 37669100 High Signal Region +X 39073800 39075700 High Signal Region +X 41482500 41489500 High Signal Region +X 42676200 42688100 High Signal Region +X 44239900 44293300 High Signal Region +X 44732600 44738600 High Signal Region +X 48699000 48771100 High Signal Region +X 54269300 55286000 High Signal Region +X 55716700 55807400 High Signal Region +X 58475000 58478700 High Signal Region +X 59773000 59796900 High Signal Region +X 61868200 61874000 High Signal Region +X 62065700 62084900 High Signal Region +X 63509200 63515900 High Signal Region +X 63634600 63640900 High Signal Region +X 64125800 64132200 High Signal Region +X 65962800 65999900 High Signal Region +X 66067900 66084000 High Signal Region +X 66143100 66145700 High Signal Region +X 66316400 66356900 High Signal Region +X 67662500 67708500 High Signal Region +X 70055300 70072000 High Signal Region +X 72800000 72818700 High Signal Region +X 75582400 75709000 High Signal Region +X 76589100 76607100 High Signal Region +X 79135300 79150400 High Signal Region +X 81153100 81154600 High Signal Region +X 82475800 82481000 High Signal Region +X 84290800 84296100 High Signal Region +X 87222400 87262500 High Signal Region +X 87838600 87845200 High Signal Region +X 88230200 88246900 High Signal Region +X 89182800 89232600 High Signal Region +X 89914800 89916600 High Signal Region +X 90308600 90336600 High Signal Region +X 92765200 92767900 High Signal Region +X 94795400 94980600 High Signal Region +X 95265900 95291700 High Signal Region +X 97728000 97734800 High Signal Region +X 98008600 98033000 High Signal Region +X 98585800 98612400 High Signal Region +X 101111300 101113600 High Signal Region +X 102560800 102585100 High Signal Region +X 103455000 103457100 High Signal Region +X 104959400 104966000 High Signal Region +X 105523800 105529900 High Signal Region +X 108202600 108222500 High Signal Region +X 108567500 108585200 High Signal Region +X 109871000 109876200 High Signal Region +X 110976700 110997000 High Signal Region +X 112369800 112402300 High Signal Region +X 114412500 114421300 High Signal Region +X 118100900 118102900 High Signal Region +X 118901200 118905100 Low Mappability +X 119137300 119142400 High Signal Region +X 119247400 119264800 High Signal Region +X 119335000 119339300 High Signal Region +X 120351000 120355400 High Signal Region +X 121511200 121514500 High Signal Region +X 122901700 122908000 High Signal Region +X 123686000 124042000 High Signal Region +X 126695300 126778800 High Signal Region +X 127935800 127964600 High Signal Region +X 128512700 128514400 High Signal Region +X 128959800 128965900 High Signal Region +X 129055600 129072400 High Signal Region +X 129429300 129448000 High Signal Region +X 130696000 130702200 High Signal Region +X 131802300 131832800 High Signal Region +X 132024200 132026400 High Signal Region +X 132158700 132160800 High Signal Region +X 134149100 134151200 High Signal Region +X 135040100 135056700 High Signal Region +X 136459400 136503800 High Signal Region +X 136897900 136925800 High Signal Region +X 138302200 138324600 High Signal Region +X 143471300 143484000 High Signal Region +X 144699500 144723900 High Signal Region +X 145709800 145739800 High Signal Region +X 146582500 146588700 High Signal Region +X 146758100 146761900 High Signal Region +X 147619400 147620700 High Signal Region +X 153994800 154073200 High Signal Region +X 154242800 154244800 High Signal Region +X 158443900 158460500 High Signal Region +X 159120000 159154900 High Signal Region +X 161179200 161185600 High Signal Region +X 162381600 162384600 High Signal Region +X 164615100 164622200 High Signal Region +X 166063200 166084500 High Signal Region +X 167213400 167220200 High Signal Region +X 167246000 167252200 High Signal Region +X 169968900 171031200 High Signal Region +Y 0 806800 High Signal Region +Y 924800 1005300 High Signal Region +Y 1276400 1813700 High Signal Region +Y 1834500 1940700 High Signal Region +Y 1973200 1996400 High Signal Region +Y 2017200 2068000 Low Mappability +Y 2104700 2210800 High Signal Region +Y 2280300 2288900 Low Mappability +Y 2471300 3819300 High Signal Region +Y 3880300 4177100 High Signal Region +Y 4249500 4289100 High Signal Region +Y 4432000 4956300 High Signal Region +Y 5062400 5227700 High Signal Region +Y 6376700 6382700 High Signal Region +Y 6530200 6663200 High Signal Region +Y 6760200 6835800 High Signal Region +Y 6984100 8985400 High Signal Region +Y 10638500 41003800 High Signal Region +Y 41159200 91744600 High Signal Region From 99651001813a5c3e6a4aac01793d0e9f67010397 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 17:32:56 +0100 Subject: [PATCH 336/538] Reformat v3 blacklist from hg38 to GRCh38 --- .../blacklists/v3.0/GRCh38-blacklist.v3.bed | 910 ++++++++++++++++++ 1 file changed, 910 insertions(+) create mode 100644 assets/blacklists/v3.0/GRCh38-blacklist.v3.bed diff --git a/assets/blacklists/v3.0/GRCh38-blacklist.v3.bed b/assets/blacklists/v3.0/GRCh38-blacklist.v3.bed new file mode 100644 index 000000000..a29072530 --- /dev/null +++ b/assets/blacklists/v3.0/GRCh38-blacklist.v3.bed @@ -0,0 +1,910 @@ +1 628903 635104 +1 5850087 5850571 +1 8909610 8910014 +1 9574580 9574997 +1 32043823 32044203 +1 33818964 33819344 +1 38674335 38674715 +1 50017081 50017546 +1 52996949 52997329 +1 55372488 55372869 +1 67971776 67972156 +1 73258720 73259100 +1 76971068 76971595 +1 93936365 93936747 +1 93937447 93937827 +1 102160407 102160787 +1 103620975 103621378 +1 106803432 106803816 +1 106804021 106804224 +1 106804753 106805343 +1 121609948 125063427 +1 125166231 125184683 +1 143184599 143276861 +1 146992422 146992802 +1 158449073 158449453 +1 158872114 158872494 +1 159295111 159295493 +1 169473895 169474338 +1 170006204 170006584 +1 172710350 172710732 +1 181422611 181423158 +1 191961694 191962163 +1 195288048 195288429 +1 199487949 199488149 +1 214709795 214710175 +1 215499615 215500014 +1 226652017 226652398 +1 227699752 227700133 +1 229019365 229019745 +1 233139985 233140365 +1 235520204 235520404 +1 235537405 235537785 +1 235538899 235540112 +1 235540243 235540623 +1 235540886 235541649 +1 235870625 235871005 +1 237940595 237940979 +1 237941045 237941514 +1 237941893 237942746 +1 237943028 237943416 +1 237943490 237945232 +1 237945285 237946507 +1 237948983 237949365 +1 237951294 237951802 +10 2235555 2235756 +10 19746628 19747247 +10 19747314 19748342 +10 25638376 25638756 +10 26873147 26873538 +10 30565118 30565501 +10 36432964 36433344 +10 36434047 36435188 +10 37600616 37601002 +10 37601246 37601787 +10 37601884 37602850 +10 38481300 38596500 +10 38782600 38967900 +10 39000365 41916630 +10 42066792 42104971 +10 45577925 45578305 +10 46706229 46706611 +10 47633790 47634172 +10 55597861 55600059 +10 55626794 55627174 +10 57668682 57669062 +10 59261793 59262173 +10 69590538 69590738 +10 69591475 69591858 +10 69592355 69592740 +10 69592776 69593482 +10 69594378 69594760 +10 69595141 69595573 +10 69595681 69596061 +10 77166388 77166768 +10 79411056 79411468 +10 89786504 89786889 +10 100057235 100058064 +10 112894488 112894870 +10 115056512 115056712 +10 123032371 123032751 +10 125819621 125820001 +10 133689373 133689523 +11 8023287 8023667 +11 10507706 10510499 +11 10768339 10768719 +11 10815184 10815384 +11 24839563 24839944 +11 27850562 27850942 +11 47323881 47324333 +11 50424039 50813393 +11 51081363 54424064 +11 64187168 64187556 +11 65069483 65069863 +11 73510500 73510992 +11 81551734 81551934 +11 81553835 81554282 +11 81556152 81556537 +11 81556717 81557101 +11 87813427 87814320 +11 87815683 87816063 +11 103270627 103271007 +11 103403270 103403650 +11 103404014 103404527 +11 103404779 103405289 +11 103405809 103406376 +11 103406653 103407036 +11 103407110 103407310 +11 103408089 103409893 +11 103410074 103411211 +11 110876919 110877308 +11 114021166 114021546 +11 123003425 123003857 +11 123139919 123140301 +12 9923 10481 +12 2539174 2539982 +12 3887955 3888335 +12 19795477 19795864 +12 20769413 20769432 +12 21052950 21053330 +12 22005655 22006093 +12 27925108 27925488 +12 31247541 31247923 +12 31247963 31248343 +12 34665177 37429869 +12 40286245 40286625 +12 41363462 41363903 +12 41698591 41698971 +12 41699048 41699573 +12 49817252 49817634 +12 62773865 62774257 +12 80623983 80624183 +12 101486970 101487350 +12 123053921 123054301 +12 126583199 126583772 +12 126584137 126584530 +12 130315425 130315904 +13 16226300 18171400 +13 25984718 25984918 +13 31866923 31867303 +13 33516898 33517278 +13 36065385 36065836 +13 40768206 40768595 +13 53891451 53891831 +13 55971453 55971922 +13 56688341 56688749 +13 72344211 72344591 +13 75592084 75592468 +13 83688313 83688693 +13 84521524 84522274 +13 84522848 84523233 +13 88308157 88308357 +13 95692549 95692935 +13 95693013 95693215 +13 95694449 95695698 +13 95696145 95696512 +13 105488067 105488448 +13 107058662 107059042 +13 109423944 109424560 +14 16000600 18173660 +14 23426306 23426691 +14 32483953 32485298 +14 37490106 37490486 +14 40643840 40644220 +14 43116742 43117122 +14 45238635 45239016 +14 45430378 45430758 +14 46048457 46048837 +14 46847040 46847420 +14 51587295 51587847 +14 83587331 83587894 +14 83588229 83589060 +14 84171262 84171729 +14 84171838 84172846 +14 84173508 84173969 +14 84174279 84174691 +14 86498937 86499317 +15 17058500 19838644 +15 30477565 30477945 +15 32529779 32530159 +15 34715310 34715692 +15 35396110 35396495 +15 40133887 40134759 +15 41157028 41157408 +15 52100391 52100771 +15 54583731 54584111 +15 58152409 58153114 +15 58153292 58153690 +15 58155859 58156155 +15 67040730 67041122 +15 91960163 91960543 +16 3367430 3368546 +16 3369658 3370039 +16 3370150 3370542 +16 3370932 3371445 +16 3371688 3372222 +16 10719290 10720105 +16 10720417 10720781 +16 10721235 10721874 +16 10721900 10722280 +16 10723423 10723623 +16 10723815 10724200 +16 10724415 10724654 +16 20720929 20721312 +16 20721365 20721746 +16 20722103 20722552 +16 34071571 34071629 +16 34131996 34289269 +16 34571482 34597852 +16 34661168 34661267 +16 34919141 34919184 +16 35966577 38269112 +16 38275767 38280684 +16 46380676 46381095 +16 46386376 46386491 +16 46388622 46389053 +16 46390180 46390788 +16 46394471 46395088 +16 46398828 46401647 +16 60470624 60471006 +16 65701465 65701846 +16 67590312 67590692 +16 69358523 69358990 +16 73161120 73161500 +16 82119745 82120125 +17 141682 142062 +17 14171308 14171688 +17 15568187 15568567 +17 19597515 19597985 +17 19598613 19599532 +17 19599799 19600210 +17 19600300 19602064 +17 19602160 19602545 +17 19602886 19603595 +17 19603847 19604047 +17 19604922 19605588 +17 20851029 20851409 +17 21851150 21992060 +17 22519042 22520149 +17 22520322 22521025 +17 22521116 22526407 +17 22526636 22530152 +17 22530381 22532156 +17 22532315 22532940 +17 22551066 22551446 +17 22813591 26716670 +17 26885752 26885795 +17 35654769 35655182 +17 43251640 43251763 +17 43309853 43310048 +17 43315021 43316491 +17 43997535 43997957 +17 53105552 53106565 +17 54902920 54903301 +17 59279406 59279787 +17 63076394 63076777 +17 63393238 63393438 +17 65555244 65555624 +17 72316258 72316638 +17 80617407 80617802 +18 2842087 2842534 +18 8103913 8104113 +18 8846332 8846713 +18 15457976 20865732 +18 34571460 34571840 +18 47853089 47853617 +18 52883627 52884007 +18 59288306 59288686 +18 61874562 61874960 +18 77455900 77456280 +19 246899 247452 +19 12105016 12105399 +19 13362989 13363369 +19 24182199 27257542 +19 27741787 27741868 +19 36271917 36272148 +19 37572465 37572846 +19 37576134 37576516 +19 46122944 46123324 +19 47941356 47941426 +19 54794749 54795129 +19 56691535 56691736 +19 56922158 56922601 +2 638427 638808 +2 1087103 1087484 +2 16271753 16272134 +2 22316878 22317258 +2 24644617 24644997 +2 32916201 32916632 +2 33767290 33767703 +2 33964664 33965045 +2 36276769 36277149 +2 40784787 40785278 +2 49229452 49230058 +2 50588765 50589566 +2 54451654 54452034 +2 57648677 57649057 +2 67953669 67954049 +2 75063567 75063994 +2 81666317 81666849 +2 82814941 82815321 +2 82815451 82816236 +2 82816261 82816647 +2 82818378 82818748 +2 82820800 82821005 +2 85068666 85069046 +2 87824709 87825530 +2 89272789 89273133 +2 89827607 89827706 +2 89828636 89828710 +2 89828842 89828942 +2 89833685 89833793 +2 89839592 89839709 +2 89909317 89909789 +2 90379778 90402456 +2 92081223 92081398 +2 92188125 94293463 +2 94499181 94570956 +2 94898976 94899645 +2 94900639 94900840 +2 94901421 94901808 +2 97189431 97189813 +2 102482582 102482962 +2 102505606 102505987 +2 110072034 110072434 +2 110299106 110299346 +2 116751234 116751614 +2 116752004 116752448 +2 116752517 116752897 +2 117020171 117020552 +2 117021107 117022152 +2 117022438 117024038 +2 117024277 117025093 +2 117025205 117025670 +2 117026130 117026512 +2 120211535 120212064 +2 120212685 120213069 +2 120213761 120214143 +2 120214590 120215370 +2 121220135 121220515 +2 124680743 124681182 +2 125812046 125812548 +2 129090774 129091154 +2 130272174 130272615 +2 130273451 130273981 +2 130274326 130274992 +2 130275174 130275744 +2 130276119 130276500 +2 130277774 130278727 +2 130279995 130280729 +2 130280827 130281440 +2 130557359 130557607 +2 130563142 130563396 +2 131369643 131369925 +2 131370949 131371562 +2 131371916 131372361 +2 131372758 131373137 +2 131379317 131380344 +2 131381592 131381973 +2 131382344 131382728 +2 131382772 131382974 +2 131383079 131384016 +2 131384051 131384621 +2 131384898 131385281 +2 131385356 131385794 +2 140217229 140218044 +2 140220209 140220840 +2 140220940 140221140 +2 140221198 140222369 +2 140222545 140223623 +2 140223647 140224297 +2 143088644 143089042 +2 143089938 143090358 +2 143090898 143091662 +2 143092255 143092646 +2 143093556 143093941 +2 143094515 143094999 +2 143095614 143095994 +2 143096048 143096428 +2 143096470 143097336 +2 143097466 143097981 +2 143100621 143101005 +2 147048574 147048955 +2 147244849 147245229 +2 147265034 147265432 +2 148822913 148823295 +2 148881545 148882032 +2 155196092 155196473 +2 155263345 155264313 +2 155264362 155264562 +2 155264599 155264982 +2 155311420 155311995 +2 155313539 155313922 +2 156828628 156829008 +2 162517271 162517651 +2 164117001 164117382 +2 166414323 166414779 +2 167378863 167379244 +2 168652433 168652813 +2 179739184 179739689 +2 190593881 190594262 +2 196204680 196205060 +2 201212170 201212612 +2 201212648 201212854 +2 201212903 201213386 +2 201214659 201215040 +2 201549404 201549784 +2 201550130 201550513 +2 201557568 201557948 +2 202614117 202614527 +2 202615371 202615757 +2 202617016 202617398 +2 202618435 202618819 +2 202619754 202620134 +2 211773627 211774158 +2 211774322 211775192 +2 211775641 211776712 +2 211777034 211777417 +2 211777802 211778269 +2 211778916 211779562 +2 215573163 215573544 +2 226722088 226722596 +2 237521663 237522775 +2 237522862 237523652 +20 5999469 5999849 +20 9168743 9169145 +20 10441916 10442296 +20 13167142 13167534 +20 18449173 18449556 +20 22078162 22078542 +20 24024376 24024757 +20 26438448 28554562 +20 28644084 29015573 +20 29125977 29294639 +20 30744370 30744939 +20 30746748 30747241 +20 31051540 31106909 +20 31157044 31159116 +20 31161652 31223331 +20 34688743 34689039 +20 47894699 47896109 +20 57063873 57064279 +20 57357555 57358134 +20 57358221 57359428 +20 57359451 57360972 +20 63644937 63645318 +21 6369257 6372342 +21 7201205 7327885 +21 7919585 7919691 +21 8211710 8211892 +21 8212412 8212570 +21 8213694 8213987 +21 8219372 8220330 +21 8234456 8234568 +21 8394767 8394902 +21 8395471 8395591 +21 8396751 8397011 +21 8445918 8446080 +21 8446629 8446729 +21 8446925 8447070 +21 8595669 8595768 +21 8844362 8844855 +21 8846669 8847382 +21 10014674 10015194 +21 10650900 12965800 +21 16645305 16645685 +21 32095835 32096215 +21 35890413 35890796 +21 44474913 44475301 +21 45376056 45376517 +22 10863370 10863448 +22 11210951 11215489 +22 11854150 11854643 +22 11856460 11857173 +22 11974159 11974336 +22 12135181 12135894 +22 12137711 12138204 +22 12691742 12694097 +22 12954427 15057495 +22 15153934 15211502 +22 15940533 16085728 +22 32894952 32895345 +22 33819338 33819538 +22 35885491 35885898 +22 36172705 36173085 +22 36177875 36178257 +22 46470112 46470493 +22 50086003 50086529 +22 50806858 50808224 +3 3571912 3572292 +3 24705149 24705529 +3 25467328 25467722 +3 29797534 29797914 +3 33548103 33548483 +3 40252107 40253916 +3 41532177 41532556 +3 43229296 43229733 +3 68658875 68659467 +3 68670345 68670734 +3 73054640 73055020 +3 82655447 82655827 +3 89588895 89589538 +3 90269605 90722189 +3 90774880 91249595 +3 91519649 93657524 +3 93705477 93800019 +3 96475262 96475643 +3 96617014 96618680 +3 106894019 106894441 +3 106895181 106895568 +3 106896124 106896504 +3 106898661 106899022 +3 106899753 106900122 +3 106901799 106902741 +3 106903188 106903605 +3 119947198 119947578 +3 120721858 120722610 +3 122688557 122688938 +3 125982519 125982900 +3 127005357 127005745 +3 128988979 128989359 +3 137095968 137096348 +3 142662232 142662612 +3 152919604 152919995 +3 153658704 153659087 +3 160947473 160948127 +3 166159726 166160108 +3 166160260 166160644 +3 166161631 166162087 +3 166226563 166226945 +3 166232406 166232886 +3 166232970 166233355 +3 166474023 166474223 +3 171534313 171534700 +3 177010776 177011156 +3 192880587 192880967 +4 5404508 5404897 +4 12640142 12640815 +4 14506099 14506467 +4 17061824 17062213 +4 18949310 18949691 +4 22502173 22502553 +4 25717756 25718136 +4 25718275 25718655 +4 25719398 25719626 +4 27730251 27730747 +4 30884524 30884906 +4 32280109 32280489 +4 41023064 41023448 +4 47772100 47772544 +4 49136056 49136102 +4 49141052 49141147 +4 49246355 49246848 +4 49548607 49549100 +4 49631231 49658125 +4 49708086 51743949 +4 51793952 51817249 +4 55327979 55328462 +4 64606369 64606752 +4 64606841 64607360 +4 64607395 64607789 +4 64607976 64608801 +4 64608937 64609326 +4 64609811 64610876 +4 64611176 64611617 +4 66065193 66065631 +4 68050141 68050521 +4 68572333 68572774 +4 78008402 78008882 +4 83383282 83383662 +4 89731703 89732163 +4 92701787 92702300 +4 107501924 107502304 +4 112372589 112372969 +4 116296652 116297040 +4 116297165 116297545 +4 116297659 116298726 +4 116299003 116300416 +4 128081280 128081956 +4 140929567 140929947 +4 143017907 143018107 +4 143347973 143348354 +4 144379497 144379877 +4 155076906 155077288 +4 155452733 155452935 +4 155453928 155454313 +4 155454407 155455447 +4 155455566 155455766 +4 155457624 155458008 +4 155459547 155459747 +4 155460171 155460553 +4 155461093 155461689 +4 155462078 155463456 +4 155463701 155464839 +4 155464895 155465305 +4 155465580 155466624 +4 157628391 157628774 +4 160044429 160044815 +4 161449477 161449857 +4 161788291 161788671 +4 162421207 162421721 +4 172036714 172037094 +4 179069259 179069639 +4 183489243 183489623 +4 189844495 189844576 +5 12284 12523 +5 12952 13361 +5 5395563 5395943 +5 5396182 5396616 +5 5396675 5397057 +5 8619083 8619464 +5 8619927 8620307 +5 8620707 8621192 +5 8621953 8622333 +5 8622354 8622753 +5 32927394 32927776 +5 37164286 37164673 +5 45913363 50265419 +5 60761358 60762176 +5 66253509 66253889 +5 73775720 73776112 +5 79089860 79090240 +5 80649841 80652548 +5 94567275 94571098 +5 97678633 97679016 +5 98409947 98410327 +5 98410700 98411257 +5 99813005 99813388 +5 100045805 100055225 +5 106553187 106553689 +5 111488864 111489244 +5 119127218 119127602 +5 121030820 121031445 +5 122338658 122339042 +5 123760111 123760622 +5 123760719 123761918 +5 134923133 134928692 +5 136533606 136533986 +5 137305006 137305387 +5 152198765 152199145 +5 160600365 160600745 +5 163146853 163147234 +5 163959711 163960091 +5 164673914 164674288 +5 166530241 166530641 +5 170635389 170635774 +6 1705930 1706304 +6 3943769 3944149 +6 29454054 29454435 +6 32706020 32706850 +6 43490986 43491370 +6 54899048 54899248 +6 58554346 59830578 +6 61278527 61521106 +6 61573960 61574809 +6 72747981 72748361 +6 72799169 72799549 +6 76708390 76708770 +6 88555202 88555591 +6 91726616 91727363 +6 94446937 94447370 +6 96941571 96941951 +6 104699855 104700055 +6 114377334 114377534 +6 122764824 122765204 +6 126478329 126478709 +6 127735330 127735710 +6 132799554 132799939 +6 133150492 133150881 +6 133930809 133931190 +6 138133082 138133462 +6 143077647 143078031 +6 153666229 153666618 +6 153667363 153667744 +6 153668187 153668753 +6 153669025 153669419 +6 156547729 156548118 +6 163638068 163638448 +7 18021726 18022106 +7 22748471 22748854 +7 33749120 33749500 +7 36228567 36229008 +7 37387570 37387950 +7 45251808 45252289 +7 55369049 55369429 +7 57167688 57168071 +7 57168472 57168852 +7 57169046 57169430 +7 57169550 57169932 +7 57170307 57170523 +7 57170675 57171410 +7 57171502 57172122 +7 57173798 57174181 +7 57174854 57175239 +7 57185615 57185995 +7 57186105 57186589 +7 57187287 57188033 +7 57188305 57188872 +7 57189116 57189730 +7 57190949 57191332 +7 57191618 57191818 +7 57192132 57192860 +7 57193489 57193872 +7 57193974 57194701 +7 57194829 57195210 +7 57196302 57197490 +7 57198263 57198644 +7 57879605 58032504 +7 58166363 62995324 +7 63094673 63095057 +7 64104133 64104513 +7 64105294 64106415 +7 64106627 64107010 +7 64108329 64108798 +7 64110007 64110707 +7 64111376 64111804 +7 64111957 64112849 +7 67627830 67628213 +7 68097607 68097990 +7 68736347 68736811 +7 69331805 69332005 +7 69332037 69332438 +7 69333013 69333393 +7 69333597 69334167 +7 72088575 72088955 +7 83100026 83100406 +7 83469984 83470184 +7 83855080 83855464 +7 95851249 95851629 +7 104989516 104989896 +7 112372484 112372865 +7 112374724 112374950 +7 117263552 117264184 +7 117264231 117264614 +7 130116678 130117058 +7 141173000 141173384 +7 141801916 141802451 +7 141802901 141803366 +7 141804074 141804274 +7 141804814 141805507 +7 142665099 142667846 +7 143187483 143187863 +7 145997159 145997608 +7 150131843 150132229 +7 153968598 153968979 +7 159294463 159294846 +8 13353292 13353679 +8 16056863 16057063 +8 18849121 18849571 +8 20551162 20551554 +8 32805708 32806092 +8 33010514 33010894 +8 33011359 33014071 +8 33014510 33014895 +8 33015020 33015853 +8 36277446 36278060 +8 36278272 36278791 +8 36278835 36279634 +8 40070431 40070867 +8 43237631 43242390 +8 43937900 45969600 +8 46827305 46827914 +8 46828298 46829961 +8 46830195 46831222 +8 46837581 46837961 +8 46838101 46838484 +8 50758259 50758639 +8 56736733 56736933 +8 61303079 61303460 +8 67580689 67581493 +8 67581588 67581972 +8 67582178 67582568 +8 67585216 67585693 +8 67585787 67586175 +8 67587282 67587922 +8 69102851 69103234 +8 72985528 72985923 +8 74828644 74829025 +8 76201592 76202319 +8 76645407 76645800 +8 97907908 97908279 +8 99495689 99496133 +8 102774315 102774695 +8 103082925 103083379 +8 103083704 103084399 +8 103084730 103085110 +8 103085323 103085806 +8 103086859 103087242 +8 108533901 108534281 +8 110933150 110933533 +8 110934510 110935010 +8 111248936 111249316 +8 120224204 120224584 +8 127053876 127054257 +8 127968653 127969034 +8 133615761 133616142 +8 133755390 133755856 +9 5091131 5091511 +9 5091962 5093013 +9 5093063 5094123 +9 5094192 5094697 +9 5094931 5095816 +9 5096206 5096816 +9 5097188 5097890 +9 5098134 5098516 +9 5099352 5099552 +9 5100044 5100427 +9 5108063 5108592 +9 5109193 5109986 +9 5110030 5110411 +9 9896970 9897350 +9 15866612 15866992 +9 18336471 18336854 +9 31498260 31498640 +9 33656533 33658316 +9 33658346 33659299 +9 34998988 34999474 +9 36466192 36466572 +9 43153721 45525161 +9 64045550 64046043 +9 64047855 64048422 +9 65048153 65079624 +9 68251002 68251071 +9 72788174 72788555 +9 78741395 78741775 +9 78742155 78742969 +9 78743199 78743630 +9 78744108 78744492 +9 78810721 78811113 +9 79804550 79804933 +9 80564643 80565085 +9 80565478 80565941 +9 81747641 81748021 +9 82427689 82428071 +9 92108965 92109347 +9 92539106 92539763 +9 95876956 95877338 +9 117109914 117110296 +9 122505687 122506067 +9 129878699 129879081 +9 134164478 134165354 +9 134170819 134171060 +X 4059512 4059712 +X 5168678 5169232 +X 5169733 5170646 +X 15727702 15728089 +X 17116414 17116794 +X 24056083 24056470 +X 24375345 24375545 +X 33762401 33762781 +X 55178596 55179289 +X 55179434 55180459 +X 55181196 55182790 +X 55183051 55184112 +X 58061543 62821716 +X 62841379 62841765 +X 62842257 62842639 +X 70119464 70119845 +X 70127233 70127620 +X 77501934 77502314 +X 78561721 78561921 +X 84403779 84404168 +X 100027094 100027475 +X 102010329 102010712 +X 102011531 102011915 +X 102772405 102772791 +X 102785904 102786287 +X 102798001 102798386 +X 102802747 102803161 +X 102809395 102809788 +X 104409869 104410249 +X 106239694 106239894 +X 111416893 111417294 +X 126471558 126473451 +X 126728884 126729272 +X 126729326 126729709 +X 126729837 126730217 +X 126730716 126731106 +X 126731624 126732029 +X 129983338 129983538 +X 133041871 133042251 +X 135292293 135292493 +X 143430213 143430837 +X 143431144 143431537 +X 143431716 143432219 +X 143432410 143433212 +X 143433510 143434156 +X 143543636 143544023 +X 146995842 146996224 +Y 4344757 4344879 +Y 9141870 9141995 +Y 10203380 10266932 +Y 10316749 10544446 +Y 10594583 10626838 +Y 10663669 10663716 +Y 10744417 10921497 +Y 11290797 11334278 +Y 11493053 11592850 +Y 11671014 11671046 +Y 11721528 11749472 +Y 56694632 56889743 From 1b431aebbdf3bc4d2b399cbdf6d9900987eb08a6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:08:31 +0100 Subject: [PATCH 337/538] Keep the manual annotated blacklist files --- .../blacklists/v1.0/GRCm38-blacklist.v1.bed | 164 ++++++++++++++++++ assets/blacklists/v1.0/mm10-blacklist.v1.bed | 164 ++++++++++++++++++ mm10-blacklist.bed | 164 ++++++++++++++++++ 3 files changed, 492 insertions(+) create mode 100755 assets/blacklists/v1.0/GRCm38-blacklist.v1.bed create mode 100755 assets/blacklists/v1.0/mm10-blacklist.v1.bed create mode 100755 mm10-blacklist.bed diff --git a/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed b/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed new file mode 100755 index 000000000..3699d020a --- /dev/null +++ b/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed @@ -0,0 +1,164 @@ +10 3110060 3110270 +10 22142530 22142880 +10 22142830 22143070 +10 58223870 58224100 +10 58225260 58225500 +10 58228320 58228520 +11 3148660 3148860 +11 3154960 3155170 +11 3158530 3158750 +11 3161780 3161990 +11 3167020 3167250 +11 3169390 3169620 +11 3172450 3172670 +11 3172950 3173190 +11 3184190 3185750 +11 3185700 3186360 +11 3186330 3189230 +11 3189190 3190740 +11 3190750 3191000 +11 3190960 3194430 +11 3194400 3195310 +11 3195240 3197220 +11 3197340 3197950 +11 3197890 3198700 +11 3198630 3199440 +11 3199350 3200120 +11 54139940 54140230 +11 54140470 54140740 +11 88967720 88969600 +11 88969850 88970350 +11 109011550 109012090 +12 3109920 3110150 +12 105436040 105436270 +13 3372960 3373380 +13 3373410 3373630 +13 77438870 77439090 +13 97190460 97190690 +13 99790830 99791090 +13 119488570 119489320 +13 119597600 119598320 +13 119599860 119600050 +13 119601360 119601600 +13 119601800 119602210 +13 119602360 119602580 +13 119609430 119611430 +13 119612760 119613370 +13 119613360 119617690 +14 19415650 19417330 +14 19417240 19417660 +14 19417570 19418920 +14 19418830 19419720 +14 47454330 47454510 +15 75085430 75085920 +15 75085990 75086240 +15 75086150 75086550 +15 75086540 75087110 +16 11143960 11144170 +16 57391420 57391740 +17 13305860 13306280 +17 13590820 13591650 +17 13654880 13655120 +17 36231170 36231390 +17 39842910 39846780 +17 39846920 39847160 +17 39847090 39847310 +17 39847400 39847720 +17 39847630 39848880 +18 3005550 3005770 +18 3005700 3006050 +18 12949190 12949400 +18 40307970 40308340 +18 68691990 68692230 +19 45650030 45650310 +19 61199640 61199880 +19 61224310 61224530 +19 61266550 61266760 +19 61266920 61267210 +1 24612620 24612850 +1 48881430 48881690 +1 58613870 58614090 +1 78573920 78574140 +1 88217960 88221950 +1 88223300 88224760 +1 133595120 133595340 +1 183299040 183299660 +1 195241610 195241820 +2 3050030 3050410 +2 5379200 5379420 +2 22743580 22743780 +2 22744760 22744980 +2 90395030 90395240 +2 98662130 98663060 +2 98663540 98664150 +2 98664780 98665020 +2 98664970 98665250 +2 98666140 98667390 +2 181917260 181917590 +2 181917550 181917990 +2 181918970 181919260 +2 181928340 181928570 +2 181928950 181929170 +2 181929220 181929430 +2 181930800 181931020 +3 5860530 5860830 +3 8245690 8245930 +3 8246280 8246640 +4 34935690 34935910 +4 70378040 70378320 +4 118548460 118548700 +5 14914900 14915120 +5 15006590 15006820 +5 15462500 15462730 +5 15463060 15463290 +5 15486990 15487190 +5 134378920 134379160 +5 137152130 137152510 +5 146260900 146261410 +6 3201380 3201610 +6 103648970 103649310 +7 12010340 12010870 +8 14306800 14307040 +8 15519790 15520030 +8 19711890 19712070 +9 2999900 3000320 +9 3000270 3000570 +9 3000900 3001100 +9 3001300 3001520 +9 3004390 3004680 +9 3004690 3004900 +9 3005000 3005220 +9 3005800 3006030 +9 3006960 3007180 +9 3008880 3009040 +9 3015170 3015420 +9 3015590 3015830 +9 3016770 3016980 +9 3017410 3017650 +9 3018240 3018540 +9 3018650 3018870 +9 3019220 3019450 +9 3021160 3021370 +9 3021990 3022300 +9 3024660 3024880 +9 3025350 3025690 +9 3026530 3026860 +9 3027010 3027250 +9 3027660 3027880 +9 3028670 3028880 +9 3030040 3030330 +9 3031910 3032130 +9 3032250 3032560 +9 3032570 3032790 +9 3034090 3034300 +9 3034950 3035160 +9 3035610 3036180 +9 3036200 3036480 +9 3036420 3036660 +9 3037250 3037460 +9 3037910 3038120 +9 3038050 3038300 +9 24541940 24542200 +9 35305120 35305620 +9 110281190 110281400 +9 123872950 123873160 diff --git a/assets/blacklists/v1.0/mm10-blacklist.v1.bed b/assets/blacklists/v1.0/mm10-blacklist.v1.bed new file mode 100755 index 000000000..8c71cd3ba --- /dev/null +++ b/assets/blacklists/v1.0/mm10-blacklist.v1.bed @@ -0,0 +1,164 @@ +chr10 3110060 3110270 +chr10 22142530 22142880 +chr10 22142830 22143070 +chr10 58223870 58224100 +chr10 58225260 58225500 +chr10 58228320 58228520 +chr11 3148660 3148860 +chr11 3154960 3155170 +chr11 3158530 3158750 +chr11 3161780 3161990 +chr11 3167020 3167250 +chr11 3169390 3169620 +chr11 3172450 3172670 +chr11 3172950 3173190 +chr11 3184190 3185750 +chr11 3185700 3186360 +chr11 3186330 3189230 +chr11 3189190 3190740 +chr11 3190750 3191000 +chr11 3190960 3194430 +chr11 3194400 3195310 +chr11 3195240 3197220 +chr11 3197340 3197950 +chr11 3197890 3198700 +chr11 3198630 3199440 +chr11 3199350 3200120 +chr11 54139940 54140230 +chr11 54140470 54140740 +chr11 88967720 88969600 +chr11 88969850 88970350 +chr11 109011550 109012090 +chr12 3109920 3110150 +chr12 105436040 105436270 +chr13 3372960 3373380 +chr13 3373410 3373630 +chr13 77438870 77439090 +chr13 97190460 97190690 +chr13 99790830 99791090 +chr13 119488570 119489320 +chr13 119597600 119598320 +chr13 119599860 119600050 +chr13 119601360 119601600 +chr13 119601800 119602210 +chr13 119602360 119602580 +chr13 119609430 119611430 +chr13 119612760 119613370 +chr13 119613360 119617690 +chr14 19415650 19417330 +chr14 19417240 19417660 +chr14 19417570 19418920 +chr14 19418830 19419720 +chr14 47454330 47454510 +chr15 75085430 75085920 +chr15 75085990 75086240 +chr15 75086150 75086550 +chr15 75086540 75087110 +chr16 11143960 11144170 +chr16 57391420 57391740 +chr17 13305860 13306280 +chr17 13590820 13591650 +chr17 13654880 13655120 +chr17 36231170 36231390 +chr17 39842910 39846780 +chr17 39846920 39847160 +chr17 39847090 39847310 +chr17 39847400 39847720 +chr17 39847630 39848880 +chr18 3005550 3005770 +chr18 3005700 3006050 +chr18 12949190 12949400 +chr18 40307970 40308340 +chr18 68691990 68692230 +chr19 45650030 45650310 +chr19 61199640 61199880 +chr19 61224310 61224530 +chr19 61266550 61266760 +chr19 61266920 61267210 +chr1 24612620 24612850 +chr1 48881430 48881690 +chr1 58613870 58614090 +chr1 78573920 78574140 +chr1 88217960 88221950 +chr1 88223300 88224760 +chr1 133595120 133595340 +chr1 183299040 183299660 +chr1 195241610 195241820 +chr2 3050030 3050410 +chr2 5379200 5379420 +chr2 22743580 22743780 +chr2 22744760 22744980 +chr2 90395030 90395240 +chr2 98662130 98663060 +chr2 98663540 98664150 +chr2 98664780 98665020 +chr2 98664970 98665250 +chr2 98666140 98667390 +chr2 181917260 181917590 +chr2 181917550 181917990 +chr2 181918970 181919260 +chr2 181928340 181928570 +chr2 181928950 181929170 +chr2 181929220 181929430 +chr2 181930800 181931020 +chr3 5860530 5860830 +chr3 8245690 8245930 +chr3 8246280 8246640 +chr4 34935690 34935910 +chr4 70378040 70378320 +chr4 118548460 118548700 +chr5 14914900 14915120 +chr5 15006590 15006820 +chr5 15462500 15462730 +chr5 15463060 15463290 +chr5 15486990 15487190 +chr5 134378920 134379160 +chr5 137152130 137152510 +chr5 146260900 146261410 +chr6 3201380 3201610 +chr6 103648970 103649310 +chr7 12010340 12010870 +chr8 14306800 14307040 +chr8 15519790 15520030 +chr8 19711890 19712070 +chr9 2999900 3000320 +chr9 3000270 3000570 +chr9 3000900 3001100 +chr9 3001300 3001520 +chr9 3004390 3004680 +chr9 3004690 3004900 +chr9 3005000 3005220 +chr9 3005800 3006030 +chr9 3006960 3007180 +chr9 3008880 3009040 +chr9 3015170 3015420 +chr9 3015590 3015830 +chr9 3016770 3016980 +chr9 3017410 3017650 +chr9 3018240 3018540 +chr9 3018650 3018870 +chr9 3019220 3019450 +chr9 3021160 3021370 +chr9 3021990 3022300 +chr9 3024660 3024880 +chr9 3025350 3025690 +chr9 3026530 3026860 +chr9 3027010 3027250 +chr9 3027660 3027880 +chr9 3028670 3028880 +chr9 3030040 3030330 +chr9 3031910 3032130 +chr9 3032250 3032560 +chr9 3032570 3032790 +chr9 3034090 3034300 +chr9 3034950 3035160 +chr9 3035610 3036180 +chr9 3036200 3036480 +chr9 3036420 3036660 +chr9 3037250 3037460 +chr9 3037910 3038120 +chr9 3038050 3038300 +chr9 24541940 24542200 +chr9 35305120 35305620 +chr9 110281190 110281400 +chr9 123872950 123873160 diff --git a/mm10-blacklist.bed b/mm10-blacklist.bed new file mode 100755 index 000000000..8c71cd3ba --- /dev/null +++ b/mm10-blacklist.bed @@ -0,0 +1,164 @@ +chr10 3110060 3110270 +chr10 22142530 22142880 +chr10 22142830 22143070 +chr10 58223870 58224100 +chr10 58225260 58225500 +chr10 58228320 58228520 +chr11 3148660 3148860 +chr11 3154960 3155170 +chr11 3158530 3158750 +chr11 3161780 3161990 +chr11 3167020 3167250 +chr11 3169390 3169620 +chr11 3172450 3172670 +chr11 3172950 3173190 +chr11 3184190 3185750 +chr11 3185700 3186360 +chr11 3186330 3189230 +chr11 3189190 3190740 +chr11 3190750 3191000 +chr11 3190960 3194430 +chr11 3194400 3195310 +chr11 3195240 3197220 +chr11 3197340 3197950 +chr11 3197890 3198700 +chr11 3198630 3199440 +chr11 3199350 3200120 +chr11 54139940 54140230 +chr11 54140470 54140740 +chr11 88967720 88969600 +chr11 88969850 88970350 +chr11 109011550 109012090 +chr12 3109920 3110150 +chr12 105436040 105436270 +chr13 3372960 3373380 +chr13 3373410 3373630 +chr13 77438870 77439090 +chr13 97190460 97190690 +chr13 99790830 99791090 +chr13 119488570 119489320 +chr13 119597600 119598320 +chr13 119599860 119600050 +chr13 119601360 119601600 +chr13 119601800 119602210 +chr13 119602360 119602580 +chr13 119609430 119611430 +chr13 119612760 119613370 +chr13 119613360 119617690 +chr14 19415650 19417330 +chr14 19417240 19417660 +chr14 19417570 19418920 +chr14 19418830 19419720 +chr14 47454330 47454510 +chr15 75085430 75085920 +chr15 75085990 75086240 +chr15 75086150 75086550 +chr15 75086540 75087110 +chr16 11143960 11144170 +chr16 57391420 57391740 +chr17 13305860 13306280 +chr17 13590820 13591650 +chr17 13654880 13655120 +chr17 36231170 36231390 +chr17 39842910 39846780 +chr17 39846920 39847160 +chr17 39847090 39847310 +chr17 39847400 39847720 +chr17 39847630 39848880 +chr18 3005550 3005770 +chr18 3005700 3006050 +chr18 12949190 12949400 +chr18 40307970 40308340 +chr18 68691990 68692230 +chr19 45650030 45650310 +chr19 61199640 61199880 +chr19 61224310 61224530 +chr19 61266550 61266760 +chr19 61266920 61267210 +chr1 24612620 24612850 +chr1 48881430 48881690 +chr1 58613870 58614090 +chr1 78573920 78574140 +chr1 88217960 88221950 +chr1 88223300 88224760 +chr1 133595120 133595340 +chr1 183299040 183299660 +chr1 195241610 195241820 +chr2 3050030 3050410 +chr2 5379200 5379420 +chr2 22743580 22743780 +chr2 22744760 22744980 +chr2 90395030 90395240 +chr2 98662130 98663060 +chr2 98663540 98664150 +chr2 98664780 98665020 +chr2 98664970 98665250 +chr2 98666140 98667390 +chr2 181917260 181917590 +chr2 181917550 181917990 +chr2 181918970 181919260 +chr2 181928340 181928570 +chr2 181928950 181929170 +chr2 181929220 181929430 +chr2 181930800 181931020 +chr3 5860530 5860830 +chr3 8245690 8245930 +chr3 8246280 8246640 +chr4 34935690 34935910 +chr4 70378040 70378320 +chr4 118548460 118548700 +chr5 14914900 14915120 +chr5 15006590 15006820 +chr5 15462500 15462730 +chr5 15463060 15463290 +chr5 15486990 15487190 +chr5 134378920 134379160 +chr5 137152130 137152510 +chr5 146260900 146261410 +chr6 3201380 3201610 +chr6 103648970 103649310 +chr7 12010340 12010870 +chr8 14306800 14307040 +chr8 15519790 15520030 +chr8 19711890 19712070 +chr9 2999900 3000320 +chr9 3000270 3000570 +chr9 3000900 3001100 +chr9 3001300 3001520 +chr9 3004390 3004680 +chr9 3004690 3004900 +chr9 3005000 3005220 +chr9 3005800 3006030 +chr9 3006960 3007180 +chr9 3008880 3009040 +chr9 3015170 3015420 +chr9 3015590 3015830 +chr9 3016770 3016980 +chr9 3017410 3017650 +chr9 3018240 3018540 +chr9 3018650 3018870 +chr9 3019220 3019450 +chr9 3021160 3021370 +chr9 3021990 3022300 +chr9 3024660 3024880 +chr9 3025350 3025690 +chr9 3026530 3026860 +chr9 3027010 3027250 +chr9 3027660 3027880 +chr9 3028670 3028880 +chr9 3030040 3030330 +chr9 3031910 3032130 +chr9 3032250 3032560 +chr9 3032570 3032790 +chr9 3034090 3034300 +chr9 3034950 3035160 +chr9 3035610 3036180 +chr9 3036200 3036480 +chr9 3036420 3036660 +chr9 3037250 3037460 +chr9 3037910 3038120 +chr9 3038050 3038300 +chr9 24541940 24542200 +chr9 35305120 35305620 +chr9 110281190 110281400 +chr9 123872950 123873160 From 30d0d68f6851bb110967eeb79a14280ca215cae5 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:09:00 +0100 Subject: [PATCH 338/538] Update igenomes with the new or reallocated blacklist files --- conf/igenomes.config | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 7a1b3ac6d..1665112d5 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -22,7 +22,7 @@ params { readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" mito_name = "MT" macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v1.0/GRCh37-blacklist.v1.bed" } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" @@ -34,7 +34,7 @@ params { bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" mito_name = "chrM" macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v3.0/hg38-blacklist.v3.bed" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" @@ -47,7 +47,7 @@ params { readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" mito_name = "MT" macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed" } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" @@ -281,7 +281,7 @@ params { bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" mito_name = "chrM" macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v3.0/hg38-blacklist.v3.bed" } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" @@ -294,7 +294,7 @@ params { readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" mito_name = "chrM" macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v1.0/hg19-blacklist.v1.bed" } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" @@ -307,7 +307,7 @@ params { readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" mito_name = "chrM" macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" + blacklist = "${projectDir}/assets/blacklists/v1.0/mm10-blacklist.v1.bed" } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" From c2094808c50f35609c31818ed310ec2dca0d0c70 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:09:17 +0100 Subject: [PATCH 339/538] Update changelog --- CHANGELOG.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98b5d4b01..8e496fce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,14 +12,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` * Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) * Added `python3` shebang to appropriate scripts in `bin/` directory -* [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, -via the `--aligner` parameter +* [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter ### Other enhancements & fixes * Update pipeline template to nf-core/tools `2.1` * Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) * Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder +* [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. ### Parameters @@ -27,7 +27,6 @@ via the `--aligner` parameter |------------------------------|----------------------------| | `--clusterOptions` | | | `--conda` | `--enable_conda` | -| `--single_end` | | | | `--skip_qc` | | | `--aligner` | | | `--save_unaligned` | @@ -43,12 +42,29 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi -| Dependency | Old version | New version | -|-------------|-------------|-------------| -| `deeptools` | 3.4.3 | 3.5.1 | + +| Dependency | Old version | New version | +|---------------|-------------|-------------| +| `` | | | +| `` | | | +| `` | | | +| `` | | | +| `deeptools` | 3.4.3 | 3.5.1 | +| `fastqc` | | 0.11.9 | +| `` | | | +| `trim-galore` | | | +| `samtools` | | | +| `` | | | +| `` | | | +| `` | | | +| `` | | | +| `` | | | + +| `multiqc` | 1.10 | 1.13 | | `samtools` | 1.10 | 1.13 | +--> + > __NB:__ Dependency has been __updated__ if both old and new version information is present. > __NB:__ Dependency has been __added__ if just the new version information is present. > __NB:__ Dependency has been __removed__ if version information isn't present. From 7bac1def45c6fa98b21cd561f49396c37c477948 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:11:05 +0100 Subject: [PATCH 340/538] Add again the logic for using blacklist bed files --- subworkflows/local/prepare_genome.nf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 3c3df3e90..a88d05725 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -34,6 +34,7 @@ workflow PREPARE_GENOME { // // Uncompress genome fasta file if required // + ch_fasta = Channel.empty() if (params.fasta.endsWith('.gz')) { ch_fasta = GUNZIP_FASTA ( params.fasta ).gunzip ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) @@ -111,12 +112,16 @@ workflow PREPARE_GENOME { // // Prepare genome intervals for filtering by removing regions in blacklist file // + ch_genome_filtered_bed = Channel.empty() + GENOME_BLACKLIST_REGIONS ( CUSTOM_GETCHROMSIZES.out.sizes, ch_blacklist.ifEmpty([]) ) + ch_genome_filtered_bed = GENOME_BLACKLIST_REGIONS.out.bed ch_versions = ch_versions.mix(GENOME_BLACKLIST_REGIONS.out.versions) + // // Uncompress BWA index or generate from scratch if required // @@ -176,7 +181,7 @@ workflow PREPARE_GENOME { gtf = ch_gtf // path: genome.gtf gene_bed = ch_gene_bed // path: gene.bed chrom_sizes = ch_chrom_sizes // path: genome.sizes - blacklist = ch_blacklist // path: blacklist.bed + filtered_bed = ch_genome_filtered_bed // path: *.include_regions.bed bwa_index = ch_bwa_index // path: bwa/index/ bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ star_index = ch_star_index // path: star/index/ From 936d3a8095424bde55c85c46051ab0610bae9080 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:36:36 +0100 Subject: [PATCH 341/538] Remove v1 bed files from mouse --- .../blacklists/v1.0/GRCm38-blacklist.v1.bed | 164 ------------------ assets/blacklists/v1.0/mm10-blacklist.v1.bed | 164 ------------------ conf/igenomes.config | 4 +- 3 files changed, 2 insertions(+), 330 deletions(-) delete mode 100755 assets/blacklists/v1.0/GRCm38-blacklist.v1.bed delete mode 100755 assets/blacklists/v1.0/mm10-blacklist.v1.bed diff --git a/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed b/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed deleted file mode 100755 index 3699d020a..000000000 --- a/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed +++ /dev/null @@ -1,164 +0,0 @@ -10 3110060 3110270 -10 22142530 22142880 -10 22142830 22143070 -10 58223870 58224100 -10 58225260 58225500 -10 58228320 58228520 -11 3148660 3148860 -11 3154960 3155170 -11 3158530 3158750 -11 3161780 3161990 -11 3167020 3167250 -11 3169390 3169620 -11 3172450 3172670 -11 3172950 3173190 -11 3184190 3185750 -11 3185700 3186360 -11 3186330 3189230 -11 3189190 3190740 -11 3190750 3191000 -11 3190960 3194430 -11 3194400 3195310 -11 3195240 3197220 -11 3197340 3197950 -11 3197890 3198700 -11 3198630 3199440 -11 3199350 3200120 -11 54139940 54140230 -11 54140470 54140740 -11 88967720 88969600 -11 88969850 88970350 -11 109011550 109012090 -12 3109920 3110150 -12 105436040 105436270 -13 3372960 3373380 -13 3373410 3373630 -13 77438870 77439090 -13 97190460 97190690 -13 99790830 99791090 -13 119488570 119489320 -13 119597600 119598320 -13 119599860 119600050 -13 119601360 119601600 -13 119601800 119602210 -13 119602360 119602580 -13 119609430 119611430 -13 119612760 119613370 -13 119613360 119617690 -14 19415650 19417330 -14 19417240 19417660 -14 19417570 19418920 -14 19418830 19419720 -14 47454330 47454510 -15 75085430 75085920 -15 75085990 75086240 -15 75086150 75086550 -15 75086540 75087110 -16 11143960 11144170 -16 57391420 57391740 -17 13305860 13306280 -17 13590820 13591650 -17 13654880 13655120 -17 36231170 36231390 -17 39842910 39846780 -17 39846920 39847160 -17 39847090 39847310 -17 39847400 39847720 -17 39847630 39848880 -18 3005550 3005770 -18 3005700 3006050 -18 12949190 12949400 -18 40307970 40308340 -18 68691990 68692230 -19 45650030 45650310 -19 61199640 61199880 -19 61224310 61224530 -19 61266550 61266760 -19 61266920 61267210 -1 24612620 24612850 -1 48881430 48881690 -1 58613870 58614090 -1 78573920 78574140 -1 88217960 88221950 -1 88223300 88224760 -1 133595120 133595340 -1 183299040 183299660 -1 195241610 195241820 -2 3050030 3050410 -2 5379200 5379420 -2 22743580 22743780 -2 22744760 22744980 -2 90395030 90395240 -2 98662130 98663060 -2 98663540 98664150 -2 98664780 98665020 -2 98664970 98665250 -2 98666140 98667390 -2 181917260 181917590 -2 181917550 181917990 -2 181918970 181919260 -2 181928340 181928570 -2 181928950 181929170 -2 181929220 181929430 -2 181930800 181931020 -3 5860530 5860830 -3 8245690 8245930 -3 8246280 8246640 -4 34935690 34935910 -4 70378040 70378320 -4 118548460 118548700 -5 14914900 14915120 -5 15006590 15006820 -5 15462500 15462730 -5 15463060 15463290 -5 15486990 15487190 -5 134378920 134379160 -5 137152130 137152510 -5 146260900 146261410 -6 3201380 3201610 -6 103648970 103649310 -7 12010340 12010870 -8 14306800 14307040 -8 15519790 15520030 -8 19711890 19712070 -9 2999900 3000320 -9 3000270 3000570 -9 3000900 3001100 -9 3001300 3001520 -9 3004390 3004680 -9 3004690 3004900 -9 3005000 3005220 -9 3005800 3006030 -9 3006960 3007180 -9 3008880 3009040 -9 3015170 3015420 -9 3015590 3015830 -9 3016770 3016980 -9 3017410 3017650 -9 3018240 3018540 -9 3018650 3018870 -9 3019220 3019450 -9 3021160 3021370 -9 3021990 3022300 -9 3024660 3024880 -9 3025350 3025690 -9 3026530 3026860 -9 3027010 3027250 -9 3027660 3027880 -9 3028670 3028880 -9 3030040 3030330 -9 3031910 3032130 -9 3032250 3032560 -9 3032570 3032790 -9 3034090 3034300 -9 3034950 3035160 -9 3035610 3036180 -9 3036200 3036480 -9 3036420 3036660 -9 3037250 3037460 -9 3037910 3038120 -9 3038050 3038300 -9 24541940 24542200 -9 35305120 35305620 -9 110281190 110281400 -9 123872950 123873160 diff --git a/assets/blacklists/v1.0/mm10-blacklist.v1.bed b/assets/blacklists/v1.0/mm10-blacklist.v1.bed deleted file mode 100755 index 8c71cd3ba..000000000 --- a/assets/blacklists/v1.0/mm10-blacklist.v1.bed +++ /dev/null @@ -1,164 +0,0 @@ -chr10 3110060 3110270 -chr10 22142530 22142880 -chr10 22142830 22143070 -chr10 58223870 58224100 -chr10 58225260 58225500 -chr10 58228320 58228520 -chr11 3148660 3148860 -chr11 3154960 3155170 -chr11 3158530 3158750 -chr11 3161780 3161990 -chr11 3167020 3167250 -chr11 3169390 3169620 -chr11 3172450 3172670 -chr11 3172950 3173190 -chr11 3184190 3185750 -chr11 3185700 3186360 -chr11 3186330 3189230 -chr11 3189190 3190740 -chr11 3190750 3191000 -chr11 3190960 3194430 -chr11 3194400 3195310 -chr11 3195240 3197220 -chr11 3197340 3197950 -chr11 3197890 3198700 -chr11 3198630 3199440 -chr11 3199350 3200120 -chr11 54139940 54140230 -chr11 54140470 54140740 -chr11 88967720 88969600 -chr11 88969850 88970350 -chr11 109011550 109012090 -chr12 3109920 3110150 -chr12 105436040 105436270 -chr13 3372960 3373380 -chr13 3373410 3373630 -chr13 77438870 77439090 -chr13 97190460 97190690 -chr13 99790830 99791090 -chr13 119488570 119489320 -chr13 119597600 119598320 -chr13 119599860 119600050 -chr13 119601360 119601600 -chr13 119601800 119602210 -chr13 119602360 119602580 -chr13 119609430 119611430 -chr13 119612760 119613370 -chr13 119613360 119617690 -chr14 19415650 19417330 -chr14 19417240 19417660 -chr14 19417570 19418920 -chr14 19418830 19419720 -chr14 47454330 47454510 -chr15 75085430 75085920 -chr15 75085990 75086240 -chr15 75086150 75086550 -chr15 75086540 75087110 -chr16 11143960 11144170 -chr16 57391420 57391740 -chr17 13305860 13306280 -chr17 13590820 13591650 -chr17 13654880 13655120 -chr17 36231170 36231390 -chr17 39842910 39846780 -chr17 39846920 39847160 -chr17 39847090 39847310 -chr17 39847400 39847720 -chr17 39847630 39848880 -chr18 3005550 3005770 -chr18 3005700 3006050 -chr18 12949190 12949400 -chr18 40307970 40308340 -chr18 68691990 68692230 -chr19 45650030 45650310 -chr19 61199640 61199880 -chr19 61224310 61224530 -chr19 61266550 61266760 -chr19 61266920 61267210 -chr1 24612620 24612850 -chr1 48881430 48881690 -chr1 58613870 58614090 -chr1 78573920 78574140 -chr1 88217960 88221950 -chr1 88223300 88224760 -chr1 133595120 133595340 -chr1 183299040 183299660 -chr1 195241610 195241820 -chr2 3050030 3050410 -chr2 5379200 5379420 -chr2 22743580 22743780 -chr2 22744760 22744980 -chr2 90395030 90395240 -chr2 98662130 98663060 -chr2 98663540 98664150 -chr2 98664780 98665020 -chr2 98664970 98665250 -chr2 98666140 98667390 -chr2 181917260 181917590 -chr2 181917550 181917990 -chr2 181918970 181919260 -chr2 181928340 181928570 -chr2 181928950 181929170 -chr2 181929220 181929430 -chr2 181930800 181931020 -chr3 5860530 5860830 -chr3 8245690 8245930 -chr3 8246280 8246640 -chr4 34935690 34935910 -chr4 70378040 70378320 -chr4 118548460 118548700 -chr5 14914900 14915120 -chr5 15006590 15006820 -chr5 15462500 15462730 -chr5 15463060 15463290 -chr5 15486990 15487190 -chr5 134378920 134379160 -chr5 137152130 137152510 -chr5 146260900 146261410 -chr6 3201380 3201610 -chr6 103648970 103649310 -chr7 12010340 12010870 -chr8 14306800 14307040 -chr8 15519790 15520030 -chr8 19711890 19712070 -chr9 2999900 3000320 -chr9 3000270 3000570 -chr9 3000900 3001100 -chr9 3001300 3001520 -chr9 3004390 3004680 -chr9 3004690 3004900 -chr9 3005000 3005220 -chr9 3005800 3006030 -chr9 3006960 3007180 -chr9 3008880 3009040 -chr9 3015170 3015420 -chr9 3015590 3015830 -chr9 3016770 3016980 -chr9 3017410 3017650 -chr9 3018240 3018540 -chr9 3018650 3018870 -chr9 3019220 3019450 -chr9 3021160 3021370 -chr9 3021990 3022300 -chr9 3024660 3024880 -chr9 3025350 3025690 -chr9 3026530 3026860 -chr9 3027010 3027250 -chr9 3027660 3027880 -chr9 3028670 3028880 -chr9 3030040 3030330 -chr9 3031910 3032130 -chr9 3032250 3032560 -chr9 3032570 3032790 -chr9 3034090 3034300 -chr9 3034950 3035160 -chr9 3035610 3036180 -chr9 3036200 3036480 -chr9 3036420 3036660 -chr9 3037250 3037460 -chr9 3037910 3038120 -chr9 3038050 3038300 -chr9 24541940 24542200 -chr9 35305120 35305620 -chr9 110281190 110281400 -chr9 123872950 123873160 diff --git a/conf/igenomes.config b/conf/igenomes.config index 1665112d5..d174cd316 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -47,7 +47,7 @@ params { readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" mito_name = "MT" macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/v1.0/GRCm38-blacklist.v1.bed" + blacklist = "${projectDir}/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed" } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" @@ -307,7 +307,7 @@ params { readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" mito_name = "chrM" macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/v1.0/mm10-blacklist.v1.bed" + blacklist = "${projectDir}/assets/blacklists/v2.0/mm10-blacklist.v2.bed" } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" From 649d5871c320b44752880d40ae780464d68df685 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:43:49 +0100 Subject: [PATCH 342/538] Update usage with the references to the blacklist files --- docs/usage.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index f646f779b..c866700b1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -84,6 +84,37 @@ The minimum reference genome requirements are a FASTA and GTF file, all other fi > **NB:** Compressed reference files are also supported by the pipeline i.e. standard files with the `.gz` extension and indices folders with the `tar.gz` extension. +## Blacklist bed files + +The blacklist bed files where obtained using the commands below: + +``` +cd .. +mkdir -p v1.0 +cd v1.0 +wget -L https://www.encodeproject.org/files/ENCFF001TDO/@@download/ENCFF001TDO.bed.gz && gunzip ENCFF001TDO.bed.gz && mv ENCFF001TDO.bed hg19-blacklist.v1.bed + +mkdir -p assets/blacklists/v2.0/ +cd assets/blacklists/v2.0/ +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/ce10-blacklist.v2.bed.gz && gunzip ce10-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/ce11-blacklist.v2.bed.gz && gunzip ce11-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/dm3-blacklist.v2.bed.gz && gunzip dm3-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/dm6-blacklist.v2.bed.gz && gunzip dm6-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/hg19-blacklist.v2.bed.gz && gunzip hg19-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/hg38-blacklist.v2.bed.gz && gunzip hg38-blacklist.v2.bed.gz +wget -L https://raw.githubusercontent.com/Boyle-Lab/Blacklist/master/lists/mm10-blacklist.v2.bed.gz && gunzip mm10-blacklist.v2.bed.gz + +cd .. +mkdir -p v3.0 +cd v3.0 +wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.bed.gz && gunzip ENCFF356LFX.bed.gz && mv ENCFF356LFX.bed hg38-blacklist.v3.bed +``` + +> **NB:** A detailed description of the different versions of the files can be found [here](https://sites.google.com/site/anshulkundaje/projects/blacklists) + + +> **NB:** Check the [igenomes.config](https://github.com/nf-core/chipseq/blob/master/conf/igenomes.config) to see which blacklist bed files are assigned by default to the respective reference genome. + ## Running the pipeline The typical command for running the pipeline is as follows: From e417d3ebb73ad359efebccca81167f660085d699 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:46:27 +0100 Subject: [PATCH 343/538] Add the blacklist file to filter_bam_bamtools subworkflow --- workflows/chipseq.nf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 5352f73a6..f0e801c4d 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -161,10 +161,8 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FASTQC_TRIMGALORE.out.versions) - - // - // SUBWORKFLOW: Map reads & BAM QC + // SUBWORKFLOW: Alignment with BWA & BAM QC // ch_genome_bam = Channel.empty() ch_genome_bam_index = Channel.empty() @@ -184,6 +182,9 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ALIGN_BWA_MEM.out.versions.first()) } + // + // SUBWORKFLOW: Alignment with BOWTIE2 & BAM QC + // if (params.aligner == 'bowtie2') { ALIGN_BOWTIE2 ( FASTQC_TRIMGALORE.out.reads, @@ -198,6 +199,9 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ALIGN_BOWTIE2.out.versions.first()) } + // + // SUBWORKFLOW: Alignment with STAR & BAM QC + // if (params.aligner == 'star') { ALIGN_STAR ( FASTQC_TRIMGALORE.out.reads, @@ -245,7 +249,8 @@ workflow CHIPSEQ { // FILTER_BAM_BAMTOOLS ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - PREPARE_GENOME.out.blacklist.ifEmpty([]).first(), + PREPARE_GENOME.out.filtered_bed, + ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) From 7307d9872d4cb8b51defe0a4435ff7ccec7e9cea Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 3 Mar 2022 18:51:54 +0100 Subject: [PATCH 344/538] Make markdown lint happy again --- docs/usage.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index c866700b1..89423dc36 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -88,7 +88,7 @@ The minimum reference genome requirements are a FASTA and GTF file, all other fi The blacklist bed files where obtained using the commands below: -``` +```console cd .. mkdir -p v1.0 cd v1.0 @@ -110,10 +110,7 @@ cd v3.0 wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.bed.gz && gunzip ENCFF356LFX.bed.gz && mv ENCFF356LFX.bed hg38-blacklist.v3.bed ``` -> **NB:** A detailed description of the different versions of the files can be found [here](https://sites.google.com/site/anshulkundaje/projects/blacklists) - - -> **NB:** Check the [igenomes.config](https://github.com/nf-core/chipseq/blob/master/conf/igenomes.config) to see which blacklist bed files are assigned by default to the respective reference genome. +> **NB:** A detailed description of the different versions of the files can be found [here](https://sites.google.com/site/anshulkundaje/projects/blacklists). Also, to to see which blacklist bed files are assigned by default to the respective reference genome check the [igenomes.config](https://github.com/nf-core/chipseq/blob/master/conf/igenomes.config). ## Running the pipeline From 98eaca67308c83c520388f8c8dc358d494a5db53 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Sat, 5 Mar 2022 22:24:01 +0100 Subject: [PATCH 345/538] Update modules and small fixes due to update --- conf/modules.config | 2 +- modules.json | 60 +++++----- modules/nf-core/modules/bowtie2/align/main.nf | 3 + .../nf-core/modules/bowtie2/align/meta.yml | 88 +++++++-------- modules/nf-core/modules/bowtie2/build/main.nf | 3 + .../nf-core/modules/bowtie2/build/meta.yml | 52 ++++----- modules/nf-core/modules/bwa/index/main.nf | 3 + modules/nf-core/modules/bwa/index/meta.yml | 50 ++++----- modules/nf-core/modules/bwa/mem/main.nf | 13 ++- modules/nf-core/modules/bwa/mem/meta.yml | 82 +++++++------- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- .../modules/custom/getchromsizes/main.nf | 9 +- .../modules/custom/getchromsizes/meta.yml | 3 +- .../modules/deeptools/computematrix/main.nf | 3 + .../modules/deeptools/computematrix/meta.yml | 2 +- .../modules/deeptools/plotfingerprint/main.nf | 3 + .../deeptools/plotfingerprint/meta.yml | 2 +- .../modules/deeptools/plotheatmap/main.nf | 3 + .../modules/deeptools/plotheatmap/meta.yml | 2 +- .../modules/deeptools/plotprofile/main.nf | 3 + .../modules/deeptools/plotprofile/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 3 + modules/nf-core/modules/fastqc/meta.yml | 90 +++++++-------- modules/nf-core/modules/gffread/main.nf | 7 +- modules/nf-core/modules/gffread/meta.yml | 8 +- modules/nf-core/modules/gunzip/main.nf | 3 + modules/nf-core/modules/gunzip/meta.yml | 54 ++++----- .../modules/homer/annotatepeaks/main.nf | 3 + .../modules/homer/annotatepeaks/meta.yml | 2 +- .../nf-core/modules/macs2/callpeak/main.nf | 3 + .../nf-core/modules/macs2/callpeak/meta.yml | 13 ++- modules/nf-core/modules/multiqc/main.nf | 9 +- modules/nf-core/modules/multiqc/meta.yml | 66 +++++------ .../modules/phantompeakqualtools/main.nf | 3 + .../picard/collectmultiplemetrics/main.nf | 9 +- .../picard/collectmultiplemetrics/meta.yml | 86 +++++++-------- .../modules/picard/markduplicates/main.nf | 9 +- .../modules/picard/markduplicates/meta.yml | 2 +- .../modules/picard/mergesamfiles/main.nf | 9 +- .../modules/picard/mergesamfiles/meta.yml | 68 ++++++------ .../nf-core/modules/preseq/lcextrap/main.nf | 3 + .../nf-core/modules/preseq/lcextrap/meta.yml | 2 +- .../nf-core/modules/samtools/flagstat/main.nf | 16 ++- .../modules/samtools/flagstat/meta.yml | 84 +++++++------- .../nf-core/modules/samtools/idxstats/main.nf | 15 ++- .../modules/samtools/idxstats/meta.yml | 86 +++++++-------- .../nf-core/modules/samtools/index/main.nf | 17 ++- .../nf-core/modules/samtools/index/meta.yml | 92 ++++++++-------- modules/nf-core/modules/samtools/sort/main.nf | 10 +- .../nf-core/modules/samtools/sort/meta.yml | 74 ++++++------- .../nf-core/modules/samtools/stats/main.nf | 16 ++- .../nf-core/modules/samtools/stats/meta.yml | 90 +++++++-------- .../modules/subread/featurecounts/main.nf | 3 + .../modules/subread/featurecounts/meta.yml | 18 +-- modules/nf-core/modules/trimgalore/main.nf | 3 + modules/nf-core/modules/trimgalore/meta.yml | 104 +++++++++--------- .../modules/ucsc/bedgraphtobigwig/main.nf | 3 + modules/nf-core/modules/untar/main.nf | 5 +- modules/nf-core/modules/untar/meta.yml | 42 +++---- subworkflows/nf-core/align_bwa_mem.nf | 2 +- 61 files changed, 820 insertions(+), 705 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 537f057d9..bd17ccf3b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -196,7 +196,7 @@ if (params.aligner == 'bwa') { '-M', params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' ].join(' ').trim() - ext.args2 = '-h -F 0x0100 -O BAM' + ext.args2 = '-bhS -F 0x0100 -O BAM' ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, diff --git a/modules.json b/modules.json index 135a6859f..d0220c025 100644 --- a/modules.json +++ b/modules.json @@ -4,94 +4,94 @@ "repos": { "nf-core/modules": { "bowtie2/align": { - "git_sha": "3f9a0285816a2e0ae73a3875fb5ae4b409da5952" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bowtie2/build": { - "git_sha": "e3285528aca2733ff2d544cb5e5fcc34599226f3" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bwa/index": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bwa/mem": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "950700bcdc0e9a2b6883d40d2c51c6fc435cd714" }, "custom/dumpsoftwareversions": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "custom/getchromsizes": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "950700bcdc0e9a2b6883d40d2c51c6fc435cd714" }, "deeptools/computematrix": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deeptools/plotfingerprint": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deeptools/plotheatmap": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "deeptools/plotprofile": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gffread": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gunzip": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "homer/annotatepeaks": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "macs2/callpeak": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "phantompeakqualtools": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "picard/collectmultiplemetrics": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "picard/markduplicates": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "picard/mergesamfiles": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "preseq/lcextrap": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/flagstat": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "samtools/idxstats": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "samtools/index": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "samtools/sort": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "samtools/stats": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" }, "subread/featurecounts": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "trimgalore": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "ucsc/bedgraphtobigwig": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "untar": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "7ec09d0ef4df89617baacc9b2dafcddb7cd4b05a" } } } diff --git a/modules/nf-core/modules/bowtie2/align/main.nf b/modules/nf-core/modules/bowtie2/align/main.nf index 20b08f721..7e8a9659b 100644 --- a/modules/nf-core/modules/bowtie2/align/main.nf +++ b/modules/nf-core/modules/bowtie2/align/main.nf @@ -18,6 +18,9 @@ process BOWTIE2_ALIGN { tuple val(meta), path('*fastq.gz'), emit: fastq, optional:true path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' diff --git a/modules/nf-core/modules/bowtie2/align/meta.yml b/modules/nf-core/modules/bowtie2/align/meta.yml index 77c9e3970..f80421eca 100644 --- a/modules/nf-core/modules/bowtie2/align/meta.yml +++ b/modules/nf-core/modules/bowtie2/align/meta.yml @@ -1,51 +1,51 @@ name: bowtie2_align description: Align reads to a reference genome using bowtie2 keywords: - - align - - fasta - - genome - - reference + - align + - fasta + - genome + - reference tools: - - bowtie2: - description: | - Bowtie 2 is an ultrafast and memory-efficient tool for aligning - sequencing reads to long reference sequences. - homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml - documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml - doi: 10.1038/nmeth.1923 - licence: ['GPL-3.0-or-later'] + - bowtie2: + description: | + Bowtie 2 is an ultrafast and memory-efficient tool for aligning + sequencing reads to long reference sequences. + homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml + documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml + doi: 10.1038/nmeth.1923 + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - index: - type: file - description: Bowtie2 genome index files - pattern: "*.ebwt" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: file + description: Bowtie2 genome index files + pattern: "*.ebwt" output: - - bam: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - fastq: - type: file - description: Unaligned FastQ files - pattern: "*.fastq.gz" - - log: - type: file - description: Aligment log - pattern: "*.log" + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - fastq: + type: file + description: Unaligned FastQ files + pattern: "*.fastq.gz" + - log: + type: file + description: Aligment log + pattern: "*.log" authors: - - "@joseespinosa" - - "@drpatelh" + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/modules/bowtie2/build/main.nf b/modules/nf-core/modules/bowtie2/build/main.nf index da2e9ed52..a4da62d07 100644 --- a/modules/nf-core/modules/bowtie2/build/main.nf +++ b/modules/nf-core/modules/bowtie2/build/main.nf @@ -14,6 +14,9 @@ process BOWTIE2_BUILD { path 'bowtie2' , emit: index path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/bowtie2/build/meta.yml b/modules/nf-core/modules/bowtie2/build/meta.yml index ecc54e9b0..2da9a2171 100644 --- a/modules/nf-core/modules/bowtie2/build/meta.yml +++ b/modules/nf-core/modules/bowtie2/build/meta.yml @@ -1,33 +1,33 @@ name: bowtie2_build description: Builds bowtie index for reference genome keywords: - - build - - index - - fasta - - genome - - reference + - build + - index + - fasta + - genome + - reference tools: - - bowtie2: - description: | - Bowtie 2 is an ultrafast and memory-efficient tool for aligning - sequencing reads to long reference sequences. - homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml - documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml - doi: 10.1038/nmeth.1923 - licence: ['GPL-3.0-or-later'] + - bowtie2: + description: | + Bowtie 2 is an ultrafast and memory-efficient tool for aligning + sequencing reads to long reference sequences. + homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml + documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml + doi: 10.1038/nmeth.1923 + licence: ["GPL-3.0-or-later"] input: - - fasta: - type: file - description: Input genome fasta file + - fasta: + type: file + description: Input genome fasta file output: - - index: - type: file - description: Bowtie2 genome index files - pattern: "*.bt2" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - index: + type: file + description: Bowtie2 genome index files + pattern: "*.bt2" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/modules/bwa/index/main.nf b/modules/nf-core/modules/bwa/index/main.nf index 891027377..3affbf16b 100644 --- a/modules/nf-core/modules/bwa/index/main.nf +++ b/modules/nf-core/modules/bwa/index/main.nf @@ -14,6 +14,9 @@ process BWA_INDEX { path "bwa" , emit: index path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/bwa/index/meta.yml b/modules/nf-core/modules/bwa/index/meta.yml index 11d62df37..2bbd81d9c 100644 --- a/modules/nf-core/modules/bwa/index/meta.yml +++ b/modules/nf-core/modules/bwa/index/meta.yml @@ -1,32 +1,32 @@ name: bwa_index description: Create BWA index for reference genome keywords: - - index - - fasta - - genome - - reference + - index + - fasta + - genome + - reference tools: - - bwa: - description: | - BWA is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: http://bio-bwa.sourceforge.net/ - documentation: http://www.htslib.org/doc/samtools.html - arxiv: arXiv:1303.3997 - licence: ['GPL-3.0-or-later'] + - bwa: + description: | + BWA is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 + licence: ["GPL-3.0-or-later"] input: - - fasta: - type: file - description: Input genome fasta file + - fasta: + type: file + description: Input genome fasta file output: - - index: - type: file - description: BWA genome index files - pattern: "*.{amb,ann,bwt,pac,sa}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - index: + type: file + description: BWA genome index files + pattern: "*.{amb,ann,bwt,pac,sa}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@maxulysse" + - "@drpatelh" + - "@maxulysse" diff --git a/modules/nf-core/modules/bwa/mem/main.nf b/modules/nf-core/modules/bwa/mem/main.nf index 801293a8f..27ea6f42e 100644 --- a/modules/nf-core/modules/bwa/mem/main.nf +++ b/modules/nf-core/modules/bwa/mem/main.nf @@ -2,24 +2,29 @@ process BWA_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.12" : null) + conda (params.enable_conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0' : - 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:66ed1b38d280722529bb8a0167b0cf02f8a0b488-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:c56a3aabc8d64e52d5b9da1e8ecec2031668596d-0' : + 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:c56a3aabc8d64e52d5b9da1e8ecec2031668596d-0' }" input: tuple val(meta), path(reads) path index + val sort_bam output: tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def read_group = meta.read_group ? "-R ${meta.read_group}" : "" + def samtools_command = sort_bam ? 'sort' : 'view' """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` @@ -29,7 +34,7 @@ process BWA_MEM { -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools view $args2 -@ $task.cpus -bhS -o ${prefix}.bam - + | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.bam - cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/bwa/mem/meta.yml b/modules/nf-core/modules/bwa/mem/meta.yml index 61eaddef6..f84c5227b 100644 --- a/modules/nf-core/modules/bwa/mem/meta.yml +++ b/modules/nf-core/modules/bwa/mem/meta.yml @@ -1,46 +1,50 @@ name: bwa_mem description: Performs fastq alignment to a fasta reference using BWA keywords: - - mem - - bwa - - alignment - - map - - fastq - - bam - - sam + - mem + - bwa + - alignment + - map + - fastq + - bam + - sam tools: - - bwa: - description: | - BWA is a software package for mapping DNA sequences against - a large reference genome, such as the human genome. - homepage: http://bio-bwa.sourceforge.net/ - documentation: http://www.htslib.org/doc/samtools.html - arxiv: arXiv:1303.3997 - licence: ['GPL-3.0-or-later'] + - bwa: + description: | + BWA is a software package for mapping DNA sequences against + a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: http://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - - index: - type: file - description: BWA genome index files - pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - index: + type: file + description: BWA genome index files + pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + - sort_bam: + type: boolean + description: use samtools sort (true) or samtools view (false) + pattern: "true or false" output: - - bam: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - bam: + type: file + description: Output BAM file containing read alignments + pattern: "*.{bam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@jeremy1805" + - "@drpatelh" + - "@jeremy1805" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb4672..327d51005 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a602..60b546a01 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/custom/getchromsizes/main.nf b/modules/nf-core/modules/custom/getchromsizes/main.nf index 270b3f489..bbcfa9bec 100644 --- a/modules/nf-core/modules/custom/getchromsizes/main.nf +++ b/modules/nf-core/modules/custom/getchromsizes/main.nf @@ -2,10 +2,10 @@ process CUSTOM_GETCHROMSIZES { tag "$fasta" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: path fasta @@ -15,6 +15,9 @@ process CUSTOM_GETCHROMSIZES { path '*.fai' , emit: fai path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/custom/getchromsizes/meta.yml b/modules/nf-core/modules/custom/getchromsizes/meta.yml index eb1db4bb0..ee6c25718 100644 --- a/modules/nf-core/modules/custom/getchromsizes/meta.yml +++ b/modules/nf-core/modules/custom/getchromsizes/meta.yml @@ -11,7 +11,7 @@ tools: documentation: http://www.htslib.org/doc/samtools.html tool_dev_url: https://github.com/samtools/samtools doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + licence: ["MIT"] input: - fasta: @@ -33,7 +33,6 @@ output: description: File containing software version pattern: "versions.yml" - authors: - "@tamara-hodgetts" - "@chris-cheshire" diff --git a/modules/nf-core/modules/deeptools/computematrix/main.nf b/modules/nf-core/modules/deeptools/computematrix/main.nf index 70be934bf..96dfef3c6 100644 --- a/modules/nf-core/modules/deeptools/computematrix/main.nf +++ b/modules/nf-core/modules/deeptools/computematrix/main.nf @@ -16,6 +16,9 @@ process DEEPTOOLS_COMPUTEMATRIX { tuple val(meta), path("*.mat.tab"), emit: table path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/deeptools/computematrix/meta.yml b/modules/nf-core/modules/deeptools/computematrix/meta.yml index 584fade14..eaa990dd9 100644 --- a/modules/nf-core/modules/deeptools/computematrix/meta.yml +++ b/modules/nf-core/modules/deeptools/computematrix/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: diff --git a/modules/nf-core/modules/deeptools/plotfingerprint/main.nf b/modules/nf-core/modules/deeptools/plotfingerprint/main.nf index 7925c9a97..83613be7b 100644 --- a/modules/nf-core/modules/deeptools/plotfingerprint/main.nf +++ b/modules/nf-core/modules/deeptools/plotfingerprint/main.nf @@ -16,6 +16,9 @@ process DEEPTOOLS_PLOTFINGERPRINT { tuple val(meta), path("*.qcmetrics.txt"), emit: metrics path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/deeptools/plotfingerprint/meta.yml b/modules/nf-core/modules/deeptools/plotfingerprint/meta.yml index 3acd14712..07c257480 100644 --- a/modules/nf-core/modules/deeptools/plotfingerprint/meta.yml +++ b/modules/nf-core/modules/deeptools/plotfingerprint/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: diff --git a/modules/nf-core/modules/deeptools/plotheatmap/main.nf b/modules/nf-core/modules/deeptools/plotheatmap/main.nf index 992c90583..1e402e391 100644 --- a/modules/nf-core/modules/deeptools/plotheatmap/main.nf +++ b/modules/nf-core/modules/deeptools/plotheatmap/main.nf @@ -15,6 +15,9 @@ process DEEPTOOLS_PLOTHEATMAP { tuple val(meta), path("*.tab"), emit: table path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/deeptools/plotheatmap/meta.yml b/modules/nf-core/modules/deeptools/plotheatmap/meta.yml index 34f2865b8..ea206fb67 100644 --- a/modules/nf-core/modules/deeptools/plotheatmap/meta.yml +++ b/modules/nf-core/modules/deeptools/plotheatmap/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: diff --git a/modules/nf-core/modules/deeptools/plotprofile/main.nf b/modules/nf-core/modules/deeptools/plotprofile/main.nf index 60184fa6b..d83a94938 100644 --- a/modules/nf-core/modules/deeptools/plotprofile/main.nf +++ b/modules/nf-core/modules/deeptools/plotprofile/main.nf @@ -15,6 +15,9 @@ process DEEPTOOLS_PLOTPROFILE { tuple val(meta), path("*.tab"), emit: table path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/deeptools/plotprofile/meta.yml b/modules/nf-core/modules/deeptools/plotprofile/meta.yml index 5b61aed4d..795fda444 100644 --- a/modules/nf-core/modules/deeptools/plotprofile/meta.yml +++ b/modules/nf-core/modules/deeptools/plotprofile/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://deeptools.readthedocs.io/en/develop/index.html tool_dev_url: https://github.com/deeptools/deepTools doi: "10.1093/nar/gku365" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca07..ed6b8c50b 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3c..4da5bb5a0 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/gffread/main.nf b/modules/nf-core/modules/gffread/main.nf index d31f76f82..7c575c97f 100644 --- a/modules/nf-core/modules/gffread/main.nf +++ b/modules/nf-core/modules/gffread/main.nf @@ -14,9 +14,12 @@ process GFFREAD { path "*.gtf" , emit: gtf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: - def args = task.ext.args ?: '' - def prefix = task.ext.suffix ? "${gff.baseName}${task.ext.suffix}" : "${gff.baseName}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${gff.baseName}" """ gffread \\ $gff \\ diff --git a/modules/nf-core/modules/gffread/meta.yml b/modules/nf-core/modules/gffread/meta.yml index bf1a15cba..203357477 100644 --- a/modules/nf-core/modules/gffread/meta.yml +++ b/modules/nf-core/modules/gffread/meta.yml @@ -11,13 +11,13 @@ tools: documentation: http://ccb.jhu.edu/software/stringtie/gff.shtml#gffread tool_dev_url: https://github.com/gpertea/gffread doi: 10.12688/f1000research.23297.1 - licence: ['MIT'] + licence: ["MIT"] input: - gff: - type: file - description: A reference file in either the GFF3, GFF2 or GTF format. - pattern: "*.{gff, gtf}" + type: file + description: A reference file in either the GFF3, GFF2 or GTF format. + pattern: "*.{gff, gtf}" output: - gtf: diff --git a/modules/nf-core/modules/gunzip/main.nf b/modules/nf-core/modules/gunzip/main.nf index 77a4e546b..9d4b06669 100644 --- a/modules/nf-core/modules/gunzip/main.nf +++ b/modules/nf-core/modules/gunzip/main.nf @@ -14,6 +14,9 @@ process GUNZIP { tuple val(meta), path("$gunzip"), emit: gunzip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' gunzip = archive.toString() - '.gz' diff --git a/modules/nf-core/modules/gunzip/meta.yml b/modules/nf-core/modules/gunzip/meta.yml index ea1f15460..4d2ebc84e 100644 --- a/modules/nf-core/modules/gunzip/meta.yml +++ b/modules/nf-core/modules/gunzip/meta.yml @@ -1,34 +1,34 @@ name: gunzip description: Compresses and decompresses files. keywords: - - gunzip - - compression + - gunzip + - compression tools: - - gunzip: - description: | - gzip is a file format and a software application used for file compression and decompression. - documentation: https://www.gnu.org/software/gzip/manual/gzip.html - licence: ['GPL-3.0-or-later'] + - gunzip: + description: | + gzip is a file format and a software application used for file compression and decompression. + documentation: https://www.gnu.org/software/gzip/manual/gzip.html + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Optional groovy Map containing meta information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: File to be compressed/uncompressed - pattern: "*.*" + - meta: + type: map + description: | + Optional groovy Map containing meta information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be compressed/uncompressed + pattern: "*.*" output: - - gunzip: - type: file - description: Compressed/uncompressed file - pattern: "*.*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - gunzip: + type: file + description: Compressed/uncompressed file + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" - - "@jfy133" + - "@joseespinosa" + - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/modules/homer/annotatepeaks/main.nf b/modules/nf-core/modules/homer/annotatepeaks/main.nf index 84e0241a4..c9da82ed4 100644 --- a/modules/nf-core/modules/homer/annotatepeaks/main.nf +++ b/modules/nf-core/modules/homer/annotatepeaks/main.nf @@ -18,6 +18,9 @@ process HOMER_ANNOTATEPEAKS { tuple val(meta), path("*annotatePeaks.txt"), emit: txt path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/homer/annotatepeaks/meta.yml b/modules/nf-core/modules/homer/annotatepeaks/meta.yml index c3ab9460e..b815e975d 100644 --- a/modules/nf-core/modules/homer/annotatepeaks/meta.yml +++ b/modules/nf-core/modules/homer/annotatepeaks/meta.yml @@ -10,7 +10,7 @@ tools: HOMER (Hypergeometric Optimization of Motif EnRichment) is a suite of tools for Motif Discovery and next-gen sequencing analysis. documentation: http://homer.ucsd.edu/homer/ doi: 10.1016/j.molcel.2010.05.004. - licence: ['GPL-3.0-or-later'] + licence: ["GPL-3.0-or-later"] input: - meta: type: map diff --git a/modules/nf-core/modules/macs2/callpeak/main.nf b/modules/nf-core/modules/macs2/callpeak/main.nf index c5c88f8e0..9aaf97a93 100644 --- a/modules/nf-core/modules/macs2/callpeak/main.nf +++ b/modules/nf-core/modules/macs2/callpeak/main.nf @@ -20,6 +20,9 @@ process MACS2_CALLPEAK { tuple val(meta), path("*.bed") , optional:true, emit: bed tuple val(meta), path("*.bdg") , optional:true, emit: bdg + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/macs2/callpeak/meta.yml b/modules/nf-core/modules/macs2/callpeak/meta.yml index afb949ece..974ea33a6 100644 --- a/modules/nf-core/modules/macs2/callpeak/meta.yml +++ b/modules/nf-core/modules/macs2/callpeak/meta.yml @@ -1,10 +1,10 @@ name: macs2_callpeak description: Peak calling of enriched genomic regions of ChIP-seq and ATAC-seq experiments keywords: - - alignment - - atac-seq - - chip-seq - - peak-calling + - alignment + - atac-seq + - chip-seq + - peak-calling tools: - macs2: description: Model Based Analysis for ChIP-Seq data @@ -12,7 +12,7 @@ tools: documentation: https://docs.csc.fi/apps/macs2/ tool_dev_url: https://github.com/macs3-project/MACS doi: "https://doi.org/10.1101/496521" - licence: ['BSD'] + licence: ["BSD"] input: - meta: @@ -28,7 +28,8 @@ input: description: The control file - macs2_gsize: type: string - description: Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), + description: + Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), 'mm' for mouse (1.87e9), 'ce' for C. elegans (9e7) and 'dm' for fruitfly (1.2e8) output: diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 3dceb162a..1264aac1e 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" input: path multiqc_files @@ -15,6 +15,9 @@ process MULTIQC { path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 63c75a450..6fa891efc 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -1,40 +1,40 @@ name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ['GPL-3.0-or-later'] + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: ["GPL-3.0-or-later"] input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index 6fe34cc28..c8325b059 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -18,6 +18,9 @@ process PHANTOMPEAKQUALTOOLS { tuple val(meta), path("*.Rdata"), emit: rdata path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index 6b292534c..e023ea3c2 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -16,6 +16,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { tuple val(meta), path("*.pdf") , emit: pdf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 613afc622..68b5c65ee 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -1,50 +1,50 @@ name: picard_collectmultiplemetrics description: Collect multiple metrics from a BAM file keywords: - - alignment - - metrics - - statistics - - insert - - quality - - bam + - alignment + - metrics + - statistics + - insert + - quality + - bam tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - licence: ['MIT'] + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM file - pattern: "*.{bam}" - - fasta: - type: file - description: Genome fasta file + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM file + pattern: "*.{bam}" + - fasta: + type: file + description: Genome fasta file output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - metrics: - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - - pdf: - type: file - description: PDF plots of metrics - pattern: "*.{pdf}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - metrics: + type: file + description: Alignment metrics files generated by picard + pattern: "*_{metrics}" + - pdf: + type: file + description: PDF plots of metrics + pattern: "*.{pdf}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" + - "@drpatelh" diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index d3bf69385..5196b6edf 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -16,6 +16,9 @@ process PICARD_MARKDUPLICATES { tuple val(meta), path("*.metrics.txt"), emit: metrics path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/markduplicates/meta.yml b/modules/nf-core/modules/picard/markduplicates/meta.yml index c9a08b36f..842817bcd 100644 --- a/modules/nf-core/modules/picard/markduplicates/meta.yml +++ b/modules/nf-core/modules/picard/markduplicates/meta.yml @@ -14,7 +14,7 @@ tools: data and formats such as SAM/BAM/CRAM and VCF. homepage: https://broadinstitute.github.io/picard/ documentation: https://broadinstitute.github.io/picard/ - licence: ['MIT'] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/modules/picard/mergesamfiles/main.nf b/modules/nf-core/modules/picard/mergesamfiles/main.nf index 867965932..ef5c39807 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/main.nf +++ b/modules/nf-core/modules/picard/mergesamfiles/main.nf @@ -2,10 +2,10 @@ process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::picard=2.25.7' : null) + conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.25.7--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.25.7--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" input: tuple val(meta), path(bams) @@ -14,6 +14,9 @@ process PICARD_MERGESAMFILES { tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/picard/mergesamfiles/meta.yml b/modules/nf-core/modules/picard/mergesamfiles/meta.yml index 3d010c3ce..5f07ecd0a 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/meta.yml +++ b/modules/nf-core/modules/picard/mergesamfiles/meta.yml @@ -1,41 +1,41 @@ name: picard_mergesamfiles description: Merges multiple BAM files into a single file keywords: - - merge - - alignment - - bam - - sam + - merge + - alignment + - bam + - sam tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - licence: ['MIT'] + - picard: + description: | + A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) + data and formats such as SAM/BAM/CRAM and VCF. + homepage: https://broadinstitute.github.io/picard/ + documentation: https://broadinstitute.github.io/picard/ + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: List of BAM files - pattern: "*.{bam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: List of BAM files + pattern: "*.{bam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Merged BAM file - pattern: "*.{bam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Merged BAM file + pattern: "*.{bam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" + - "@drpatelh" diff --git a/modules/nf-core/modules/preseq/lcextrap/main.nf b/modules/nf-core/modules/preseq/lcextrap/main.nf index b5bd06206..d6dd19e23 100644 --- a/modules/nf-core/modules/preseq/lcextrap/main.nf +++ b/modules/nf-core/modules/preseq/lcextrap/main.nf @@ -16,6 +16,9 @@ process PRESEQ_LCEXTRAP { tuple val(meta), path("*.log") , emit: log path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/preseq/lcextrap/meta.yml b/modules/nf-core/modules/preseq/lcextrap/meta.yml index bdc61228f..0e33df250 100644 --- a/modules/nf-core/modules/preseq/lcextrap/meta.yml +++ b/modules/nf-core/modules/preseq/lcextrap/meta.yml @@ -11,7 +11,7 @@ tools: documentation: None tool_dev_url: None doi: "" - licence: ['GPL'] + licence: ["GPL"] input: - meta: diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index 03721d0b2..9e3440acd 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(bam), path(bai) @@ -14,10 +14,18 @@ process SAMTOOLS_FLAGSTAT { tuple val(meta), path("*.flagstat"), emit: flagstat path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat + samtools \\ + flagstat \\ + --threads ${task.cpus-1} \\ + $bam \\ + > ${bam}.flagstat + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/modules/samtools/flagstat/meta.yml b/modules/nf-core/modules/samtools/flagstat/meta.yml index 9bd9ff891..952690639 100644 --- a/modules/nf-core/modules/samtools/flagstat/meta.yml +++ b/modules/nf-core/modules/samtools/flagstat/meta.yml @@ -1,49 +1,49 @@ name: samtools_flagstat description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG type keywords: - - stats - - mapping - - counts - - bam - - sam - - cram + - stats + - mapping + - counts + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - flagstat: - type: file - description: File containing samtools flagstat output - pattern: "*.{flagstat}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - flagstat: + type: file + description: File containing samtools flagstat output + pattern: "*.{flagstat}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" + - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index cd0686791..7d5cee172 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(bam), path(bai) @@ -14,10 +14,17 @@ process SAMTOOLS_IDXSTATS { tuple val(meta), path("*.idxstats"), emit: idxstats path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools idxstats $bam > ${bam}.idxstats + samtools \\ + idxstats \\ + $bam \\ + > ${bam}.idxstats + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/modules/samtools/idxstats/meta.yml b/modules/nf-core/modules/samtools/idxstats/meta.yml index ec542f34b..3710ab882 100644 --- a/modules/nf-core/modules/samtools/idxstats/meta.yml +++ b/modules/nf-core/modules/samtools/idxstats/meta.yml @@ -1,50 +1,50 @@ name: samtools_idxstats description: Reports alignment summary statistics for a BAM/CRAM/SAM file keywords: - - stats - - mapping - - counts - - chromosome - - bam - - sam - - cram + - stats + - mapping + - counts + - chromosome + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - idxstats: - type: file - description: File containing samtools idxstats output - pattern: "*.{idxstats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - idxstats: + type: file + description: File containing samtools idxstats output + pattern: "*.{idxstats}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" + - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index b033e2258..e41cdcc88 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -2,24 +2,31 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(input) output: tuple val(meta), path("*.bai") , optional:true, emit: bai - tuple val(meta), path("*.crai"), optional:true, emit: crai tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools index -@ ${task.cpus-1} $args $input + samtools \\ + index \\ + -@ ${task.cpus-1} \\ + $args \\ + $input cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 0905b3cd6..e5cadbc24 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -1,53 +1,53 @@ name: samtools_index description: Index SAM/BAM/CRAM file keywords: - - index - - bam - - sam - - cram + - index + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - crai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - csi: - type: file - description: CSI index file - pattern: "*.{csi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + type: file + description: CSI index file + pattern: "*.{csi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - - "@maxulysse" + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index 0c2cf25e3..0e2de8baa 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(bam) @@ -14,9 +14,13 @@ process SAMTOOLS_SORT { tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index 3402a0680..a820c55a3 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -1,44 +1,44 @@ name: samtools_sort description: Sort SAM/BAM/CRAM file keywords: - - sort - - bam - - sam - - cram + - sort + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" + - "@drpatelh" + - "@ewels" diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 83c870025..6efc9d9a5 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" input: tuple val(meta), path(input), path(input_index) @@ -15,11 +15,19 @@ process SAMTOOLS_STATS { tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats --threads ${task.cpus-1} ${reference} ${input} > ${input}.stats + samtools \\ + stats \\ + --threads ${task.cpus-1} \\ + ${reference} \\ + ${input} \\ + > ${input}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index 869e62e37..cac50b1c0 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -1,53 +1,53 @@ name: samtools_stats description: Produces comprehensive statistics from SAM/BAM/CRAM file keywords: - - statistics - - counts - - bam - - sam - - cram + - statistics + - counts + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - stats: type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" - - input_index: + description: File containing samtools stats output + pattern: "*.{stats}" + - versions: type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" - - fasta: - type: optional file - description: Reference file the CRAM was created with - pattern: "*.{fasta,fa}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - stats: - type: file - description: File containing samtools stats output - pattern: "*.{stats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@FriederikeHanssen" + - "@drpatelh" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/subread/featurecounts/main.nf b/modules/nf-core/modules/subread/featurecounts/main.nf index 53eb279e1..18e2a92bb 100644 --- a/modules/nf-core/modules/subread/featurecounts/main.nf +++ b/modules/nf-core/modules/subread/featurecounts/main.nf @@ -15,6 +15,9 @@ process SUBREAD_FEATURECOUNTS { tuple val(meta), path("*featureCounts.txt.summary"), emit: summary path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/subread/featurecounts/meta.yml b/modules/nf-core/modules/subread/featurecounts/meta.yml index 1100a0914..cf02f1ea7 100644 --- a/modules/nf-core/modules/subread/featurecounts/meta.yml +++ b/modules/nf-core/modules/subread/featurecounts/meta.yml @@ -1,10 +1,10 @@ name: subread_featurecounts description: Count reads that map to genomic features keywords: - - counts - - fasta - - genome - - reference + - counts + - fasta + - genome + - reference tools: - featurecounts: @@ -12,14 +12,14 @@ tools: homepage: http://bioinf.wehi.edu.au/featureCounts/ documentation: http://bioinf.wehi.edu.au/subread-package/SubreadUsersGuide.pdf doi: "10.1093/bioinformatics/btt656" - licence: ['GPL v3'] + licence: ["GPL v3"] input: - meta: type: map description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - bam: type: file description: BAM/SAM file containing read alignments @@ -33,8 +33,8 @@ output: - meta: type: map description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - counts: type: file description: Counts of reads mapping to features diff --git a/modules/nf-core/modules/trimgalore/main.nf b/modules/nf-core/modules/trimgalore/main.nf index ee40b780b..9487c7990 100644 --- a/modules/nf-core/modules/trimgalore/main.nf +++ b/modules/nf-core/modules/trimgalore/main.nf @@ -18,6 +18,9 @@ process TRIMGALORE { tuple val(meta), path("*.html"), emit: html optional true tuple val(meta), path("*.zip") , emit: zip optional true + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Calculate number of --cores for TrimGalore based on value of task.cpus diff --git a/modules/nf-core/modules/trimgalore/meta.yml b/modules/nf-core/modules/trimgalore/meta.yml index c7e1df1de..e99a88334 100644 --- a/modules/nf-core/modules/trimgalore/meta.yml +++ b/modules/nf-core/modules/trimgalore/meta.yml @@ -1,59 +1,59 @@ name: trimgalore description: Trim FastQ files using Trim Galore! keywords: - - trimming - - adapters - - sequencing adapters - - fastq + - trimming + - adapters + - sequencing adapters + - fastq tools: - - trimgalore: - description: | - A wrapper tool around Cutadapt and FastQC to consistently apply quality - and adapter trimming to FastQ files, with some extra functionality for - MspI-digested RRBS-type (Reduced Representation Bisufite-Seq) libraries. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/ - documentation: https://github.com/FelixKrueger/TrimGalore/blob/master/Docs/Trim_Galore_User_Guide.md - licence: ['GPL-3.0-or-later'] + - trimgalore: + description: | + A wrapper tool around Cutadapt and FastQC to consistently apply quality + and adapter trimming to FastQ files, with some extra functionality for + MspI-digested RRBS-type (Reduced Representation Bisufite-Seq) libraries. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/ + documentation: https://github.com/FelixKrueger/TrimGalore/blob/master/Docs/Trim_Galore_User_Guide.md + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input adapter trimmed FastQ files of size 1 and 2 for - single-end and paired-end data, respectively. - pattern: "*.{fq.gz}" - - html: - type: file - description: FastQC report (optional) - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive (optional) - pattern: "*_{fastqc.zip}" - - log: - type: file - description: Trim Galore! trimming report - pattern: "*_{report.txt}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input adapter trimmed FastQ files of size 1 and 2 for + single-end and paired-end data, respectively. + pattern: "*.{fq.gz}" + - html: + type: file + description: FastQC report (optional) + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive (optional) + pattern: "*_{fastqc.zip}" + - log: + type: file + description: Trim Galore! trimming report + pattern: "*_{report.txt}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf index 9ba306aba..ef0ca088f 100644 --- a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf @@ -17,6 +17,9 @@ process UCSC_BEDGRAPHTOBIGWIG { tuple val(meta), path("*.bigWig"), emit: bigwig path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 6d1996e77..bbae948aa 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -2,7 +2,7 @@ process UNTAR { tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda (params.enable_conda ? "conda-forge::tar=1.32" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : 'biocontainers/biocontainers:v1.2.0_cv1' }" @@ -14,6 +14,9 @@ process UNTAR { path "$untar" , emit: untar path "versions.yml", emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index 51f94995e..e877a97c1 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -1,28 +1,28 @@ name: untar description: Extract files. keywords: - - untar - - uncompress + - untar + - uncompress tools: - - untar: - description: | - Extract tar.gz files. - documentation: https://www.gnu.org/software/tar/manual/ - licence: ['GPL-3.0-or-later'] + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] input: - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" output: - - untar: - type: file - description: - pattern: "*.*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" + - "@joseespinosa" + - "@drpatelh" diff --git a/subworkflows/nf-core/align_bwa_mem.nf b/subworkflows/nf-core/align_bwa_mem.nf index 297fd3504..0c5dff084 100644 --- a/subworkflows/nf-core/align_bwa_mem.nf +++ b/subworkflows/nf-core/align_bwa_mem.nf @@ -17,7 +17,7 @@ workflow ALIGN_BWA_MEM { // // Map reads with BWA // - BWA_MEM(reads, index) + BWA_MEM(reads, index, false) ch_versions = ch_versions.mix(BWA_MEM.out.versions.first()) // From e912404d3dfbcb1f20b45e79f650ccd06b5e2af9 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 7 Mar 2022 16:34:20 +0100 Subject: [PATCH 346/538] Make --outdir mandatory --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 7 +++++++ .github/workflows/ci.yml | 10 ++++++---- CHANGELOG.md | 6 ++---- README.md | 3 ++- conf/modules.config | 8 ++++---- conf/test.config | 2 +- conf/test_full.config | 2 +- docs/usage.md | 2 +- lib/WorkflowMain.groovy | 2 +- nextflow.config | 2 +- nextflow_schema.json | 4 ++-- 12 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2f5f69256..f0a3ff064 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 3015ffe7a..6d200a5e5 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -12,6 +12,10 @@ jobs: name: Run AWS full tests if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest + strategy: + matrix: + # aligner: ["bwa", "bowtie2", "chromap", "star"] //TODO uncomment when chromap implemented + aligner: ["bwa", "bowtie2", "star"] steps: - name: Launch workflow via tower uses: nf-core/tower-action@v3 @@ -19,10 +23,13 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + pipeline: ${{ github.repository }} + revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" + "aligner": "${{ matrix.aligner }}" } profiles: test_full,aws_tower nextflow_config: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a47a74e65..25c505b02 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ env: jobs: test: - name: Run workflow tests + name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest @@ -44,7 +44,8 @@ jobs: - name: Run pipeline with test data run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + parameters: name: Test workflow parameters @@ -66,7 +67,7 @@ jobs: - name: Run pipeline with various parameters run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} + nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} --outdir ./results aligners: name: Test available aligners @@ -76,6 +77,7 @@ jobs: matrix: aligner: - "bowtie2" + # - "chromap" #TODO uncomment when implemented - "star" steps: - name: Check out pipeline code @@ -88,4 +90,4 @@ jobs: - name: Run pipeline with the different aligners available run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --aligner ${{ matrix.aligner }} + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --aligner ${{ matrix.aligner }} --outdir ./results diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e496fce5..6573b686e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] -### Major enhancements +### Enhancements & fixes * Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Removed `--publish_dir_mode` as it is no longer required for the new syntax @@ -13,13 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) * Added `python3` shebang to appropriate scripts in `bin/` directory * [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter - -### Other enhancements & fixes - * Update pipeline template to nf-core/tools `2.1` * Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) * Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder * [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. +* [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter ### Parameters diff --git a/README.md b/README.md index e31aa418b..fc1bf270d 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/chipseq -profile test,YOURPROFILE + nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. @@ -78,6 +78,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool ```bash nextflow run nf-core/chipseq \ --input samplesheet.csv \ + --outdir \ --genome GRCh37 \ -profile ``` diff --git a/conf/modules.config b/conf/modules.config index bd17ccf3b..a20c6b09f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -3,10 +3,10 @@ Config file for defining DSL2 per module options and publishing paths ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. --------------------------------------------------------------------------------------------------------- */ diff --git a/conf/test.config b/conf/test.config index 2afa57f66..d9c938a09 100644 --- a/conf/test.config +++ b/conf/test.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run nf-core/chipseq -profile test, + nextflow run nf-core/chipseq -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index 66bac3050..de6120539 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -5,7 +5,7 @@ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run nf-core/chipseq -profile test_full, + nextflow run nf-core/chipseq -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/usage.md b/docs/usage.md index 89423dc36..425066f35 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -117,7 +117,7 @@ wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.b The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/chipseq --input samplesheet.csv --genome GRCh37 -profile docker +nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 3ebf7521c..e17aadd9d 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -21,7 +21,7 @@ class WorkflowMain { // Print help to screen if required // public static String help(workflow, params, log) { - def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --outdir --genome GRCh37 -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) help_string += NfcoreSchema.paramsHelp(workflow, params, command) diff --git a/nextflow.config b/nextflow.config index f11ad56ab..f68ef6f6a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -74,7 +74,7 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options - outdir = './results' + outdir = null tracedir = "${params.outdir}/pipeline_info" publish_dir_mode = 'copy' email = null diff --git a/nextflow_schema.json b/nextflow_schema.json index cf98ed2d8..34825a35b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -37,8 +37,8 @@ }, "outdir": { "type": "string", - "description": "Path to the output directory where the results will be saved.", - "default": "./results", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", "fa_icon": "fas fa-folder-open" }, "email": { From 3cab81d689110a7b9f0b7e48212430e8a7e8e385 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 7 Mar 2022 17:14:15 +0100 Subject: [PATCH 347/538] Delete deprecated blacklist files --- assets/blacklists/old/GRCm38-blacklist.bed | 164 --------------------- assets/blacklists/old/hg38-blacklist.bed | 38 ----- assets/blacklists/old/mm10-blacklist.bed | 164 --------------------- mm10-blacklist.bed | 164 --------------------- 4 files changed, 530 deletions(-) delete mode 100755 assets/blacklists/old/GRCm38-blacklist.bed delete mode 100644 assets/blacklists/old/hg38-blacklist.bed delete mode 100755 assets/blacklists/old/mm10-blacklist.bed delete mode 100755 mm10-blacklist.bed diff --git a/assets/blacklists/old/GRCm38-blacklist.bed b/assets/blacklists/old/GRCm38-blacklist.bed deleted file mode 100755 index 3699d020a..000000000 --- a/assets/blacklists/old/GRCm38-blacklist.bed +++ /dev/null @@ -1,164 +0,0 @@ -10 3110060 3110270 -10 22142530 22142880 -10 22142830 22143070 -10 58223870 58224100 -10 58225260 58225500 -10 58228320 58228520 -11 3148660 3148860 -11 3154960 3155170 -11 3158530 3158750 -11 3161780 3161990 -11 3167020 3167250 -11 3169390 3169620 -11 3172450 3172670 -11 3172950 3173190 -11 3184190 3185750 -11 3185700 3186360 -11 3186330 3189230 -11 3189190 3190740 -11 3190750 3191000 -11 3190960 3194430 -11 3194400 3195310 -11 3195240 3197220 -11 3197340 3197950 -11 3197890 3198700 -11 3198630 3199440 -11 3199350 3200120 -11 54139940 54140230 -11 54140470 54140740 -11 88967720 88969600 -11 88969850 88970350 -11 109011550 109012090 -12 3109920 3110150 -12 105436040 105436270 -13 3372960 3373380 -13 3373410 3373630 -13 77438870 77439090 -13 97190460 97190690 -13 99790830 99791090 -13 119488570 119489320 -13 119597600 119598320 -13 119599860 119600050 -13 119601360 119601600 -13 119601800 119602210 -13 119602360 119602580 -13 119609430 119611430 -13 119612760 119613370 -13 119613360 119617690 -14 19415650 19417330 -14 19417240 19417660 -14 19417570 19418920 -14 19418830 19419720 -14 47454330 47454510 -15 75085430 75085920 -15 75085990 75086240 -15 75086150 75086550 -15 75086540 75087110 -16 11143960 11144170 -16 57391420 57391740 -17 13305860 13306280 -17 13590820 13591650 -17 13654880 13655120 -17 36231170 36231390 -17 39842910 39846780 -17 39846920 39847160 -17 39847090 39847310 -17 39847400 39847720 -17 39847630 39848880 -18 3005550 3005770 -18 3005700 3006050 -18 12949190 12949400 -18 40307970 40308340 -18 68691990 68692230 -19 45650030 45650310 -19 61199640 61199880 -19 61224310 61224530 -19 61266550 61266760 -19 61266920 61267210 -1 24612620 24612850 -1 48881430 48881690 -1 58613870 58614090 -1 78573920 78574140 -1 88217960 88221950 -1 88223300 88224760 -1 133595120 133595340 -1 183299040 183299660 -1 195241610 195241820 -2 3050030 3050410 -2 5379200 5379420 -2 22743580 22743780 -2 22744760 22744980 -2 90395030 90395240 -2 98662130 98663060 -2 98663540 98664150 -2 98664780 98665020 -2 98664970 98665250 -2 98666140 98667390 -2 181917260 181917590 -2 181917550 181917990 -2 181918970 181919260 -2 181928340 181928570 -2 181928950 181929170 -2 181929220 181929430 -2 181930800 181931020 -3 5860530 5860830 -3 8245690 8245930 -3 8246280 8246640 -4 34935690 34935910 -4 70378040 70378320 -4 118548460 118548700 -5 14914900 14915120 -5 15006590 15006820 -5 15462500 15462730 -5 15463060 15463290 -5 15486990 15487190 -5 134378920 134379160 -5 137152130 137152510 -5 146260900 146261410 -6 3201380 3201610 -6 103648970 103649310 -7 12010340 12010870 -8 14306800 14307040 -8 15519790 15520030 -8 19711890 19712070 -9 2999900 3000320 -9 3000270 3000570 -9 3000900 3001100 -9 3001300 3001520 -9 3004390 3004680 -9 3004690 3004900 -9 3005000 3005220 -9 3005800 3006030 -9 3006960 3007180 -9 3008880 3009040 -9 3015170 3015420 -9 3015590 3015830 -9 3016770 3016980 -9 3017410 3017650 -9 3018240 3018540 -9 3018650 3018870 -9 3019220 3019450 -9 3021160 3021370 -9 3021990 3022300 -9 3024660 3024880 -9 3025350 3025690 -9 3026530 3026860 -9 3027010 3027250 -9 3027660 3027880 -9 3028670 3028880 -9 3030040 3030330 -9 3031910 3032130 -9 3032250 3032560 -9 3032570 3032790 -9 3034090 3034300 -9 3034950 3035160 -9 3035610 3036180 -9 3036200 3036480 -9 3036420 3036660 -9 3037250 3037460 -9 3037910 3038120 -9 3038050 3038300 -9 24541940 24542200 -9 35305120 35305620 -9 110281190 110281400 -9 123872950 123873160 diff --git a/assets/blacklists/old/hg38-blacklist.bed b/assets/blacklists/old/hg38-blacklist.bed deleted file mode 100644 index c3e00911c..000000000 --- a/assets/blacklists/old/hg38-blacklist.bed +++ /dev/null @@ -1,38 +0,0 @@ -chr10 38528030 38529790 -chr10 42070420 42070660 -chr16 34571420 34571640 -chr16 34572700 34572930 -chr16 34584530 34584840 -chr16 34585000 34585220 -chr16 34585700 34586380 -chr16 34586660 34587100 -chr16 34587060 34587660 -chr16 34587900 34588170 -chr16 34593000 34593590 -chr16 34594490 34594720 -chr16 34594900 34595150 -chr16 34595320 34595570 -chr16 46380910 46381140 -chr16 46386270 46386530 -chr16 46390180 46390930 -chr16 46394370 46395100 -chr16 46395670 46395910 -chr16 46398780 46399020 -chr16 46400700 46400970 -chr1 124450730 124450960 -chr20 28513520 28513770 -chr20 31060210 31060770 -chr20 31061050 31061560 -chr20 31063990 31064490 -chr20 31067930 31069060 -chr20 31069000 31069280 -chr21 8219780 8220120 -chr21 8234330 8234620 -chr2 90397520 90397900 -chr2 90398120 90398760 -chr3 93470260 93470870 -chr4 49118760 49119010 -chr4 49120790 49121130 -chr5 49601430 49602300 -chr5 49657080 49657690 -chr5 49661330 49661570 diff --git a/assets/blacklists/old/mm10-blacklist.bed b/assets/blacklists/old/mm10-blacklist.bed deleted file mode 100755 index 8c71cd3ba..000000000 --- a/assets/blacklists/old/mm10-blacklist.bed +++ /dev/null @@ -1,164 +0,0 @@ -chr10 3110060 3110270 -chr10 22142530 22142880 -chr10 22142830 22143070 -chr10 58223870 58224100 -chr10 58225260 58225500 -chr10 58228320 58228520 -chr11 3148660 3148860 -chr11 3154960 3155170 -chr11 3158530 3158750 -chr11 3161780 3161990 -chr11 3167020 3167250 -chr11 3169390 3169620 -chr11 3172450 3172670 -chr11 3172950 3173190 -chr11 3184190 3185750 -chr11 3185700 3186360 -chr11 3186330 3189230 -chr11 3189190 3190740 -chr11 3190750 3191000 -chr11 3190960 3194430 -chr11 3194400 3195310 -chr11 3195240 3197220 -chr11 3197340 3197950 -chr11 3197890 3198700 -chr11 3198630 3199440 -chr11 3199350 3200120 -chr11 54139940 54140230 -chr11 54140470 54140740 -chr11 88967720 88969600 -chr11 88969850 88970350 -chr11 109011550 109012090 -chr12 3109920 3110150 -chr12 105436040 105436270 -chr13 3372960 3373380 -chr13 3373410 3373630 -chr13 77438870 77439090 -chr13 97190460 97190690 -chr13 99790830 99791090 -chr13 119488570 119489320 -chr13 119597600 119598320 -chr13 119599860 119600050 -chr13 119601360 119601600 -chr13 119601800 119602210 -chr13 119602360 119602580 -chr13 119609430 119611430 -chr13 119612760 119613370 -chr13 119613360 119617690 -chr14 19415650 19417330 -chr14 19417240 19417660 -chr14 19417570 19418920 -chr14 19418830 19419720 -chr14 47454330 47454510 -chr15 75085430 75085920 -chr15 75085990 75086240 -chr15 75086150 75086550 -chr15 75086540 75087110 -chr16 11143960 11144170 -chr16 57391420 57391740 -chr17 13305860 13306280 -chr17 13590820 13591650 -chr17 13654880 13655120 -chr17 36231170 36231390 -chr17 39842910 39846780 -chr17 39846920 39847160 -chr17 39847090 39847310 -chr17 39847400 39847720 -chr17 39847630 39848880 -chr18 3005550 3005770 -chr18 3005700 3006050 -chr18 12949190 12949400 -chr18 40307970 40308340 -chr18 68691990 68692230 -chr19 45650030 45650310 -chr19 61199640 61199880 -chr19 61224310 61224530 -chr19 61266550 61266760 -chr19 61266920 61267210 -chr1 24612620 24612850 -chr1 48881430 48881690 -chr1 58613870 58614090 -chr1 78573920 78574140 -chr1 88217960 88221950 -chr1 88223300 88224760 -chr1 133595120 133595340 -chr1 183299040 183299660 -chr1 195241610 195241820 -chr2 3050030 3050410 -chr2 5379200 5379420 -chr2 22743580 22743780 -chr2 22744760 22744980 -chr2 90395030 90395240 -chr2 98662130 98663060 -chr2 98663540 98664150 -chr2 98664780 98665020 -chr2 98664970 98665250 -chr2 98666140 98667390 -chr2 181917260 181917590 -chr2 181917550 181917990 -chr2 181918970 181919260 -chr2 181928340 181928570 -chr2 181928950 181929170 -chr2 181929220 181929430 -chr2 181930800 181931020 -chr3 5860530 5860830 -chr3 8245690 8245930 -chr3 8246280 8246640 -chr4 34935690 34935910 -chr4 70378040 70378320 -chr4 118548460 118548700 -chr5 14914900 14915120 -chr5 15006590 15006820 -chr5 15462500 15462730 -chr5 15463060 15463290 -chr5 15486990 15487190 -chr5 134378920 134379160 -chr5 137152130 137152510 -chr5 146260900 146261410 -chr6 3201380 3201610 -chr6 103648970 103649310 -chr7 12010340 12010870 -chr8 14306800 14307040 -chr8 15519790 15520030 -chr8 19711890 19712070 -chr9 2999900 3000320 -chr9 3000270 3000570 -chr9 3000900 3001100 -chr9 3001300 3001520 -chr9 3004390 3004680 -chr9 3004690 3004900 -chr9 3005000 3005220 -chr9 3005800 3006030 -chr9 3006960 3007180 -chr9 3008880 3009040 -chr9 3015170 3015420 -chr9 3015590 3015830 -chr9 3016770 3016980 -chr9 3017410 3017650 -chr9 3018240 3018540 -chr9 3018650 3018870 -chr9 3019220 3019450 -chr9 3021160 3021370 -chr9 3021990 3022300 -chr9 3024660 3024880 -chr9 3025350 3025690 -chr9 3026530 3026860 -chr9 3027010 3027250 -chr9 3027660 3027880 -chr9 3028670 3028880 -chr9 3030040 3030330 -chr9 3031910 3032130 -chr9 3032250 3032560 -chr9 3032570 3032790 -chr9 3034090 3034300 -chr9 3034950 3035160 -chr9 3035610 3036180 -chr9 3036200 3036480 -chr9 3036420 3036660 -chr9 3037250 3037460 -chr9 3037910 3038120 -chr9 3038050 3038300 -chr9 24541940 24542200 -chr9 35305120 35305620 -chr9 110281190 110281400 -chr9 123872950 123873160 diff --git a/mm10-blacklist.bed b/mm10-blacklist.bed deleted file mode 100755 index 8c71cd3ba..000000000 --- a/mm10-blacklist.bed +++ /dev/null @@ -1,164 +0,0 @@ -chr10 3110060 3110270 -chr10 22142530 22142880 -chr10 22142830 22143070 -chr10 58223870 58224100 -chr10 58225260 58225500 -chr10 58228320 58228520 -chr11 3148660 3148860 -chr11 3154960 3155170 -chr11 3158530 3158750 -chr11 3161780 3161990 -chr11 3167020 3167250 -chr11 3169390 3169620 -chr11 3172450 3172670 -chr11 3172950 3173190 -chr11 3184190 3185750 -chr11 3185700 3186360 -chr11 3186330 3189230 -chr11 3189190 3190740 -chr11 3190750 3191000 -chr11 3190960 3194430 -chr11 3194400 3195310 -chr11 3195240 3197220 -chr11 3197340 3197950 -chr11 3197890 3198700 -chr11 3198630 3199440 -chr11 3199350 3200120 -chr11 54139940 54140230 -chr11 54140470 54140740 -chr11 88967720 88969600 -chr11 88969850 88970350 -chr11 109011550 109012090 -chr12 3109920 3110150 -chr12 105436040 105436270 -chr13 3372960 3373380 -chr13 3373410 3373630 -chr13 77438870 77439090 -chr13 97190460 97190690 -chr13 99790830 99791090 -chr13 119488570 119489320 -chr13 119597600 119598320 -chr13 119599860 119600050 -chr13 119601360 119601600 -chr13 119601800 119602210 -chr13 119602360 119602580 -chr13 119609430 119611430 -chr13 119612760 119613370 -chr13 119613360 119617690 -chr14 19415650 19417330 -chr14 19417240 19417660 -chr14 19417570 19418920 -chr14 19418830 19419720 -chr14 47454330 47454510 -chr15 75085430 75085920 -chr15 75085990 75086240 -chr15 75086150 75086550 -chr15 75086540 75087110 -chr16 11143960 11144170 -chr16 57391420 57391740 -chr17 13305860 13306280 -chr17 13590820 13591650 -chr17 13654880 13655120 -chr17 36231170 36231390 -chr17 39842910 39846780 -chr17 39846920 39847160 -chr17 39847090 39847310 -chr17 39847400 39847720 -chr17 39847630 39848880 -chr18 3005550 3005770 -chr18 3005700 3006050 -chr18 12949190 12949400 -chr18 40307970 40308340 -chr18 68691990 68692230 -chr19 45650030 45650310 -chr19 61199640 61199880 -chr19 61224310 61224530 -chr19 61266550 61266760 -chr19 61266920 61267210 -chr1 24612620 24612850 -chr1 48881430 48881690 -chr1 58613870 58614090 -chr1 78573920 78574140 -chr1 88217960 88221950 -chr1 88223300 88224760 -chr1 133595120 133595340 -chr1 183299040 183299660 -chr1 195241610 195241820 -chr2 3050030 3050410 -chr2 5379200 5379420 -chr2 22743580 22743780 -chr2 22744760 22744980 -chr2 90395030 90395240 -chr2 98662130 98663060 -chr2 98663540 98664150 -chr2 98664780 98665020 -chr2 98664970 98665250 -chr2 98666140 98667390 -chr2 181917260 181917590 -chr2 181917550 181917990 -chr2 181918970 181919260 -chr2 181928340 181928570 -chr2 181928950 181929170 -chr2 181929220 181929430 -chr2 181930800 181931020 -chr3 5860530 5860830 -chr3 8245690 8245930 -chr3 8246280 8246640 -chr4 34935690 34935910 -chr4 70378040 70378320 -chr4 118548460 118548700 -chr5 14914900 14915120 -chr5 15006590 15006820 -chr5 15462500 15462730 -chr5 15463060 15463290 -chr5 15486990 15487190 -chr5 134378920 134379160 -chr5 137152130 137152510 -chr5 146260900 146261410 -chr6 3201380 3201610 -chr6 103648970 103649310 -chr7 12010340 12010870 -chr8 14306800 14307040 -chr8 15519790 15520030 -chr8 19711890 19712070 -chr9 2999900 3000320 -chr9 3000270 3000570 -chr9 3000900 3001100 -chr9 3001300 3001520 -chr9 3004390 3004680 -chr9 3004690 3004900 -chr9 3005000 3005220 -chr9 3005800 3006030 -chr9 3006960 3007180 -chr9 3008880 3009040 -chr9 3015170 3015420 -chr9 3015590 3015830 -chr9 3016770 3016980 -chr9 3017410 3017650 -chr9 3018240 3018540 -chr9 3018650 3018870 -chr9 3019220 3019450 -chr9 3021160 3021370 -chr9 3021990 3022300 -chr9 3024660 3024880 -chr9 3025350 3025690 -chr9 3026530 3026860 -chr9 3027010 3027250 -chr9 3027660 3027880 -chr9 3028670 3028880 -chr9 3030040 3030330 -chr9 3031910 3032130 -chr9 3032250 3032560 -chr9 3032570 3032790 -chr9 3034090 3034300 -chr9 3034950 3035160 -chr9 3035610 3036180 -chr9 3036200 3036480 -chr9 3036420 3036660 -chr9 3037250 3037460 -chr9 3037910 3038120 -chr9 3038050 3038300 -chr9 24541940 24542200 -chr9 35305120 35305620 -chr9 110281190 110281400 -chr9 123872950 123873160 From ea0ad89e01d20fdef19b940f16e460ae68af4a7d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 7 Mar 2022 17:14:26 +0100 Subject: [PATCH 348/538] Make nf-core lint happy --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index aca9e11fa..1e3aafb1f 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -10,5 +10,6 @@ lint: - .github/workflows/branch.yml - .github/workflows/linting_comment.yml - .github/workflows/linting.yml + - .github/PULL_REQUEST_TEMPLATE.md repository_type: pipeline From 10573c6d2c8c280bc6de4e6c19cb41d64a98a322 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 15 Mar 2022 20:58:19 +0000 Subject: [PATCH 349/538] Template update for nf-core/tools version 2.3 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 6 +- .github/workflows/awstest.yml | 6 +- .github/workflows/ci.yml | 4 +- .github/workflows/linting.yml | 28 +- .gitpod.yml | 14 + .nf-core.yml | 1 + .yamllint.yml | 6 + LICENSE | 2 +- README.md | 8 +- bin/check_samplesheet.py | 346 ++++++++++++++------- conf/base.config | 4 +- conf/igenomes.config | 80 ++--- conf/modules.config | 18 +- conf/test.config | 6 +- conf/test_full.config | 6 +- docs/images/nf-core-chipseq_logo_light.png | Bin 428 -> 73788 bytes docs/usage.md | 21 +- lib/NfcoreSchema.groovy | 4 +- lib/Utils.groovy | 4 +- lib/WorkflowChipseq.groovy | 4 +- main.nf | 24 +- nextflow.config | 20 +- nextflow_schema.json | 23 +- subworkflows/local/input_check.nf | 18 +- workflows/chipseq.nf | 28 +- 27 files changed, 422 insertions(+), 262 deletions(-) create mode 100644 .gitpod.yml create mode 100644 .nf-core.yml create mode 100644 .yamllint.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b0d2788d9..ecfb25027 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,3 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2f5f69256..88c55b84f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index a5e2cade9..c0851d163 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters @@ -31,4 +31,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index b8f720cbe..02bd219ef 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} @@ -25,4 +25,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 57b49cfac..d8f2c0e5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ env: jobs: test: - name: Run workflow tests + name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} runs-on: ubuntu-latest @@ -47,4 +47,4 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773c..fda934c03 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -51,9 +49,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -64,14 +60,13 @@ jobs: YAML: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - name: Checkout + uses: actions/checkout@master + - name: 'Yamllint' + uses: karancode/yamllint-github-action@master with: - node-version: '10' - - name: Install yaml-lint - run: npm install -g yaml-lint - - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + yamllint_file_or_dir: '.' + yamllint_config_filepath: '.yamllint.yml' # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -84,10 +79,11 @@ jobs: To keep the code consistent with lots of contributors, we run automated code consistency checks. To fix this CI test, please run: - * Install `yaml-lint` - * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Install `yamllint` + * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) + instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` * Fix any reported errors in your YAML files Once you push these changes the test should pass, and you can hide this comment :+1: diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..b7d4cee18 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,14 @@ +image: nfcore/gitpod:latest + +vscode: + extensions: # based on nf-core.nf-core-extensionpack + - codezombiech.gitignore # Language support for .gitignore files + # - cssho.vscode-svgviewer # SVG viewer + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + # - nextflow.nextflow # Nextflow syntax highlighting + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 000000000..3805dc81c --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1 @@ +repository_type: pipeline diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 000000000..d466deec9 --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,6 @@ +extends: default + +rules: + document-start: disable + line-length: disable + truthy: disable diff --git a/LICENSE b/LICENSE index 2a0f576bc..e6309f574 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Philip Ewels +Copyright (c) Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 5dcdd654d..28d5f8bec 100644 --- a/README.md +++ b/README.md @@ -40,14 +40,14 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/chipseq -profile test,YOURPROFILE + nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! @@ -55,7 +55,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ```console - nextflow run nf-core/chipseq -profile --input samplesheet.csv --genome GRCh37 + nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile ``` ## Documentation @@ -64,7 +64,7 @@ The nf-core/chipseq pipeline comes with documentation about the pipeline [usage] ## Credits -nf-core/chipseq was originally written by Philip Ewels. +nf-core/chipseq was originally written by Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel. We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index a47ce7e57..5473b624c 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,145 +1,249 @@ #!/usr/bin/env python -# TODO nf-core: Update the script to check the samplesheet -# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv -import os -import sys -import errno +"""Provide a command line tool to validate and transform tabular samplesheets.""" + + import argparse +import csv +import logging +import sys +from collections import Counter +from pathlib import Path -def parse_args(args=None): - Description = "Reformat nf-core/chipseq samplesheet file and check its contents." - Epilog = "Example usage: python check_samplesheet.py " +logger = logging.getLogger() - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("FILE_IN", help="Input samplesheet file.") - parser.add_argument("FILE_OUT", help="Output file.") - return parser.parse_args(args) +class RowChecker: + """ + Define a service that can validate and transform each given row. -def make_dir(path): - if len(path) > 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise exception + Attributes: + modified (list): A list of dicts, where each dict corresponds to a previously + validated and transformed row. The order of rows is maintained. + """ -def print_error(error, context="Line", context_str=""): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != "" and context_str != "": - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( - error, context.strip(), context_str.strip() + VALID_FORMATS = ( + ".fq.gz", + ".fastq.gz", + ) + + def __init__( + self, + sample_col="sample", + first_col="fastq_1", + second_col="fastq_2", + single_col="single_end", + **kwargs, + ): + """ + Initialize the row checker with the expected column names. + + Args: + sample_col (str): The name of the column that contains the sample name + (default "sample"). + first_col (str): The name of the column that contains the first (or only) + FASTQ file path (default "fastq_1"). + second_col (str): The name of the column that contains the second (if any) + FASTQ file path (default "fastq_2"). + single_col (str): The name of the new column that will be inserted and + records whether the sample contains single- or paired-end sequencing + reads (default "single_end"). + + """ + super().__init__(**kwargs) + self._sample_col = sample_col + self._first_col = first_col + self._second_col = second_col + self._single_col = single_col + self._seen = set() + self.modified = [] + + def validate_and_transform(self, row): + """ + Perform all validations on the given row and insert the read pairing status. + + Args: + row (dict): A mapping from column headers (keys) to elements of that row + (values). + + """ + self._validate_sample(row) + self._validate_first(row) + self._validate_second(row) + self._validate_pair(row) + self._seen.add((row[self._sample_col], row[self._first_col])) + self.modified.append(row) + + def _validate_sample(self, row): + """Assert that the sample name exists and convert spaces to underscores.""" + assert len(row[self._sample_col]) > 0, "Sample input is required." + # Sanitize samples slightly. + row[self._sample_col] = row[self._sample_col].replace(" ", "_") + + def _validate_first(self, row): + """Assert that the first FASTQ entry is non-empty and has the right format.""" + assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + self._validate_fastq_format(row[self._first_col]) + + def _validate_second(self, row): + """Assert that the second FASTQ entry has the right format if it exists.""" + if len(row[self._second_col]) > 0: + self._validate_fastq_format(row[self._second_col]) + + def _validate_pair(self, row): + """Assert that read pairs have the same file extension. Report pair status.""" + if row[self._first_col] and row[self._second_col]: + row[self._single_col] = False + assert ( + Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + ), "FASTQ pairs must have the same file extensions." + else: + row[self._single_col] = True + + def _validate_fastq_format(self, filename): + """Assert that a given filename has one of the expected FASTQ extensions.""" + assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" ) - print(error_str) - sys.exit(1) + def validate_unique_samples(self): + """ + Assert that the combination of sample name and FASTQ filename is unique. + + In addition to the validation, also rename the sample if more than one sample, + FASTQ file combination exists. + + """ + assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." + if len({pair[0] for pair in self._seen}) < len(self._seen): + counts = Counter(pair[0] for pair in self._seen) + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + if counts[sample] > 1: + row[self._sample_col] = f"{sample}_T{seen[sample]}" + + +def sniff_format(handle): + """ + Detect the tabular format. + + Args: + handle (text file): A handle to a `text file`_ object. The read position is + expected to be at the beginning (index 0). + + Returns: + csv.Dialect: The detected tabular format. + + .. _text file: + https://docs.python.org/3/glossary.html#term-text-file -# TODO nf-core: Update the check_samplesheet function -def check_samplesheet(file_in, file_out): """ - This function checks that the samplesheet follows the following structure: + peek = handle.read(2048) + sniffer = csv.Sniffer() + if not sniffer.has_header(peek): + logger.critical(f"The given sample sheet does not appear to contain a header.") + sys.exit(1) + dialect = sniffer.sniff(peek) + handle.seek(0) + return dialect - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, - For an example see: - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv +def check_samplesheet(file_in, file_out): """ + Check that the tabular samplesheet has the structure expected by nf-core pipelines. - sample_mapping_dict = {} - with open(file_in, "r") as fin: + Validate the general shape of the table, expected columns, and each row. Also add + an additional column which records whether one or two FASTQ reads were found. - ## Check header - MIN_COLS = 2 - # TODO nf-core: Update the column names for the input samplesheet - HEADER = ["sample", "fastq_1", "fastq_2"] - header = [x.strip('"') for x in fin.readline().strip().split(",")] - if header[: len(HEADER)] != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) - sys.exit(1) + Args: + file_in (pathlib.Path): The given tabular samplesheet. The format can be either + CSV, TSV, or any other format automatically recognized by ``csv.Sniffer``. + file_out (pathlib.Path): Where the validated and transformed samplesheet should + be created; always in CSV format. - ## Check sample entries - for line in fin: - lspl = [x.strip().strip('"') for x in line.strip().split(",")] - - # Check valid number of columns per row - if len(lspl) < len(HEADER): - print_error( - "Invalid number of columns (minimum = {})!".format(len(HEADER)), - "Line", - line, - ) - num_cols = len([x for x in lspl if x]) - if num_cols < MIN_COLS: - print_error( - "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), - "Line", - line, - ) - - ## Check sample name entries - sample, fastq_1, fastq_2 = lspl[: len(HEADER)] - sample = sample.replace(" ", "_") - if not sample: - print_error("Sample entry has not been specified!", "Line", line) - - ## Check FastQ file extension - for fastq in [fastq_1, fastq_2]: - if fastq: - if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", "Line", line) - if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error( - "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", - "Line", - line, - ) - - ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] - if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] - elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] - else: - print_error("Invalid combination of columns provided!", "Line", line) - - ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } - if sample not in sample_mapping_dict: - sample_mapping_dict[sample] = [sample_info] - else: - if sample_info in sample_mapping_dict[sample]: - print_error("Samplesheet contains duplicate rows!", "Line", line) - else: - sample_mapping_dict[sample].append(sample_info) - - ## Write validated samplesheet with appropriate columns - if len(sample_mapping_dict) > 0: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") - for sample in sorted(sample_mapping_dict.keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): - print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) - - for idx, val in enumerate(sample_mapping_dict[sample]): - fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") - else: - print_error("No entries to process!", "Samplesheet: {}".format(file_in)) - - -def main(args=None): - args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) + Example: + This function checks that the samplesheet follows the following structure, + see also the `viral recon samplesheet`_:: + + sample,fastq_1,fastq_2 + SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz + SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz + SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, + + .. _viral recon samplesheet: + https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + + """ + required_columns = {"sample", "fastq_1", "fastq_2"} + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_in.open(newline="") as in_handle: + reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) + # Validate the existence of the expected header columns. + if not required_columns.issubset(reader.fieldnames): + logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + sys.exit(1) + # Validate each row. + checker = RowChecker() + for i, row in enumerate(reader): + try: + checker.validate_and_transform(row) + except AssertionError as error: + logger.critical(f"{str(error)} On line {i + 2}.") + sys.exit(1) + checker.validate_unique_samples() + header = list(reader.fieldnames) + header.insert(1, "single_end") + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_out.open(mode="w", newline="") as out_handle: + writer = csv.DictWriter(out_handle, header, delimiter=",") + writer.writeheader() + for row in checker.modified: + writer.writerow(row) + + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Validate and transform a tabular samplesheet.", + epilog="Example: python check_samplesheet.py samplesheet.csv samplesheet.valid.csv", + ) + parser.add_argument( + "file_in", + metavar="FILE_IN", + type=Path, + help="Tabular input samplesheet in CSV or TSV format.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Transformed output samplesheet in CSV format.", + ) + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + if not args.file_in.is_file(): + logger.error(f"The given input file {args.file_in} was not found!") + sys.exit(2) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + check_samplesheet(args.file_in, args.file_out) if __name__ == "__main__": diff --git a/conf/base.config b/conf/base.config index 07779064b..8231c4796 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq Nextflow base config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. diff --git a/conf/igenomes.config b/conf/igenomes.config index 855948def..7a1b3ac6d 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for iGenomes paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines reference genomes using iGenome paths. Can be used by any config that customises the base path using: $params.igenomes_base / --igenomes_base @@ -13,7 +13,7 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" @@ -26,7 +26,7 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" @@ -38,7 +38,7 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" @@ -51,7 +51,7 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" @@ -62,7 +62,7 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" @@ -72,7 +72,7 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" @@ -83,7 +83,7 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" @@ -94,7 +94,7 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" @@ -105,7 +105,7 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" @@ -115,7 +115,7 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" @@ -126,7 +126,7 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" @@ -137,7 +137,7 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" @@ -147,7 +147,7 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" @@ -157,7 +157,7 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" @@ -167,7 +167,7 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" @@ -178,7 +178,7 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" @@ -188,7 +188,7 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" @@ -199,7 +199,7 @@ params { } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" @@ -209,7 +209,7 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" @@ -219,7 +219,7 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" @@ -230,7 +230,7 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" @@ -242,7 +242,7 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" @@ -252,7 +252,7 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" @@ -263,7 +263,7 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" @@ -273,7 +273,7 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" @@ -285,7 +285,7 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" @@ -298,7 +298,7 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" @@ -311,7 +311,7 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" @@ -321,7 +321,7 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" @@ -333,7 +333,7 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" @@ -344,7 +344,7 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" @@ -355,7 +355,7 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" @@ -366,7 +366,7 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" @@ -377,7 +377,7 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" @@ -388,7 +388,7 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" @@ -399,7 +399,7 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" @@ -409,7 +409,7 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" @@ -419,7 +419,7 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" diff --git a/conf/modules.config b/conf/modules.config index a0506a4db..da58a5d88 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,12 +1,12 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Config file for defining DSL2 per module options and publishing paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ @@ -14,14 +14,14 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] withName: SAMPLESHEET_CHECK { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -33,7 +33,7 @@ process { withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*_versions.yml' ] } diff --git a/conf/test.config b/conf/test.config index 3a199a627..2bf8a1faa 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running minimal tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run nf-core/chipseq -profile test, + nextflow run nf-core/chipseq -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index d8fe4234c..5c3bc0808 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running full-size tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run nf-core/chipseq -profile test_full, + nextflow run nf-core/chipseq -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/images/nf-core-chipseq_logo_light.png b/docs/images/nf-core-chipseq_logo_light.png index d46347c2d217dd9a7c090367c55a068226f937c1..51a83b3d789d5852acc2bb044650b13785c6bf41 100644 GIT binary patch literal 73788 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| 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 H?aKcGF<{p3 literal 428 zcmZ`#K~BRk5WM>pOV3aj5H~9lG(l7

J-waT~81OO72jb}RoLJM9sUyE8jGGwP=P zT({r52Hx8DE$sF$+szslcT#Se_EpNdtuM&KawTQ+v8aUV!(c1b6Y4w!6D(Cvt4H`E zKADbS@9>1i;=z)V7g#7c)78Q2R21&3KiPRN)L6AW!IagA!AuZn7(F8!n;^O(3&GEL z`IdZS!SoYp3ZUbR4QN~-hc4sVpItBmfoJG&#Lk2yM)p}|n3k}!gi}7^1bED6U@;Ic zl^ka$&sv*cyhCf#Eg<}pQxJ33KjQ@CIv?|QCJpD_6tkR+I~LC|e?kXMA=kc(1G!N4 VJvv>8IrcTl)qtG)%H@^D#V=*Sk$eCE diff --git a/docs/usage.md b/docs/usage.md index d1e7eebc7..0a8f0ebd0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/chipseq --input samplesheet.csv --genome GRCh37 -profile docker +nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -141,11 +141,11 @@ Whilst the default requirements set within the pipeline will hopefully work for For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: ```console -[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' +[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' Caused by: - Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) + Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) Command executed: STAR \ @@ -169,17 +169,24 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). +The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. +The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. +Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. +The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: STAR_ALIGN { + withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { memory = 100.GB } } ``` -> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. +> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f20..b3d092f80 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 1b88aec0e..28567bd70 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -29,12 +29,12 @@ class Utils { conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) if (conda_check_failed) { - log.warn "=============================================================================\n" + + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + " NB: The order of the channels matters!\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } } diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 4ca6323ae..547194f75 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -48,11 +48,11 @@ class WorkflowChipseq { // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + + log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" System.exit(1) } } diff --git a/main.nf b/main.nf index 7a90164a5..cf50b1183 100644 --- a/main.nf +++ b/main.nf @@ -1,8 +1,8 @@ #!/usr/bin/env nextflow /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/chipseq Website: https://nf-co.re/chipseq Slack : https://nfcore.slack.com/channels/chipseq @@ -12,25 +12,25 @@ nextflow.enable.dsl = 2 /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENOME PARAMETER VALUES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ WorkflowMain.initialise(workflow, params, log) /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOW FOR PIPELINE -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { CHIPSEQ } from './workflows/chipseq' @@ -43,9 +43,9 @@ workflow NFCORE_CHIPSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN ALL WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -57,7 +57,7 @@ workflow { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/nextflow.config b/nextflow.config index e5ae4e45b..d7b8696c4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/chipseq Nextflow config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- */ @@ -24,8 +24,9 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options - outdir = './results' + outdir = null tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -62,6 +63,15 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/chipseq custom profiles from different institutions. +// Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! +// try { +// includeConfig "${params.custom_config_base}/pipeline/chipseq.config" +// } catch (Exception e) { +// System.err.println("WARNING: Could not load nf-core/config/chipseq profiles: ${params.custom_config_base}/pipeline/chipseq.config") +// } + + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -121,7 +131,7 @@ if (!params.igenomes_ignore) { } // Export these variables to prevent local Python/R libraries from conflicting with those in the container -// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. env { @@ -154,7 +164,7 @@ dag { manifest { name = 'nf-core/chipseq' - author = 'Philip Ewels' + author = 'Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel' homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' diff --git a/nextflow_schema.json b/nextflow_schema.json index 91a37921a..0ae1bfc8f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,7 +11,8 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "required": [ - "input" + "input", + "outdir" ], "properties": { "input": { @@ -26,8 +27,8 @@ }, "outdir": { "type": "string", - "description": "Path to the output directory where the results will be saved.", - "default": "./results", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", "fa_icon": "fas fa-folder-open" }, "email": { @@ -178,6 +179,22 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], + "hidden": true + }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index cddcbb3ce..0aecf87fb 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -12,7 +12,7 @@ workflow INPUT_CHECK { SAMPLESHEET_CHECK ( samplesheet ) .csv .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channels(it) } + .map { create_fastq_channel(it) } .set { reads } emit: @@ -21,22 +21,24 @@ workflow INPUT_CHECK { } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channels(LinkedHashMap row) { +def create_fastq_channel(LinkedHashMap row) { + // create meta map def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() - def array = [] + // add path(s) of the fastq file(s) to the meta map + def fastq_meta = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" } if (meta.single_end) { - array = [ meta, [ file(row.fastq_1) ] ] + fastq_meta = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" } - array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } - return array + return fastq_meta } diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 5714aa820..0a51968e9 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,18 +18,18 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -38,9 +38,9 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { INPUT_CHECK } from '../subworkflows/local/input_check' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -51,9 +51,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // Info required for completion email and summary @@ -104,9 +104,9 @@ workflow CHIPSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -117,7 +117,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From b0216955bd14f5f19d2c1b26ff08c00e3db781af Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 22 Mar 2022 19:17:43 +0100 Subject: [PATCH 350/538] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6573b686e..de456d084 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +* Update pipeline template to nf-core/tools `2.2` * Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Removed `--publish_dir_mode` as it is no longer required for the new syntax * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` From 0f2accbe5ccde1d8b5d01dba243f94e0020de26e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 22 Mar 2022 23:08:46 +0100 Subject: [PATCH 351/538] Fix lint and get rid of some merge tags that were remaining --- README.md | 7 ------- docs/usage.md | 4 ---- subworkflows/local/input_check.nf | 4 ---- 3 files changed, 15 deletions(-) diff --git a/README.md b/README.md index 7ffc9890e..fc1bf270d 100644 --- a/README.md +++ b/README.md @@ -75,19 +75,12 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 4. Start running your own analysis! -<<<<<<< HEAD ```bash nextflow run nf-core/chipseq \ --input samplesheet.csv \ --outdir \ --genome GRCh37 \ -profile -======= - - - ```console - nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile ->>>>>>> 10573c6d2c8c280bc6de4e6c19cb41d64a98a322 ``` See [usage docs](https://nf-co.re/chipseq/usage) for all of the available options when running the pipeline. diff --git a/docs/usage.md b/docs/usage.md index 5e9e5d4f0..425066f35 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -117,11 +117,7 @@ wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.b The typical command for running the pipeline is as follows: ```console -<<<<<<< HEAD nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker -======= -nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ->>>>>>> 10573c6d2c8c280bc6de4e6c19cb41d64a98a322 ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 2b558660e..648a2971a 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -13,11 +13,7 @@ workflow INPUT_CHECK { SAMPLESHEET_CHECK ( samplesheet ) .csv .splitCsv ( header:true, sep:',' ) -<<<<<<< HEAD .map { create_fastq_channel(it, seq_center) } -======= - .map { create_fastq_channel(it) } ->>>>>>> 10573c6d2c8c280bc6de4e6c19cb41d64a98a322 .set { reads } emit: From 441e9170a32b365d9c6e51f686a916b60320beb8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 22 Mar 2022 23:15:29 +0100 Subject: [PATCH 352/538] Fix yamllint --- .nf-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index f6d7f980b..1249eb378 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -12,4 +12,3 @@ lint: - .github/workflows/linting_comment.yml - .github/workflows/linting.yml - bin/check_samplesheet.py - From dc3a8c04c2da9648da026a66618c1e1cc1ad68df Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 23 Mar 2022 13:47:24 +0000 Subject: [PATCH 353/538] Template update for nf-core/tools version 2.3.1 --- .editorconfig | 5 +- .github/CONTRIBUTING.md | 15 +- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 6 +- .github/workflows/awsfulltest.yml | 1 - .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 5 +- .github/workflows/ci.yml | 12 +- .github/workflows/linting.yml | 85 ++--------- .github/workflows/linting_comment.yml | 3 +- .gitpod.yml | 16 +- .markdownlint.yml | 14 -- .prettierrc.yml | 1 + .yamllint.yml | 6 - CHANGELOG.md | 2 + CITATIONS.md | 27 ++-- README.md | 31 ++-- assets/email_template.html | 142 ++++++++++++------ assets/multiqc_config.yaml | 11 -- assets/multiqc_config.yml | 11 ++ assets/schema_input.json | 5 +- docs/README.md | 8 +- docs/output.md | 28 ++-- docs/usage.md | 109 +++++++------- modules.json | 8 +- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 3 + modules/nf-core/modules/fastqc/meta.yml | 90 +++++------ modules/nf-core/modules/multiqc/main.nf | 9 +- modules/nf-core/modules/multiqc/meta.yml | 66 ++++---- nextflow_schema.json | 14 +- workflows/chipseq.nf | 2 +- 33 files changed, 361 insertions(+), 382 deletions(-) delete mode 100644 .markdownlint.yml create mode 100644 .prettierrc.yml delete mode 100644 .yamllint.yml delete mode 100644 assets/multiqc_config.yaml create mode 100644 assets/multiqc_config.yml diff --git a/.editorconfig b/.editorconfig index 95549501a..b6b319077 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,12 +8,9 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{yml,yaml}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 -[*.json] -insert_final_newline = unset - # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d37fb5dfa..2bfaa6814 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,8 +15,7 @@ Contributions to the code are even more welcome ;) If you'd like to write some code for nf-core/chipseq, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/chipseq issues](https://github.com/nf-core/chipseq/issues) to avoid duplicating work - * If there isn't one already, please create one so that others know you're working on this +1. Check that there isn't already an issue about your idea in the [nf-core/chipseq issues](https://github.com/nf-core/chipseq/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/chipseq repository](https://github.com/nf-core/chipseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). @@ -49,9 +48,9 @@ These tests are run both with the latest available version of `Nextflow` and als :warning: Only in the unlikely and regretful event of a release happening with a bug. -* On your own fork, make a new branch `patch` based on `upstream/master`. -* Fix the bug, and bump version (X.Y.Z+1). -* A PR should be made on `master` from patch to directly this particular bug. +- On your own fork, make a new branch `patch` based on `upstream/master`. +- Fix the bug, and bump version (X.Y.Z+1). +- A PR should be made on `master` from patch to directly this particular bug. ## Getting help @@ -73,7 +72,7 @@ If you wish to contribute a new step, please use the following coding standards: 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. 8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -92,8 +91,8 @@ The process resources can be passed on to the tool dynamically within the proces Please use the following naming schemes, to make it easy to understand what is going where. -* initial process channel: `ch_output_from_` -* intermediate and terminal channels: `ch__for_` +- initial process channel: `ch_output_from_` +- intermediate and terminal channels: `ch__for_` ### Nextflow version bumping diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ecfb25027..1d09e717d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,7 +2,6 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown attributes: value: | diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 88c55b84f..a847bce64 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,10 +16,10 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index c0851d163..32c4519c5 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -18,7 +18,6 @@ jobs: # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 02bd219ef..e63a3be6b 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -10,9 +10,9 @@ jobs: if: github.repository == 'nf-core/chipseq' runs-on: ubuntu-latest steps: + # Launch workflow using Tower CLI tool action - name: Launch workflow via tower uses: nf-core/tower-action@v3 - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 0615f2af9..5a5468e14 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,8 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/chipseq' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] - + "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -43,4 +42,4 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - +# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8f2c0e5f..b78f34dff 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,18 +16,18 @@ jobs: test: name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }} + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/chipseq') }}" runs-on: ubuntu-latest strategy: matrix: # Nextflow versions include: # Test pipeline minimum Nextflow version - - NXF_VER: '21.10.3' - NXF_EDGE: '' + - NXF_VER: "21.10.3" + NXF_EDGE: "" # Test latest edge release of Nextflow - - NXF_VER: '' - NXF_EDGE: '1' + - NXF_VER: "" + NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -48,3 +48,5 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + +# diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fda934c03..e9cf5de3a 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,6 +1,7 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. -# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +# It runs the `nf-core lint` and markdown lint tests to ensure +# that the code meets the nf-core guidelines. on: push: pull_request: @@ -8,42 +9,6 @@ on: types: [published] jobs: - Markdown: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - - name: Install markdownlint - run: npm install -g markdownlint-cli - - name: Run Markdownlint - run: markdownlint . - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## Markdown linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `markdownlint-cli` - * On Mac: `brew install markdownlint-cli` - * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) - * Fix the markdown errors - * Automatically: `markdownlint . --fix` - * Manually resolve anything left from `markdownlint .` - - Once you push these changes the test should pass, and you can hide this comment :+1: - - We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! - - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false - EditorConfig: runs-on: ubuntu-latest steps: @@ -55,49 +20,24 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - YAML: + Prettier: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@master - - name: 'Yamllint' - uses: karancode/yamllint-github-action@master - with: - yamllint_file_or_dir: '.' - yamllint_config_filepath: '.yamllint.yml' - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## YAML linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `yamllint` - * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) - instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) - * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` - * Fix any reported errors in your YAML files + - uses: actions/checkout@v2 - Once you push these changes the test should pass, and you can hide this comment :+1: + - uses: actions/setup-node@v2 - We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install Prettier + run: npm install -g prettier - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run Prettier --check + run: prettier --check ${GITHUB_WORKSPACE} nf-core: runs-on: ubuntu-latest steps: - - name: Check out pipeline code uses: actions/checkout@v2 @@ -110,8 +50,8 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: '3.6' - architecture: 'x64' + python-version: "3.6" + architecture: "x64" - name: Install dependencies run: | @@ -139,3 +79,4 @@ jobs: lint_results.md PR_number.txt +# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994b..91c487a1a 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork @@ -27,4 +26,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - +# diff --git a/.gitpod.yml b/.gitpod.yml index b7d4cee18..c452ee93e 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,13 +2,13 @@ image: nfcore/gitpod:latest vscode: extensions: # based on nf-core.nf-core-extensionpack - - codezombiech.gitignore # Language support for .gitignore files + - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code - - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar - - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors # - nextflow.nextflow # Nextflow syntax highlighting - - oderwat.indent-rainbow # Highlight indentation level - - streetsidesoftware.code-spell-checker # Spelling checker for source code + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.markdownlint.yml b/.markdownlint.yml deleted file mode 100644 index 9e605fcfa..000000000 --- a/.markdownlint.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Markdownlint configuration file -default: true -line-length: false -ul-indent: - indent: 4 -no-duplicate-header: - siblings_only: true -no-inline-html: - allowed_elements: - - img - - p - - kbd - - details - - summary diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 000000000..c81f9a766 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1 @@ +printWidth: 120 diff --git a/.yamllint.yml b/.yamllint.yml deleted file mode 100644 index d466deec9..000000000 --- a/.yamllint.yml +++ /dev/null @@ -1,6 +0,0 @@ -extends: default - -rules: - document-start: disable - line-length: disable - truthy: disable diff --git a/CHANGELOG.md b/CHANGELOG.md index bcbe42c1b..b21fe9d0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Initial release of nf-core/chipseq, created with the [nf-core](https://nf-co.re/ ### `Fixed` +- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler + ### `Dependencies` ### `Deprecated` diff --git a/CITATIONS.md b/CITATIONS.md index cecb5945f..b4b3c8965 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,23 +10,26 @@ ## Pipeline tools -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools -* [Anaconda](https://anaconda.com) - > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. +- [Anaconda](https://anaconda.com) -* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) - > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. -* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) - > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. +- [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) -* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. -* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) - > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. +- [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +- [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +- [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/README.md b/README.md index 28d5f8bec..71c912997 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_dark.png#gh-dark-mode-only) +# ![nf-core/chipseq](docs/images/nf-core/chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core/chipseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) @@ -17,11 +17,13 @@ ## Introduction + **nf-core/chipseq** is a bioinformatics best-practice analysis pipeline for ChIP-seq peak-calling and differential analysis pipeline.. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). ## Pipeline summary @@ -35,28 +37,28 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) -2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir - ``` + ```console + nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir + ``` - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. - > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. + > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > - If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! - + - ```console - nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` + ```console + nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile + ``` ## Documentation @@ -82,6 +84,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: diff --git a/assets/email_template.html b/assets/email_template.html index 5a4548bb0..5c35a97ba 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,53 +1,111 @@ - - - - + + + + - - nf-core/chipseq Pipeline Report - - -

+ + + nf-core/chipseq Pipeline Report + + +
+ - +

nf-core/chipseq v${version}

+

Run Name: $runName

-

nf-core/chipseq v${version}

-

Run Name: $runName

- -<% if (!success){ - out << """ -
-

nf-core/chipseq execution completed unsuccessfully!

+ <% if (!success){ out << """ +
+

nf-core/chipseq execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

-
${errorReport}
-
- """ -} else { - out << """ -
+
${errorReport}
+
+ """ } else { out << """ +
nf-core/chipseq execution completed successfully! -
- """ -} -%> +
+ """ } %> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
+$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> "" }.join("\n") %> - -
$k
$v
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> " + + + + + " }.join("\n") %> + +
+ $k + +
$v
+
-

nf-core/chipseq

-

https://github.com/nf-core/chipseq

- -
- - +

nf-core/chipseq

+

https://github.com/nf-core/chipseq

+
+ diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index b7c276e1b..000000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/chipseq - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-chipseq-summary: - order: -1001 - -export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml new file mode 100644 index 000000000..5b7d16528 --- /dev/null +++ b/assets/multiqc_config.yml @@ -0,0 +1,11 @@ +report_comment: > + This report has been generated by the nf-core/chipseq + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + software_versions: + order: -1000 + "nf-core-chipseq-summary": + order: -1001 + +export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index a024fd708..20b4e844b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -31,9 +31,6 @@ ] } }, - "required": [ - "sample", - "fastq_1" - ] + "required": ["sample", "fastq_1"] } } diff --git a/docs/README.md b/docs/README.md index ac8a8b69c..d3849f4fe 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ The nf-core/chipseq documentation is split into the following pages: -* [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. -* [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. +- [Usage](usage.md) + - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Output](output.md) + - An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index b9c8a3df6..d0fe3e904 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,18 +12,18 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - Raw read QC -* [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [FastQC](#fastqc) - Raw read QC +- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC
Output files -* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics. - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +- `fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics. + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
@@ -42,10 +42,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
Output files -* `multiqc/` - * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: directory containing static images from the report in various formats. +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats.
@@ -58,10 +58,10 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
Output files -* `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. +- `pipeline_info/` + - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
diff --git a/docs/usage.md b/docs/usage.md index 0a8f0ebd0..e6dc9daa9 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -44,11 +44,11 @@ TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, ``` -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| Column | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker +nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -65,9 +65,9 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: ```console -work # Directory containing the nextflow working files -results # Finished results (configurable, see below) -.nextflow_log # Log file from Nextflow +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -106,25 +106,25 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -* `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) -* `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -* `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) -* `shifter` - * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -* `charliecloud` - * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -* `conda` - * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters +- `docker` + - A generic configuration profile to be used with [Docker](https://docker.com/) +- `singularity` + - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) +- `podman` + - A generic configuration profile to be used with [Podman](https://podman.io/) +- `shifter` + - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) +- `charliecloud` + - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) +- `conda` + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters ### `-resume` -Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. +Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. @@ -186,6 +186,7 @@ process { ``` > **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers @@ -196,35 +197,35 @@ The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementatio 2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) 3. Create the custom config accordingly: - * For Docker: - - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Singularity: - - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Conda: - - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` + - For Docker: + + ```nextflow + process { + withName: PANGOLIN { + container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Singularity: + + ```nextflow + process { + withName: PANGOLIN { + container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Conda: + + ```nextflow + process { + withName: PANGOLIN { + conda = 'bioconda::pangolin=3.0.5' + } + } + ``` > **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. diff --git a/modules.json b/modules.json index 072fc172e..72584e8a4 100644 --- a/modules.json +++ b/modules.json @@ -4,14 +4,14 @@ "repos": { "nf-core/modules": { "custom/dumpsoftwareversions": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" } } } -} \ No newline at end of file +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb4672..327d51005 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a602..60b546a01 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca07..ed6b8c50b 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3c..4da5bb5a0 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 3dceb162a..1264aac1e 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" input: path multiqc_files @@ -15,6 +15,9 @@ process MULTIQC { path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 63c75a450..6fa891efc 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -1,40 +1,40 @@ name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ['GPL-3.0-or-later'] + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: ["GPL-3.0-or-later"] input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/nextflow_schema.json b/nextflow_schema.json index 0ae1bfc8f..8080b723a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", @@ -185,14 +182,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email_on_fail": { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 0a51968e9..ea403618f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -23,7 +23,7 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* From d9f7f50dfca1d01392dfbc16e11beee9b306fbec Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 24 Mar 2022 11:33:34 +0000 Subject: [PATCH 354/538] Template update for nf-core/tools version 2.3.2 --- .github/PULL_REQUEST_TEMPLATE.md | 1 - .github/workflows/awsfulltest.yml | 2 -- .github/workflows/awstest.yml | 2 -- .gitpod.yml | 2 +- CHANGELOG.md | 2 -- 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a847bce64..9595a3a41 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,7 +10,6 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) --> - ## PR checklist diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 32c4519c5..700ff9000 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -22,8 +22,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index e63a3be6b..666c70a31 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -17,8 +17,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/chipseq/work-${{ github.sha }} parameters: | { diff --git a/.gitpod.yml b/.gitpod.yml index c452ee93e..85d95ecc8 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,7 +4,7 @@ vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar diff --git a/CHANGELOG.md b/CHANGELOG.md index b21fe9d0c..bcbe42c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,6 @@ Initial release of nf-core/chipseq, created with the [nf-core](https://nf-co.re/ ### `Fixed` -- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler - ### `Dependencies` ### `Deprecated` From 87169682c83dd41cf5cc1769585072493e98ad81 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 28 Mar 2022 12:36:50 +0200 Subject: [PATCH 355/538] Update nf-core.yml --- .nf-core.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 3805dc81c..1051e8c5f 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,6 @@ repository_type: pipeline +lint: + files_unchanged: + - .github/workflows/branch.yml + - .github/workflows/linting_comment.yml + - .github/workflows/linting.yml From b8e36c0b7baac640da412b31350dc4f61da1f965 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 28 Mar 2022 14:59:08 +0200 Subject: [PATCH 356/538] Fix nf-core lint --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 1051e8c5f..b3e51cb81 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,3 +4,4 @@ lint: - .github/workflows/branch.yml - .github/workflows/linting_comment.yml - .github/workflows/linting.yml + - .github/PULL_REQUEST_TEMPLATE.md From b12a8296ce27e569b8a46e422656577e0db4c4e0 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 28 Mar 2022 14:59:19 +0200 Subject: [PATCH 357/538] Make happy prettier --- CHANGELOG.md | 238 +++++++------- CITATIONS.md | 136 ++++---- README.md | 44 +-- assets/bamtools_filter_pe.json | 17 +- assets/bamtools_filter_se.json | 9 +- assets/multiqc_config.yml | 304 +++++++++--------- docs/output.md | 161 +++++----- docs/usage.md | 18 +- .../nf-core/modules/macs2/callpeak/meta.yml | 3 +- nextflow_schema.json | 16 +- package-lock.json | 20 ++ package.json | 5 + 12 files changed, 498 insertions(+), 473 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 6573b686e..1c0e90e01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,32 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -* Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - * Removed `--publish_dir_mode` as it is no longer required for the new syntax -* Bump minimum Nextflow version from `21.04.0` -> `21.10.3` -* Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) -* Added `python3` shebang to appropriate scripts in `bin/` directory -* [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter -* Update pipeline template to nf-core/tools `2.1` -* Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) -* Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder -* [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. -* [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter +- Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + - Removed `--publish_dir_mode` as it is no longer required for the new syntax +- Bump minimum Nextflow version from `21.04.0` -> `21.10.3` +- Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) +- Added `python3` shebang to appropriate scripts in `bin/` directory +- [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter +- Update pipeline template to nf-core/tools `2.1` +- Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) +- Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder +- [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. +- [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter ### Parameters -| Old parameter | New parameter | -|------------------------------|----------------------------| -| `--clusterOptions` | | -| `--conda` | `--enable_conda` | -| | `--skip_qc` | -| | `--aligner` | -| | `--save_unaligned` | -| `--skip_diff_analysis` | `--skip_deseq2_qc` | +| Old parameter | New parameter | +| ---------------------- | ------------------ | +| `--clusterOptions` | | +| `--conda` | `--enable_conda` | +| | `--skip_qc` | +| | `--aligner` | +| | `--save_unaligned` | +| `--skip_diff_analysis` | `--skip_deseq2_qc` | -> __NB:__ Parameter has been __updated__ if both old and new parameter information is present. -> __NB:__ Parameter has been __added__ if just the new parameter information is present. -> __NB:__ Parameter has been __removed__ if parameter information isn't present. +> **NB:** Parameter has been **updated** if both old and new parameter information is present. +> **NB:** Parameter has been **added** if just the new parameter information is present. +> **NB:** Parameter has been **removed** if parameter information isn't present. ### Software dependencies @@ -63,130 +63,130 @@ TODO: update all new dependencies --> -> __NB:__ Dependency has been __updated__ if both old and new version information is present. -> __NB:__ Dependency has been __added__ if just the new version information is present. -> __NB:__ Dependency has been __removed__ if version information isn't present. +> **NB:** Dependency has been **updated** if both old and new version information is present. +> **NB:** Dependency has been **added** if just the new version information is present. +> **NB:** Dependency has been **removed** if version information isn't present. ## [1.2.2] - 2021-04-22 -* [#206](https://github.com/nf-core/chipseq/issues/206) - Minor patch release to fix Conda environment +- [#206](https://github.com/nf-core/chipseq/issues/206) - Minor patch release to fix Conda environment ### `Dependencies` -* Update r-base `3.6.2` -> `3.6.3` -* Update r-xfun `0.15` -> `0.20` +- Update r-base `3.6.2` -> `3.6.3` +- Update r-xfun `0.15` -> `0.20` ## [1.2.1] - 2020-07-29 -* [#171](https://github.com/nf-core/chipseq/issues/171) - Minor patch release to update pipeline schema +- [#171](https://github.com/nf-core/chipseq/issues/171) - Minor patch release to update pipeline schema ## [1.2.0] - 2020-07-02 ### `Added` -* [#138](https://github.com/nf-core/chipseq/issues/138) - Add social preview image -* [#153](https://github.com/nf-core/chipseq/issues/153) - Add plotHeatmap -* [#159](https://github.com/nf-core/chipseq/issues/159) - expose bwa mem -T parameter -* [nf-core/atacseq#63](https://github.com/nf-core/atacseq/issues/63) - Added multicore support for Trim Galore! -* [nf-core/atacseq#75](https://github.com/nf-core/atacseq/issues/75) - Include gene annotation versions in multiqc report -* [nf-core/atacseq#76](https://github.com/nf-core/atacseq/issues/76) - featureCounts coupled to DESeq2 -* [nf-core/atacseq#79](https://github.com/nf-core/atacseq/issues/79) - Parallelize DESeq2 -* [nf-core/atacseq#97](https://github.com/nf-core/atacseq/issues/97) - PBC1, PBC2 from pipeline? -* [nf-core/atacseq#107](https://github.com/nf-core/atacseq/issues/107) - Add options to change MACS2 parameters -* Regenerated screenshots and added collapsible sections for output files in `docs/output.md` -* Update template to tools `1.9` -* Replace `set` with `tuple` and `file()` with `path()` in all processes -* Capitalise process names -* Parameters: - * `--bwa_min_score` to set minimum alignment score for BWA MEM - * `--macs_fdr` to provide FDR threshold for MACS2 peak calling - * `--macs_pvalue` to provide p-value threshold for MACS2 peak calling - * `--skip_peak_qc` to skip MACS2 peak QC plot generation - * `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER - * `--skip_consensus_peaks` to skip consensus peak generation - * `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 - * `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) +- [#138](https://github.com/nf-core/chipseq/issues/138) - Add social preview image +- [#153](https://github.com/nf-core/chipseq/issues/153) - Add plotHeatmap +- [#159](https://github.com/nf-core/chipseq/issues/159) - expose bwa mem -T parameter +- [nf-core/atacseq#63](https://github.com/nf-core/atacseq/issues/63) - Added multicore support for Trim Galore! +- [nf-core/atacseq#75](https://github.com/nf-core/atacseq/issues/75) - Include gene annotation versions in multiqc report +- [nf-core/atacseq#76](https://github.com/nf-core/atacseq/issues/76) - featureCounts coupled to DESeq2 +- [nf-core/atacseq#79](https://github.com/nf-core/atacseq/issues/79) - Parallelize DESeq2 +- [nf-core/atacseq#97](https://github.com/nf-core/atacseq/issues/97) - PBC1, PBC2 from pipeline? +- [nf-core/atacseq#107](https://github.com/nf-core/atacseq/issues/107) - Add options to change MACS2 parameters +- Regenerated screenshots and added collapsible sections for output files in `docs/output.md` +- Update template to tools `1.9` +- Replace `set` with `tuple` and `file()` with `path()` in all processes +- Capitalise process names +- Parameters: + - `--bwa_min_score` to set minimum alignment score for BWA MEM + - `--macs_fdr` to provide FDR threshold for MACS2 peak calling + - `--macs_pvalue` to provide p-value threshold for MACS2 peak calling + - `--skip_peak_qc` to skip MACS2 peak QC plot generation + - `--skip_peak_annotation` to skip annotation of MACS2 and consensus peaks with HOMER + - `--skip_consensus_peaks` to skip consensus peak generation + - `--deseq2_vst` to use variance stabilizing transformation (VST) instead of regularized log transformation (rlog) with DESeq2 + - `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) ### `Removed` -* `--tss_bed` parameter +- `--tss_bed` parameter ### `Fixed` -* [#118](https://github.com/nf-core/chipseq/issues/118) - Running on with SGE -* [#132](https://github.com/nf-core/chipseq/issues/132) - BigWig Error: sort: cannot create temporary file in '': Read-only file system -* [#154](https://github.com/nf-core/chipseq/issues/154) - computeMatrix.val.mat.gz files not zipped -* [nf-core/atacseq#71](https://github.com/nf-core/atacseq/issues/71) - consensus_peaks.mLb.clN.boolean.intersect.plot.pdf not generated -* [nf-core/atacseq#73](https://github.com/nf-core/atacseq/issues/73) - macs_annotatePeaks.mLb.clN.summary.txt file is not created -* [nf-core/atacseq#86](https://github.com/nf-core/atacseq/issues/86) - bug in the plot_homer_annotatepeaks.r script -* [nf-core/atacseq#102](https://github.com/nf-core/atacseq/issues/102) - Incorrect Group ID assigned by featurecounts_deseq2.r -* [nf-core/atacseq#109](https://github.com/nf-core/atacseq/issues/109) - Specify custom gtf but gene bed is not generated from that gtf? -* Make executables in `bin/` compatible with Python 3 +- [#118](https://github.com/nf-core/chipseq/issues/118) - Running on with SGE +- [#132](https://github.com/nf-core/chipseq/issues/132) - BigWig Error: sort: cannot create temporary file in '': Read-only file system +- [#154](https://github.com/nf-core/chipseq/issues/154) - computeMatrix.val.mat.gz files not zipped +- [nf-core/atacseq#71](https://github.com/nf-core/atacseq/issues/71) - consensus_peaks.mLb.clN.boolean.intersect.plot.pdf not generated +- [nf-core/atacseq#73](https://github.com/nf-core/atacseq/issues/73) - macs_annotatePeaks.mLb.clN.summary.txt file is not created +- [nf-core/atacseq#86](https://github.com/nf-core/atacseq/issues/86) - bug in the plot_homer_annotatepeaks.r script +- [nf-core/atacseq#102](https://github.com/nf-core/atacseq/issues/102) - Incorrect Group ID assigned by featurecounts_deseq2.r +- [nf-core/atacseq#109](https://github.com/nf-core/atacseq/issues/109) - Specify custom gtf but gene bed is not generated from that gtf? +- Make executables in `bin/` compatible with Python 3 ### `Dependencies` -* Add bioconductor-biocparallel `1.20.0` -* Add markdown `3.2.2` -* Add pigz `2.3.4` -* Add pygments `2.6.1` -* Add pymdown-extensions `7.1` -* Add python `3.7.6` -* Add r-reshape2 `1.4.4` -* Add r-tidyr `1.1.0` -* Update bedtools `2.27.1` -> `2.29.2` -* Update bioconductor-deseq2 `1.20.0` -> `1.26.0` -* Update bioconductor-vsn `3.46.0` -> `3.54.0` -* Update deeptools `3.2.1` -> `3.4.3` -* Update fastqc `0.11.8` -> `0.11.9` -* Update gawk `4.2.1` -> `5.1.0` -* Update homer `4.9.1` -> `4.11` -* Update macs2 `2.1.2` -> `2.2.7.1` -* Update multiqc `1.7` -> `1.8` -* Update phantompeakqualtools `1.2` -> `1.2.2` -* Update picard `2.19.0` -> `2.23.1` -* Update pysam `0.15.2` -> `0.15.3` -* Update r-base `3.4.1` -> `3.6.2` -* Update r-ggplot2 `3.1.0` -> `3.3.2` -* Update r-lattice `0.20_35` -> `0.20_41` -* Update r-optparse `1.6.0` -> `1.6.6` -* Update r-pheatmap `1.0.10` -> `1.0.12` -* Update r-scales `1.0.0` -> `1.1.1` -* Update r-upsetr `1.3.3` -> `1.4.0` -* Update r-xfun `0.3` -> `0.15` -* Update samtools `1.9` -> `1.10` -* Update subread `1.6.4` -> `2.0.1` -* Update trim-galore `0.5.0` -> `0.6.5` -* Update ucsc-bedgraphtobigwig `377` -> `357` +- Add bioconductor-biocparallel `1.20.0` +- Add markdown `3.2.2` +- Add pigz `2.3.4` +- Add pygments `2.6.1` +- Add pymdown-extensions `7.1` +- Add python `3.7.6` +- Add r-reshape2 `1.4.4` +- Add r-tidyr `1.1.0` +- Update bedtools `2.27.1` -> `2.29.2` +- Update bioconductor-deseq2 `1.20.0` -> `1.26.0` +- Update bioconductor-vsn `3.46.0` -> `3.54.0` +- Update deeptools `3.2.1` -> `3.4.3` +- Update fastqc `0.11.8` -> `0.11.9` +- Update gawk `4.2.1` -> `5.1.0` +- Update homer `4.9.1` -> `4.11` +- Update macs2 `2.1.2` -> `2.2.7.1` +- Update multiqc `1.7` -> `1.8` +- Update phantompeakqualtools `1.2` -> `1.2.2` +- Update picard `2.19.0` -> `2.23.1` +- Update pysam `0.15.2` -> `0.15.3` +- Update r-base `3.4.1` -> `3.6.2` +- Update r-ggplot2 `3.1.0` -> `3.3.2` +- Update r-lattice `0.20_35` -> `0.20_41` +- Update r-optparse `1.6.0` -> `1.6.6` +- Update r-pheatmap `1.0.10` -> `1.0.12` +- Update r-scales `1.0.0` -> `1.1.1` +- Update r-upsetr `1.3.3` -> `1.4.0` +- Update r-xfun `0.3` -> `0.15` +- Update samtools `1.9` -> `1.10` +- Update subread `1.6.4` -> `2.0.1` +- Update trim-galore `0.5.0` -> `0.6.5` +- Update ucsc-bedgraphtobigwig `377` -> `357` ## [1.1.0] - 2019-11-05 ### `Added` -* [nf-core/atacseq#46](https://github.com/nf-core/atacseq/issues/46) - Missing gene_bed path in igenomes config -* Update template to tools `1.7` -* Add `--trim_nextseq` parameter -* Add `CITATIONS.md` file -* Capitalised process names +- [nf-core/atacseq#46](https://github.com/nf-core/atacseq/issues/46) - Missing gene_bed path in igenomes config +- Update template to tools `1.7` +- Add `--trim_nextseq` parameter +- Add `CITATIONS.md` file +- Capitalised process names ### `Fixed` -* Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#Deprecated)) -* [nf-core/atacseq#44](https://github.com/nf-core/atacseq/issues/44) - Output directory missing: macs2/consensus/deseq2 -* [nf-core/atacseq#45](https://github.com/nf-core/atacseq/issues/45) - Wrong x-axis scale for the HOMER: Peak annotation Counts tab plot? -* [nf-core/atacseq#46](https://github.com/nf-core/atacseq/issues/46) - Stage blacklist file in channel properly -* [nf-core/atacseq#50](https://github.com/nf-core/atacseq/issues/50) - HOMER number of peaks does not correspond to found MACS2 peaks -* Fixed bug in UpSetR peak intersection plot -* Increase default resource requirements in `base.config` -* Increase process-specific requirements based on user-reported failures +- Change all parameters from `camelCase` to `snake_case` (see [Deprecated](#Deprecated)) +- [nf-core/atacseq#44](https://github.com/nf-core/atacseq/issues/44) - Output directory missing: macs2/consensus/deseq2 +- [nf-core/atacseq#45](https://github.com/nf-core/atacseq/issues/45) - Wrong x-axis scale for the HOMER: Peak annotation Counts tab plot? +- [nf-core/atacseq#46](https://github.com/nf-core/atacseq/issues/46) - Stage blacklist file in channel properly +- [nf-core/atacseq#50](https://github.com/nf-core/atacseq/issues/50) - HOMER number of peaks does not correspond to found MACS2 peaks +- Fixed bug in UpSetR peak intersection plot +- Increase default resource requirements in `base.config` +- Increase process-specific requirements based on user-reported failures ### `Dependencies` -* Update Nextflow `0.32.0` -> `19.10.0` +- Update Nextflow `0.32.0` -> `19.10.0` ### `Deprecated` | Deprecated | Replacement | -|------------------------------|---------------------------| +| ---------------------------- | ------------------------- | | `--design` | `--input` | | `--singleEnd` | `--single_end` | | `--saveGenomeIndex` | `--save_reference` | @@ -213,14 +213,14 @@ Initial release of nf-core/chipseq pipeline. ### `Added` -* Raw read QC (FastQC) -* Adapter trimming (Trim Galore!) -* Map and filter reads (BWA, picard, SAMtools, BEDTools, BAMTools, Pysam) -* Create library-size normalised bigWig tracks (BEDTools, bedGraphToBigWig) -* Alignment QC metrics (Preseq, picard) -* ChIP-seq QC metrics (deepTools, phantompeakqualtools) -* Call and annotate broad/narrow peaks (MACS2, HOMER) -* Create consensus set of peaks per antibody (BEDTools) -* Quantification and differential binding analysis (featureCounts, DESeq2) -* Collate appropriate files for genome browser visualisation (IGV) -* Collate and present various QC metrics (MultiQC, R) +- Raw read QC (FastQC) +- Adapter trimming (Trim Galore!) +- Map and filter reads (BWA, picard, SAMtools, BEDTools, BAMTools, Pysam) +- Create library-size normalised bigWig tracks (BEDTools, bedGraphToBigWig) +- Alignment QC metrics (Preseq, picard) +- ChIP-seq QC metrics (deepTools, phantompeakqualtools) +- Call and annotate broad/narrow peaks (MACS2, HOMER) +- Create consensus set of peaks per antibody (BEDTools) +- Quantification and differential binding analysis (featureCounts, DESeq2) +- Collate appropriate files for genome browser visualisation (IGV) +- Collate and present various QC metrics (MultiQC, R) diff --git a/CITATIONS.md b/CITATIONS.md index bb15845ba..f432375d4 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,93 +10,117 @@ ## Pipeline tools -* [BWA](https://www.ncbi.nlm.nih.gov/pubmed/19451168/) - > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. +- [BWA](https://www.ncbi.nlm.nih.gov/pubmed/19451168/) -* [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) - > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. + > Li H, Durbin R. Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics. 2009 Jul 15;25(14):1754-60. doi: 10.1093/bioinformatics/btp324. Epub 2009 May 18. PubMed PMID: 19451168; PubMed Central PMCID: PMC2705234. -* [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) - > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. +- [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) -* [Bowtie2](https:/dx.doi.org/10.1038/nmeth.1923) - > Langmead, B. and Salzberg, S. L. 2012 Fast gapped-read alignment with Bowtie 2. Nature methods, 9(4), p. 357–359. doi: 10.1038/nmeth.1923. + > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. -* [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) - > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. +- [BamTools](https://www.ncbi.nlm.nih.gov/pubmed/21493652/) -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + > Barnett DW, Garrison EK, Quinlan AR, Strömberg MP, Marth GT. BamTools: a C++ API and toolkit for analyzing and managing BAM files. Bioinformatics. 2011 Jun 15;27(12):1691-2. doi: 10.1093/bioinformatics/btr174. Epub 2011 Apr 14. PubMed PMID: 21493652; PubMed Central PMCID: PMC3106182. -* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) - > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. +- [Bowtie2](https:/dx.doi.org/10.1038/nmeth.1923) -* [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) - > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. + > Langmead, B. and Salzberg, S. L. 2012 Fast gapped-read alignment with Bowtie 2. Nature methods, 9(4), p. 357–359. doi: 10.1038/nmeth.1923. -* [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) - > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. +- [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) -* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. -* [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) - > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [picard-tools](http://broadinstitute.github.io/picard) +- [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) -* [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) - > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. + > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. -* [pysam](https://github.com/pysam-developers/pysam) +- [HOMER](https://www.ncbi.nlm.nih.gov/pubmed/20513432/) -* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) - > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + > Heinz S, Benner C, Spann N, Bertolino E, Lin YC, Laslo P, Cheng JX, Murre C, Singh H, Glass CK. Simple combinations of lineage-determining transcription factors prime cis-regulatory elements required for macrophage and B cell identities. Mol Cell. 2010 May 28;38(4):576-89. doi: 10.1016/j.molcel.2010.05.004. PubMed PMID: 20513432; PubMed Central PMCID: PMC2898526. -* [STAR](https://pubmed.ncbi.nlm.nih.gov/23104886/) - > Dobin A, Davis CA, Schlesinger F, Drenkow J, Zaleski C, Jha S, Batut P, Chaisson M, Gingeras TR. STAR: ultrafast universal RNA-seq aligner Bioinformatics. 2013 Jan 1;29(1):15-21. doi: 10.1093/bioinformatics/bts635. Epub 2012 Oct 25. PubMed PMID: 23104886; PubMed Central PMCID: PMC3530905. +- [MACS2](https://www.ncbi.nlm.nih.gov/pubmed/18798982/) -* [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) + > Zhang Y, Liu T, Meyer CA, Eeckhoute J, Johnson DS, Bernstein BE, Nusbaum C, Myers RM, Brown M, Li W, Liu XS. Model-based analysis of ChIP-Seq (MACS). Genome Biol. 2008;9(9):R137. doi: 10.1186/gb-2008-9-9-r137. Epub 2008 Sep 17. PubMed PMID: 18798982; PubMed Central PMCID: PMC2592715. -* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) - > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + +- [phantompeakqualtools](https://www.ncbi.nlm.nih.gov/pubmed/22955991/) + + > Landt SG, Marinov GK, Kundaje A, Kheradpour P, Pauli F, Batzoglou S, Bernstein BE, Bickel P, Brown JB, Cayting P, Chen Y, DeSalvo G, Epstein C, Fisher-Aylor KI, Euskirchen G, Gerstein M, Gertz J, Hartemink AJ, Hoffman MM, Iyer VR, Jung YL, Karmakar S, Kellis M, Kharchenko PV, Li Q, Liu T, Liu XS, Ma L, Milosavljevic A, Myers RM, Park PJ, Pazin MJ, Perry MD, Raha D, Reddy TE, Rozowsky J, Shoresh N, Sidow A, Slattery M, Stamatoyannopoulos JA, Tolstorukov MY, White KP, Xi S, Farnham PJ, Lieb JD, Wold BJ, Snyder M. ChIP-seq guidelines and practices of the ENCODE and modENCODE consortia. Genome Res. 2012 Sep;22(9):1813-31. doi: 10.1101/gr.136184.111. PubMed PMID: 22955991; PubMed Central PMCID: PMC3431496. + +- [picard-tools](http://broadinstitute.github.io/picard) + +- [preseq](https://www.ncbi.nlm.nih.gov/pubmed/23435259/) + + > Daley T, Smith AD. Predicting the molecular complexity of sequencing libraries. Nat Methods. 2013 Apr;10(4):325-7. doi: 10.1038/nmeth.2375. Epub 2013 Feb 24. PubMed PMID: 23435259; PubMed Central PMCID: PMC3612374. + +- [pysam](https://github.com/pysam-developers/pysam) + +- [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) + + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +- [STAR](https://pubmed.ncbi.nlm.nih.gov/23104886/) + + > Dobin A, Davis CA, Schlesinger F, Drenkow J, Zaleski C, Jha S, Batut P, Chaisson M, Gingeras TR. STAR: ultrafast universal RNA-seq aligner Bioinformatics. 2013 Jan 1;29(1):15-21. doi: 10.1093/bioinformatics/bts635. Epub 2012 Oct 25. PubMed PMID: 23104886; PubMed Central PMCID: PMC3530905. + +- [Trim Galore!](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/) + +- [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. ## R packages -* [R](https://www.R-project.org/) - > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. +- [R](https://www.R-project.org/) + + > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. + +- [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) + + > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. + +- [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) + + > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). + +- [UpSetR](https://CRAN.R-project.org/package=UpSetR) + + > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. + +- [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) + + > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. + +- [reshape2](http://www.jstatsoft.org/v21/i12/) + + > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. -* [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) - > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. +- [scales](https://CRAN.R-project.org/package=scales) -* [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) - > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). + > Hadley Wickham (2018). scales: Scale Functions for Visualization. -* [UpSetR](https://CRAN.R-project.org/package=UpSetR) - > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. +- [pheatmap](https://CRAN.R-project.org/package=pheatmap) -* [ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) - > H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. + > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. -* [reshape2](http://www.jstatsoft.org/v21/i12/) - > Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. +- [lattice](https://cran.r-project.org/web/packages/lattice/index.html) -* [scales](https://CRAN.R-project.org/package=scales) - > Hadley Wickham (2018). scales: Scale Functions for Visualization. + > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. -* [pheatmap](https://CRAN.R-project.org/package=pheatmap) - > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. +- [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) -* [lattice](https://cran.r-project.org/web/packages/lattice/index.html) - > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. + > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. -* [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) - > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. +- [optparse](https://CRAN.R-project.org/package=optparse) -* [optparse](https://CRAN.R-project.org/package=optparse) - > Trevor L Davis (2018). optparse: Command Line Option Parser. + > Trevor L Davis (2018). optparse: Command Line Option Parser. -* [xfun](https://CRAN.R-project.org/package=xfun) - > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. +- [xfun](https://CRAN.R-project.org/package=xfun) + > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 9888720e0..9a8b2d263 100644 --- a/README.md +++ b/README.md @@ -29,28 +29,28 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 3. Alignment ([`BWA`](https://sourceforge.net/projects/bio-bwa/files/)) 4. Mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) 5. Merge alignments from multiple libraries of the same sample ([`picard`](https://broadinstitute.github.io/picard/)) - 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) - 2. Filtering to remove: - * reads mapping to blacklisted regions ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/), [`BEDTools`](https://github.com/arq5x/bedtools2/)) - * reads that are marked as duplicates ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - * reads that arent marked as primary alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - * reads that are unmapped ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - * reads that map to multiple locations ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - * reads containing > 4 mismatches ([`BAMTools`](https://github.com/pezmaster31/bamtools)) - * reads that have an insert size > 2kb ([`BAMTools`](https://github.com/pezmaster31/bamtools); _paired-end only_) - * reads that map to different chromosomes ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) - * reads that arent in FR orientation ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) - * reads where only one read of the pair fails the above criteria ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) - 3. Alignment-level QC and estimation of library complexity ([`picard`](https://broadinstitute.github.io/picard/), [`Preseq`](http://smithlabresearch.org/software/preseq/)) - 4. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) - 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html)) - 6. Calculate genome-wide IP enrichment relative to control ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotFingerprint.html)) - 7. Calculate strand cross-correlation peak and ChIP-seq quality measures including NSC and RSC ([`phantompeakqualtools`](https://github.com/kundajelab/phantompeakqualtools)) - 8. Call broad/narrow peaks ([`MACS2`](https://github.com/taoliu/MACS)) - 9. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html)) - 10. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/)) - 11. Count reads in consensus peaks ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) - 12. Differential binding analysis, PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) + 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) + 2. Filtering to remove: + - reads mapping to blacklisted regions ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/), [`BEDTools`](https://github.com/arq5x/bedtools2/)) + - reads that are marked as duplicates ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) + - reads that arent marked as primary alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) + - reads that are unmapped ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) + - reads that map to multiple locations ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) + - reads containing > 4 mismatches ([`BAMTools`](https://github.com/pezmaster31/bamtools)) + - reads that have an insert size > 2kb ([`BAMTools`](https://github.com/pezmaster31/bamtools); _paired-end only_) + - reads that map to different chromosomes ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) + - reads that arent in FR orientation ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) + - reads where only one read of the pair fails the above criteria ([`Pysam`](http://pysam.readthedocs.io/en/latest/installation.html); _paired-end only_) + 3. Alignment-level QC and estimation of library complexity ([`picard`](https://broadinstitute.github.io/picard/), [`Preseq`](http://smithlabresearch.org/software/preseq/)) + 4. Create normalised bigWig files scaled to 1 million mapped reads ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) + 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html)) + 6. Calculate genome-wide IP enrichment relative to control ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotFingerprint.html)) + 7. Calculate strand cross-correlation peak and ChIP-seq quality measures including NSC and RSC ([`phantompeakqualtools`](https://github.com/kundajelab/phantompeakqualtools)) + 8. Call broad/narrow peaks ([`MACS2`](https://github.com/taoliu/MACS)) + 9. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html)) + 10. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/)) + 11. Count reads in consensus peaks ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) + 12. Differential binding analysis, PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) 6. Create IGV session file containing bigWig tracks, peaks and differential sites for data visualisation ([`IGV`](https://software.broadinstitute.org/software/igv/)). 7. Present QC for raw read, alignment, peak-calling and differential binding results ([`MultiQC`](http://multiqc.info/), [`R`](https://www.r-project.org/)) diff --git a/assets/bamtools_filter_pe.json b/assets/bamtools_filter_pe.json index b69b41ba5..618b7e9c3 100755 --- a/assets/bamtools_filter_pe.json +++ b/assets/bamtools_filter_pe.json @@ -1,18 +1,11 @@ { - "filters" : [ - { "id" : "insert_min", - "insertSize" : ">=-2000" - }, + "filters": [ + { "id": "insert_min", "insertSize": ">=-2000" }, - { "id" : "insert_max", - "insertSize" : "<=2000" - }, + { "id": "insert_max", "insertSize": "<=2000" }, - { "id" : "mismatch", - "tag" : "NM:<=4" - } + { "id": "mismatch", "tag": "NM:<=4" } ], - "rule" : " insert_min & insert_max & mismatch " - + "rule": " insert_min & insert_max & mismatch " } diff --git a/assets/bamtools_filter_se.json b/assets/bamtools_filter_se.json index f62800e7f..8928ab1cd 100755 --- a/assets/bamtools_filter_se.json +++ b/assets/bamtools_filter_se.json @@ -1,10 +1,5 @@ { - "filters" : [ - { "id" : "mismatch", - "tag" : "NM:<=4" - } - ], - - "rule" : " mismatch " + "filters": [{ "id": "mismatch", "tag": "NM:<=4" }], + "rule": " mismatch " } diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index f9f280673..ad69b5d8a 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,161 +1,161 @@ report_comment: > - This report has been generated by the nf-core/chipseq - analysis pipeline. For information about how to interpret these results, please see the - documentation. + This report has been generated by the nf-core/chipseq + analysis pipeline. For information about how to interpret these results, please see the + documentation. -data_format: 'yaml' +data_format: "yaml" export_plots: true run_modules: - - custom_content - - fastqc - - cutadapt - - samtools - - picard - - preseq - - featureCounts - - deeptools - - phantompeakqualtools + - custom_content + - fastqc + - cutadapt + - samtools + - picard + - preseq + - featureCounts + - deeptools + - phantompeakqualtools exclude_modules: - - 'general_stats' + - "general_stats" module_order: - - fastqc: - name: 'LIB: FastQC (raw)' - info: 'This section of the report shows FastQC results before adapter trimming for individual libraries.' - path_filters: - - './fastqc/*.zip' - - cutadapt: - name: 'LIB: cutadapt (trimmed)' - info: 'This section of the report shows the length of trimmed reads by cutadapt for individual libraries.' - - fastqc: - name: 'LIB: FastQC (trimmed)' - info: 'This section of the report shows FastQC results after adapter trimming for individual libraries.' - path_filters: - - './trimgalore/fastqc/*.zip' - - samtools: - name: 'LIB: SAMTools' - info: 'This section of the report shows SAMTools results for individual libraries.' - path_filters: - - './alignment/library/*' - - samtools: - name: 'MERGED LIB: SAMTools (unfiltered)' - info: 'This section of the report shows SAMTools results after merging libraries and before filtering.' - path_filters: - - './alignment/mergedLibrary/unfiltered/*.mLb.mkD.sorted.bam*' - - picard: - name: 'MERGED LIB: Picard (unfiltered)' - info: 'This section of the report shows picard results after merging libraries and before filtering.' - path_filters: - - './alignment/mergedLibrary/unfiltered/picard_metrics/*' - - preseq: - name: 'MERGED LIB: Preseq (unfiltered)' - info: 'This section of the report shows Preseq results after merging libraries and before filtering.' - - samtools: - name: 'MERGED LIB: SAMTools (filtered)' - info: 'This section of the report shows SAMTools results after merging libraries and after filtering.' - path_filters: - - './alignment/mergedLibrary/filtered/*.mLb.clN.sorted.bam*' - - picard: - name: 'MERGED LIB: Picard (filtered)' - info: 'This section of the report shows picard results after merging libraries and after filtering.' - path_filters: - - './alignment/mergedLibrary/filtered/picard_metrics/*' - - deeptools: - name: 'MERGED LIB: deepTools' - anchor: 'mlib_deeptools' - info: 'This section of the report shows ChIP-seq QC plots generated by deepTools.' - - featureCounts: - name: 'MERGED LIB: featureCounts' - anchor: 'mlib_featurecounts' - info: 'This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks.' - path_filters: - - './macs/consensus/*.summary' + - fastqc: + name: "LIB: FastQC (raw)" + info: "This section of the report shows FastQC results before adapter trimming for individual libraries." + path_filters: + - "./fastqc/*.zip" + - cutadapt: + name: "LIB: cutadapt (trimmed)" + info: "This section of the report shows the length of trimmed reads by cutadapt for individual libraries." + - fastqc: + name: "LIB: FastQC (trimmed)" + info: "This section of the report shows FastQC results after adapter trimming for individual libraries." + path_filters: + - "./trimgalore/fastqc/*.zip" + - samtools: + name: "LIB: SAMTools" + info: "This section of the report shows SAMTools results for individual libraries." + path_filters: + - "./alignment/library/*" + - samtools: + name: "MERGED LIB: SAMTools (unfiltered)" + info: "This section of the report shows SAMTools results after merging libraries and before filtering." + path_filters: + - "./alignment/mergedLibrary/unfiltered/*.mLb.mkD.sorted.bam*" + - picard: + name: "MERGED LIB: Picard (unfiltered)" + info: "This section of the report shows picard results after merging libraries and before filtering." + path_filters: + - "./alignment/mergedLibrary/unfiltered/picard_metrics/*" + - preseq: + name: "MERGED LIB: Preseq (unfiltered)" + info: "This section of the report shows Preseq results after merging libraries and before filtering." + - samtools: + name: "MERGED LIB: SAMTools (filtered)" + info: "This section of the report shows SAMTools results after merging libraries and after filtering." + path_filters: + - "./alignment/mergedLibrary/filtered/*.mLb.clN.sorted.bam*" + - picard: + name: "MERGED LIB: Picard (filtered)" + info: "This section of the report shows picard results after merging libraries and after filtering." + path_filters: + - "./alignment/mergedLibrary/filtered/picard_metrics/*" + - deeptools: + name: "MERGED LIB: deepTools" + anchor: "mlib_deeptools" + info: "This section of the report shows ChIP-seq QC plots generated by deepTools." + - featureCounts: + name: "MERGED LIB: featureCounts" + anchor: "mlib_featurecounts" + info: "This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks." + path_filters: + - "./macs/consensus/*.summary" report_section_order: - peak_count: - before: mlib_deeptools - frip_score: - before: peak_count - peak_annotation: - before: frip_score - strand_shift_correlation: - before: peak_annotation - nsc_coefficient: - before: strand_shift_correlation - rsc_coefficient: - before: nsc_coefficient - mlib_featurecounts: - before: rsc_coefficient - deseq2_pca_1: - order: -1600 - deseq2_pca_2: - order: -1700 - deseq2_pca_3: - order: -1800 - deseq2_pca_4: - order: -1900 - deseq2_pca_5: - order: -2000 - deseq2_pca_6: - order: -2100 - deseq2_pca_7: - order: -2200 - deseq2_pca_8: - order: -2300 - deseq2_pca_9: - order: -2400 - deseq2_pca_10: - order: -2500 - deseq2_clustering_1: - order: -2600 - deseq2_clustering_2: - order: -2700 - deseq2_clustering_3: - order: -2800 - deseq2_clustering_4: - order: -2900 - deseq2_clustering_5: - order: -3000 - deseq2_clustering_6: - order: -3100 - deseq2_clustering_7: - order: -3200 - deseq2_clustering_8: - order: -3300 - deseq2_clustering_9: - order: -3400 - deseq2_clustering_10: - order: -3500 - software_versions: - order: -3600 - nf-core-chipseq-summary: - order: -3700 + peak_count: + before: mlib_deeptools + frip_score: + before: peak_count + peak_annotation: + before: frip_score + strand_shift_correlation: + before: peak_annotation + nsc_coefficient: + before: strand_shift_correlation + rsc_coefficient: + before: nsc_coefficient + mlib_featurecounts: + before: rsc_coefficient + deseq2_pca_1: + order: -1600 + deseq2_pca_2: + order: -1700 + deseq2_pca_3: + order: -1800 + deseq2_pca_4: + order: -1900 + deseq2_pca_5: + order: -2000 + deseq2_pca_6: + order: -2100 + deseq2_pca_7: + order: -2200 + deseq2_pca_8: + order: -2300 + deseq2_pca_9: + order: -2400 + deseq2_pca_10: + order: -2500 + deseq2_clustering_1: + order: -2600 + deseq2_clustering_2: + order: -2700 + deseq2_clustering_3: + order: -2800 + deseq2_clustering_4: + order: -2900 + deseq2_clustering_5: + order: -3000 + deseq2_clustering_6: + order: -3100 + deseq2_clustering_7: + order: -3200 + deseq2_clustering_8: + order: -3300 + deseq2_clustering_9: + order: -3400 + deseq2_clustering_10: + order: -3500 + software_versions: + order: -3600 + nf-core-chipseq-summary: + order: -3700 custom_plot_config: - picard_insert_size: - cpswitch_c_active: False - smooth_points: 1000 - featurecounts: - cpswitch_c_active: False + picard_insert_size: + cpswitch_c_active: False + smooth_points: 1000 + featurecounts: + cpswitch_c_active: False extra_fn_clean_exts: - - 'fastq.gz' - - '_trimmed' - - '_val' - - 'sorted.bam' - - '.Lb' - - 'mkD' - - 'clN' - - 'mLb' - - '_peaks' - - '.FRiP' - - '.peak' - - '_spp' - - '.spp' - - 'ccurve' + - "fastq.gz" + - "_trimmed" + - "_val" + - "sorted.bam" + - ".Lb" + - "mkD" + - "clN" + - "mLb" + - "_peaks" + - ".FRiP" + - ".peak" + - "_spp" + - ".spp" + - "ccurve" # # Customise the module search patterns to speed up execution time # # - Skip module sub-tools that we are not interested in @@ -163,13 +163,13 @@ extra_fn_clean_exts: # # - Don't add anything that is the same as the MultiQC default # # See https://multiqc.info/docs/#optimise-file-search-patterns for details sp: - cutadapt: - fn: '*trimming_report.txt' - preseq: - fn: '*.ccurve.txt' - deeptools/plotFingerprintOutRawCounts: - fn: '*plotFingerprint*' - deeptools/plotProfile: - fn: '*plotProfile*' - phantompeakqualtools/out: - fn: '*.spp.out' + cutadapt: + fn: "*trimming_report.txt" + preseq: + fn: "*.ccurve.txt" + deeptools/plotFingerprintOutRawCounts: + fn: "*plotFingerprint*" + deeptools/plotProfile: + fn: "*plotProfile*" + phantompeakqualtools/out: + fn: "*.spp.out" diff --git a/docs/output.md b/docs/output.md index d115a7a9f..88b9b99bf 100644 --- a/docs/output.md +++ b/docs/output.md @@ -21,10 +21,10 @@ The initial QC and alignments are performed at the library-level e.g. if the sam
Output files -* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **before** adapter trimming. -* `fastqc/zips/` - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +- `fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics for read 1 (_and read2 if paired-end_) **before** adapter trimming. +- `fastqc/zips/` + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
@@ -35,14 +35,14 @@ The initial QC and alignments are performed at the library-level e.g. if the sam
Output files -* `trim_galore/` - * `*fastq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory. -* `trim_galore/logs/` - * `*.log`: Log file generated by Trim Galore!. -* `trim_galore/fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics for read 1 (*and read2 if paired-end*) **after** adapter trimming. -* `trim_galore/fastqc/zips/` - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +- `trim_galore/` + - `*fastq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory. +- `trim_galore/logs/` + - `*.log`: Log file generated by Trim Galore!. +- `trim_galore/fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics for read 1 (_and read2 if paired-end_) **after** adapter trimming. +- `trim_galore/fastqc/zips/` + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
@@ -55,10 +55,10 @@ The initial QC and alignments are performed at the library-level e.g. if the sam
Output files -* `bwa/library/` - * `*.bam`: The files resulting from the alignment of individual libraries are not saved by default so this directory will not be present in your results. You can override this behaviour with the use of the `--save_align_intermeds` flag in which case it will contain the coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -* `bwa/library/samtools_stats/` - * SAMtools `.sorted.bam.flagstat`, `.sorted.bam.idxstats` and `.sorted.bam.stats` files generated from the alignment files. +- `bwa/library/` + - `*.bam`: The files resulting from the alignment of individual libraries are not saved by default so this directory will not be present in your results. You can override this behaviour with the use of the `--save_align_intermeds` flag in which case it will contain the coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. +- `bwa/library/samtools_stats/` + - SAMtools `.sorted.bam.flagstat`, `.sorted.bam.idxstats` and `.sorted.bam.stats` files generated from the alignment files. > **NB:** File names in the resulting directory (i.e. `bwa/library/`) will have the '`.Lb.`' suffix. @@ -77,17 +77,17 @@ The library-level alignments associated with the same sample are merged and subs
Output files -* `bwa/mergedLibrary/` - * `*.bam`: Merged library-level, coordinate sorted `*.bam` files after the marking of duplicates, and filtering based on various criteria. The file suffix for the final filtered files will be `*.mLb.clN.*`. If you specify the `--save_align_intermeds` parameter then two additional sets of files will be present. These represent the unfiltered alignments with duplicates marked (`*.mLb.mkD.*`), and in the case of paired-end datasets the filtered alignments before the removal of orphan read pairs (`*.mLb.flT.*`). -* `bwa/mergedLibrary/samtools_stats/` - * SAMtools `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. -* `bwa/mergedLibrary/picard_metrics/` - * `*_metrics`: Alignment QC files from picard CollectMultipleMetrics. - * `*.metrics.txt`: Metrics file from MarkDuplicates. -* `bwa/mergedLibrary/picard_metrics/pdf/` - * `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. -* `bwa/mergedLibrary/preseq/` - * `*.ccurve.txt`: Preseq expected future yield file. +- `bwa/mergedLibrary/` + - `*.bam`: Merged library-level, coordinate sorted `*.bam` files after the marking of duplicates, and filtering based on various criteria. The file suffix for the final filtered files will be `*.mLb.clN.*`. If you specify the `--save_align_intermeds` parameter then two additional sets of files will be present. These represent the unfiltered alignments with duplicates marked (`*.mLb.mkD.*`), and in the case of paired-end datasets the filtered alignments before the removal of orphan read pairs (`*.mLb.flT.*`). +- `bwa/mergedLibrary/samtools_stats/` + - SAMtools `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. +- `bwa/mergedLibrary/picard_metrics/` + - `*_metrics`: Alignment QC files from picard CollectMultipleMetrics. + - `*.metrics.txt`: Metrics file from MarkDuplicates. +- `bwa/mergedLibrary/picard_metrics/pdf/` + - `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. +- `bwa/mergedLibrary/preseq/` + - `*.ccurve.txt`: Preseq expected future yield file. > **NB:** File names in the resulting directory (i.e. `bwa/mergedLibrary/`) will have the '`.mLb.`' suffix. @@ -110,8 +110,8 @@ The [Preseq](http://smithlabresearch.org/software/preseq/) package is aimed at p
Output files -* `bwa/mergedLibrary/bigwig/` - * `*.bigWig`: Normalised bigWig files scaled to 1 million mapped reads. +- `bwa/mergedLibrary/bigwig/` + - `*.bigWig`: Normalised bigWig files scaled to 1 million mapped reads.
@@ -122,13 +122,13 @@ The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in a
Output files -* `bwa/mergedLibrary/phantompeakqualtools/` - * `*.spp.out`, `*.spp.pdf`: phantompeakqualtools output files. - * `*_mqc.tsv`: MultiQC custom content files. -* `bwa/mergedLibrary/deepTools/plotFingerprint/` - * `*.plotFingerprint.pdf`, `*.plotFingerprint.qcmetrics.txt`, `*.plotFingerprint.raw.txt`: plotFingerprint output files. -* `bwa/mergedLibrary/deepTools/plotProfile/` - * `*.computeMatrix.mat.gz`, `*.computeMatrix.vals.mat.tab`, `*.plotProfile.pdf`, `*.plotProfile.tab`, `*.plotHeatmap.pdf`, `*.plotHeatmap.mat.tab`: plotProfile output files. +- `bwa/mergedLibrary/phantompeakqualtools/` + - `*.spp.out`, `*.spp.pdf`: phantompeakqualtools output files. + - `*_mqc.tsv`: MultiQC custom content files. +- `bwa/mergedLibrary/deepTools/plotFingerprint/` + - `*.plotFingerprint.pdf`, `*.plotFingerprint.qcmetrics.txt`, `*.plotFingerprint.raw.txt`: plotFingerprint output files. +- `bwa/mergedLibrary/deepTools/plotProfile/` + - `*.computeMatrix.mat.gz`, `*.computeMatrix.vals.mat.tab`, `*.plotProfile.pdf`, `*.plotProfile.tab`, `*.plotHeatmap.pdf`, `*.plotHeatmap.mat.tab`: plotProfile output files.
@@ -157,13 +157,13 @@ The results from deepTools plotProfile gives you a quick visualisation for the g
Output files -* `bwa/mergedLibrary/macs2//` - * `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in *narrowPeak* or *broadPeak* mode. - * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. -* `bwa/mergedLibrary/macs2//qc/` - * `macs_peak.plots.pdf`: QC plots for MACS2 peaks. - * `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. - * `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. +- `bwa/mergedLibrary/macs2//` + - `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in _narrowPeak_ or _broadPeak_ mode. + - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. +- `bwa/mergedLibrary/macs2//qc/` + - `macs_peak.plots.pdf`: QC plots for MACS2 peaks. + - `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. + - `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. > **NB:** `` in the directory structure above corresponds to the type of peak that you have specified to call with MACS2 i.e. `broadPeak` or `narrowPeak`. If you so wish, you can call both narrow and broad peaks without redoing the preceding steps in the pipeline such as the alignment and filtering. For example, if you already have broad peaks then just add `--narrow_peak -resume` to the command you used to run the pipeline, and these will be called too! However, resuming the pipeline will only be possible if you have not deleted the `work/` directory generated by the pipeline. @@ -173,7 +173,7 @@ The results from deepTools plotProfile gives you a quick visualisation for the g ![MultiQC - MACS2 total peak count plot](images/mqc_macs2_peak_count_plot.png) -[HOMER annotatePeaks.pl](http://homer.ucsd.edu/homer/ngs/annotation.html) is used to annotate the peaks relative to known genomic features. HOMER is able to use the `--gtf` annotation file which is provided to the pipeline. Please note that some of the output columns will be blank because the annotation is not provided using HOMER's in-built database format. However, the more important fields required for downstream analysis will be populated i.e. *Annotation*, *Distance to TSS* and *Nearest Promoter ID*. +[HOMER annotatePeaks.pl](http://homer.ucsd.edu/homer/ngs/annotation.html) is used to annotate the peaks relative to known genomic features. HOMER is able to use the `--gtf` annotation file which is provided to the pipeline. Please note that some of the output columns will be blank because the annotation is not provided using HOMER's in-built database format. However, the more important fields required for downstream analysis will be populated i.e. _Annotation_, _Distance to TSS_ and _Nearest Promoter ID_. ![MultiQC - HOMER annotatePeaks peak-to-gene feature ratio plot](images/mqc_annotatePeaks_feature_percentage_plot.png) @@ -186,20 +186,20 @@ Various QC plots per sample including number of peaks, fold-change distribution,
Output files -* `bwa/mergedLibrary/macs2//consensus/` - * `*.bed`: Consensus peak-set across all samples in BED format. - * `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - * `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. - * `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file for consensus peaks. - * `*.boolean.annotatePeaks.txt`: Spreadsheet representation of consensus peak-set across samples **with** gene annotation columns. The columns from individual peak files are included in this file along with the ability to filter peaks based on their presence or absence in multiple replicates/conditions. - * `*.boolean.txt`: Spreadsheet representation of consensus peak-set across samples **without** gene annotation columns. Same as file above but without annotation columns. - * `*.boolean.intersect.plot.pdf`, `*.boolean.intersect.txt`: [UpSetR](https://cran.r-project.org/web/packages/UpSetR/README.html) files to illustrate peak intersection. +- `bwa/mergedLibrary/macs2//consensus/` + - `*.bed`: Consensus peak-set across all samples in BED format. + - `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. + - `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. + - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file for consensus peaks. + - `*.boolean.annotatePeaks.txt`: Spreadsheet representation of consensus peak-set across samples **with** gene annotation columns. The columns from individual peak files are included in this file along with the ability to filter peaks based on their presence or absence in multiple replicates/conditions. + - `*.boolean.txt`: Spreadsheet representation of consensus peak-set across samples **without** gene annotation columns. Same as file above but without annotation columns. + - `*.boolean.intersect.plot.pdf`, `*.boolean.intersect.txt`: [UpSetR](https://cran.r-project.org/web/packages/UpSetR/README.html) files to illustrate peak intersection.
In order to perform the differential binding analysis we need to be able to carry out the read quantification for the same intervals across **all** of the samples in the experiment. To this end, the individual peak-sets called per sample have to be merged together in order to create a consensus set of peaks. -Using the consensus peaks it is possible to assess the degree of overlap between the peaks from a set of samples e.g. *Which consensus peaks contain peaks that are common/unique to a given set of samples?*. This may be useful for downstream filtering of peaks based on whether they are called in multiple replicates/conditions. Please note that it is possible for a consensus peak to contain multiple peaks from the same sample. Unfortunately, this is sample-dependent but the files generated by the pipeline do have columns that report such instances and allow you to factor them into any further analysis. +Using the consensus peaks it is possible to assess the degree of overlap between the peaks from a set of samples e.g. _Which consensus peaks contain peaks that are common/unique to a given set of samples?_. This may be useful for downstream filtering of peaks based on whether they are called in multiple replicates/conditions. Please note that it is possible for a consensus peak to contain multiple peaks from the same sample. Unfortunately, this is sample-dependent but the files generated by the pipeline do have columns that report such instances and allow you to factor them into any further analysis. ![R - UpSetR peak intersection plot](images/r_upsetr_intersect_plot.png) @@ -214,19 +214,19 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -* `bwa/mergedLibrary/macs2//consensus//deseq2/` - * `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. - * `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - * `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. - * `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. - * `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. - * `bwa/mergedLibrary/macs2//consensus///` - * `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. - * `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. - * `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. - * `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. - * `bwa/mergedLibrary/macs2//consensus//sizeFactors/` - * `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample. +- `bwa/mergedLibrary/macs2//consensus//deseq2/` + - `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. + - `*.plots.pdf`: File containing PCA and hierarchical clustering plots. + - `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. + - `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. + - `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. + - `bwa/mergedLibrary/macs2//consensus///` + - `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. + - `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. + - `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. + - `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. + - `bwa/mergedLibrary/macs2//consensus//sizeFactors/` + - `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
@@ -255,10 +255,10 @@ By default, all possible pairwise comparisons across the groups from a particula
Output files -* `multiqc//` - * `multiqc_report.html`: A standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: Directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: Directory containing static images from the report in various formats. +- `multiqc//` + - `multiqc_report.html`: A standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: Directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: Directory containing static images from the report in various formats.
@@ -273,9 +273,9 @@ The pipeline has special steps which also allow the software versions to be repo
Output files -* `igv//` - * `igv_session.xml`: Session file that can be directly loaded into IGV. - * `igv_files.txt`: File containing a listing of the files used to create the IGV session. +- `igv//` + - `igv_session.xml`: Session file that can be directly loaded into IGV. + - `igv_files.txt`: File containing a listing of the files used to create the IGV session.
@@ -298,14 +298,15 @@ Once installed, open IGV, go to `File > Open Session` and select the `igv_sessio
Output files -* `genome/` - * A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. -* `genome/index/` - * `bwa/`: Directory containing BWA indices. - * `bowtie2/`: Directory containing BOWTIE2 indices. - * `star/`: Directory containing STAR indices. +- `genome/` + - A number of genome-specific files are generated by the pipeline in order to aid in the filtering of the data, and because they are required by standard tools such as BEDTools. These can be found in this directory along with the genome fasta file which is required by IGV. If using a genome from AWS iGenomes and if it exists a `README.txt` file containing information about the annotation version will also be saved in this directory. +- `genome/index/` - * If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes. + - `bwa/`: Directory containing BWA indices. + - `bowtie2/`: Directory containing BOWTIE2 indices. + - `star/`: Directory containing STAR indices. + + - If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes.
diff --git a/docs/usage.md b/docs/usage.md index ed885d59c..971a3c897 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -63,13 +63,13 @@ NAIVE_INPUT_REP2,BLA203A48_S39_L001_R1_001.fastq.gz,,, NAIVE_INPUT_REP3,BLA203A49_S1_L006_R1_001.fastq.gz,,, ``` -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `antibody` | Antibody name. This is required to segregate downstream analysis for different antibodies. Required when `control` is specified. | -| `control` | Sample name for control sample. | +| Column | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `antibody` | Antibody name. This is required to segregate downstream analysis for different antibodies. Required when `control` is specified. | +| `control` | Sample name for control sample. | Example design files have been provided with the pipeline for [paired-end](../assets/samplesheet_pe.csv) and [single-end](../assets/samplesheet_se.csv) data. @@ -79,8 +79,8 @@ Example design files have been provided with the pipeline for [paired-end](../as The minimum reference genome requirements are a FASTA and GTF file, all other files required to run the pipeline can be generated from these files. However, it is more storage and compute friendly if you are able to re-use reference genome files as efficiently as possible. It is recommended to use the `--save_reference` parameter if you are using the pipeline to build new indices (e.g. those unavailable on [AWS iGenomes](https://nf-co.re/usage/reference_genomes)) so that you can save them somewhere locally. The index building step can be quite a time-consuming process and it permits their reuse for future runs of the pipeline to save disk space. You can then either provide the appropriate reference genome files on the command-line via the appropriate parameters (e.g. `--bwa_index '/path/to/bwa/index/'`) or via a custom config file. -* If `--genome` is provided then the FASTA and GTF files (and existing indices) will be automatically obtained from AWS-iGenomes unless these have already been downloaded locally in the path specified by `--igenomes_base`. -* If `--gene_bed` is not provided then it will be generated from the GTF file. +- If `--genome` is provided then the FASTA and GTF files (and existing indices) will be automatically obtained from AWS-iGenomes unless these have already been downloaded locally in the path specified by `--igenomes_base`. +- If `--gene_bed` is not provided then it will be generated from the GTF file. > **NB:** Compressed reference files are also supported by the pipeline i.e. standard files with the `.gz` extension and indices folders with the `tar.gz` extension. diff --git a/modules/nf-core/modules/macs2/callpeak/meta.yml b/modules/nf-core/modules/macs2/callpeak/meta.yml index 974ea33a6..982bc5b24 100644 --- a/modules/nf-core/modules/macs2/callpeak/meta.yml +++ b/modules/nf-core/modules/macs2/callpeak/meta.yml @@ -28,8 +28,7 @@ input: description: The control file - macs2_gsize: type: string - description: - Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), + description: Effective genome size. It can be 1.0e+9 or 1000000000, or shortcuts:'hs' for human (2.7e9), 'mm' for mouse (1.87e9), 'ce' for C. elegans (9e7) and 'dm' for fruitfly (1.2e8) output: diff --git a/nextflow_schema.json b/nextflow_schema.json index a8028be6d..f8a9b0ccd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -209,11 +209,7 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "bwa", - "bowtie2", - "star" - ] + "enum": ["bwa", "bowtie2", "star"] }, "keep_dups": { "type": "boolean", @@ -256,7 +252,6 @@ "description": "BAMTools JSON file with custom filters for single-end data.", "fa_icon": "fas fa-cog" } - } }, "peak_calling_options": { @@ -490,14 +485,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "fingerprint_bins": { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..6440c433a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20 @@ +{ + "name": "nf-core-chipseq", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "prettier": "npm:undefined@*" + } + }, + "node_modules/prettier": { + "dev": true + } + }, + "dependencies": { + "prettier": { + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..3a05ceeb0 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "prettier": "npm:undefined@*" + } +} From daf3bba0e5869867717aad5ebab285c680ad77fe Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 28 Mar 2022 15:23:32 +0200 Subject: [PATCH 358/538] Update macs2 callpeak --- modules.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules.json b/modules.json index 91121d9ff..82f79253b 100644 --- a/modules.json +++ b/modules.json @@ -46,7 +46,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "macs2/callpeak": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "f0800157544a82ae222931764483331a81812012" }, "multiqc": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -95,4 +95,4 @@ } } } -} +} \ No newline at end of file From 71ec9d80432d91f2dec0f8090831b30e09212014 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 28 Mar 2022 15:27:35 +0200 Subject: [PATCH 359/538] Trying to finally make prettier happy --- .nf-core.yml | 1 - modules.json | 2 +- nextflow_schema.json | 5 +---- package-lock.json | 20 -------------------- package.json | 5 ----- 5 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/.nf-core.yml b/.nf-core.yml index 2252e0a5f..f1d2ac4ed 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,4 +6,3 @@ lint: - .github/workflows/linting.yml - .github/PULL_REQUEST_TEMPLATE.md - bin/check_samplesheet.py - diff --git a/modules.json b/modules.json index 82f79253b..f631a1bcb 100644 --- a/modules.json +++ b/modules.json @@ -95,4 +95,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 58c0dfb9b..f8a9b0ccd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 6440c433a..000000000 --- a/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "nf-core-chipseq", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "devDependencies": { - "prettier": "npm:undefined@*" - } - }, - "node_modules/prettier": { - "dev": true - } - }, - "dependencies": { - "prettier": { - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3a05ceeb0..000000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "prettier": "npm:undefined@*" - } -} From b76c9060081fa1e09575dd4c403ef7785a69e695 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 14:10:35 +0200 Subject: [PATCH 360/538] Install chromap 0.2.1 module --- modules.json | 8 +- .../nf-core/modules/chromap/chromap/main.nf | 95 +++++++++++++++++++ .../nf-core/modules/chromap/chromap/meta.yml | 88 +++++++++++++++++ modules/nf-core/modules/chromap/index/main.nf | 36 +++++++ .../nf-core/modules/chromap/index/meta.yml | 33 +++++++ 5 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/modules/chromap/chromap/main.nf create mode 100644 modules/nf-core/modules/chromap/chromap/meta.yml create mode 100644 modules/nf-core/modules/chromap/index/main.nf create mode 100644 modules/nf-core/modules/chromap/index/meta.yml diff --git a/modules.json b/modules.json index f631a1bcb..63e09554a 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,12 @@ "bwa/mem": { "git_sha": "950700bcdc0e9a2b6883d40d2c51c6fc435cd714" }, + "chromap/chromap": { + "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" + }, + "chromap/index": { + "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" + }, "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, @@ -95,4 +101,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/chromap/chromap/main.nf b/modules/nf-core/modules/chromap/chromap/main.nf new file mode 100644 index 000000000..bf3d1234c --- /dev/null +++ b/modules/nf-core/modules/chromap/chromap/main.nf @@ -0,0 +1,95 @@ +process CHROMAP_CHROMAP { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::chromap=0.2.1 bioconda::samtools=1.15" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:bd74d08a359024829a7aec1638a28607bbcd8a58-0' : + 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:bd74d08a359024829a7aec1638a28607bbcd8a58-0' }" + + input: + tuple val(meta), path(reads) + path fasta + path index + path barcodes + path whitelist + path chr_order + path pairs_chr_order + + output: + tuple val(meta), path("*.bed.gz") , optional:true, emit: bed + tuple val(meta), path("*.bam") , optional:true, emit: bam + tuple val(meta), path("*.tagAlign.gz"), optional:true, emit: tagAlign + tuple val(meta), path("*.pairs.gz") , optional:true, emit: pairs + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def args_list = args.tokenize() + + def file_extension = args.contains("--SAM") ? 'sam' : args.contains("--TagAlign")? 'tagAlign' : args.contains("--pairs")? 'pairs' : 'bed' + if (barcodes) { + args_list << "-b ${barcodes.join(',')}" + if (whitelist) { + args_list << "--barcode-whitelist $whitelist" + } + } + if (chr_order) { + args_list << "--chr-order $chr_order" + } + if (pairs_chr_order){ + args_list << "--pairs-natural-chr-order $pairs_chr_order" + } + def final_args = args_list.join(' ') + def compression_cmds = "gzip -n ${prefix}.${file_extension}" + if (args.contains("--SAM")) { + compression_cmds = """ + samtools view $args2 -@ $task.cpus -bh \\ + -o ${prefix}.bam ${prefix}.${file_extension} + rm ${prefix}.${file_extension} + """ + } + if (meta.single_end) { + """ + chromap \\ + $final_args \\ + -t $task.cpus \\ + -x $index \\ + -r $fasta \\ + -1 ${reads.join(',')} \\ + -o ${prefix}.${file_extension} + + $compression_cmds + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: \$(echo \$(chromap --version 2>&1)) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + } else { + """ + chromap \\ + $final_args \\ + -t $task.cpus \\ + -x $index \\ + -r $fasta \\ + -1 ${reads[0]} \\ + -2 ${reads[1]} \\ + -o ${prefix}.${file_extension} + + $compression_cmds + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: \$(echo \$(chromap --version 2>&1)) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + } +} diff --git a/modules/nf-core/modules/chromap/chromap/meta.yml b/modules/nf-core/modules/chromap/chromap/meta.yml new file mode 100644 index 000000000..a86fddc99 --- /dev/null +++ b/modules/nf-core/modules/chromap/chromap/meta.yml @@ -0,0 +1,88 @@ +name: chromap_chromap +description: | + Performs preprocessing and alignment of chromatin fastq files to + fasta reference files using chromap. +keywords: + - chromap + - alignment + - map + - fastq + - bam + - sam + - hi-c + - atac-seq + - chip-seq + - trimming + - duplicate removal +tools: + - chromap: + description: Fast alignment and preprocessing of chromatin profiles + homepage: https://github.com/haowenz/chromap + documentation: https://github.com/haowenz/chromap + tool_dev_url: https://github.com/haowenz/chromap + doi: "" + licence: ["GPL v3"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. + - fasta: + type: file + description: | + The fasta reference file. + - index: + type: file + description: | + Chromap genome index files (*.index) + - barcodes: + type: file + description: | + Cell barcode files + - whitelist: + type: file + description: | + Cell barcode whitelist file + - chr_order: + type: file + description: | + Custom chromosome order + - pairs_chr_order: + type: file + description: | + Natural chromosome order for pairs flipping +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - bed: + type: file + description: BED file + pattern: "*.bed.gz" + - bam: + type: file + description: BAM file + pattern: "*.bam" + - tagAlign: + type: file + description: tagAlign file + pattern: "*.tagAlign.gz" + - pairs: + type: file + description: pairs file + pattern: "*.pairs.gz" + +authors: + - "@mahesh-panchal" diff --git a/modules/nf-core/modules/chromap/index/main.nf b/modules/nf-core/modules/chromap/index/main.nf new file mode 100644 index 000000000..ee3706959 --- /dev/null +++ b/modules/nf-core/modules/chromap/index/main.nf @@ -0,0 +1,36 @@ +process CHROMAP_INDEX { + tag "$fasta" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::chromap=0.2.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/chromap:0.2.1--hd03093a_0' : + 'quay.io/biocontainers/chromap:0.2.1--hd03093a_0' }" + + input: + path fasta + + output: + path "*.index" , emit: index + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = fasta.baseName + """ + chromap \\ + -i \\ + $args \\ + -t $task.cpus \\ + -r $fasta \\ + -o ${prefix}.index + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + chromap: \$(echo \$(chromap --version 2>&1)) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/chromap/index/meta.yml b/modules/nf-core/modules/chromap/index/meta.yml new file mode 100644 index 000000000..6659221f6 --- /dev/null +++ b/modules/nf-core/modules/chromap/index/meta.yml @@ -0,0 +1,33 @@ +name: chromap_index +description: Indexes a fasta reference genome ready for chromatin profiling. +keywords: + - index + - fasta + - genome + - reference +tools: + - chromap: + description: Fast alignment and preprocessing of chromatin profiles + homepage: https://github.com/haowenz/chromap + documentation: https://github.com/haowenz/chromap + tool_dev_url: https://github.com/haowenz/chromap + doi: "" + licence: ["GPL v3"] + +input: + - fasta: + type: file + description: Fasta reference file. + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - index: + type: file + description: Index file of the reference genome + pattern: "*.{index}" + +authors: + - "@mahesh-panchal" From 2e3af0dd98bdd2643aafca42b911def74494f1fb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 14:24:02 +0200 Subject: [PATCH 361/538] Add chromap as mapper --- conf/modules.config | 26 ++++++++++++++++++ main.nf | 1 + nextflow_schema.json | 6 +++++ subworkflows/local/prepare_genome.nf | 20 ++++++++++++++ subworkflows/nf-core/align_chromap.nf | 38 +++++++++++++++++++++++++++ workflows/chipseq.nf | 26 +++++++++++++----- 6 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 subworkflows/nf-core/align_chromap.nf diff --git a/conf/modules.config b/conf/modules.config index 75639a693..a1c8b5a9b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -221,6 +221,32 @@ if (params.aligner == 'bowtie2') { } } + +if (params.aligner == 'chromap') { + process { + withName: CHROMAP_INDEX { + ext.args = '' + publishDir = [ + path: { "${params.outdir}/genome/${params.aligner}/index" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: CHROMAP_CHROMAP { + ext.args = [ + '--preset chip', + '--SAM' + ].join(' ').trim() + ext.prefix = { "${meta.id}.Lb" } + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } +} + if (params.aligner == 'star') { process { withName: '.*:ALIGN_STAR:STAR_ALIGN' { diff --git a/main.nf b/main.nf index a57176009..b91365fac 100755 --- a/main.nf +++ b/main.nf @@ -20,6 +20,7 @@ nextflow.enable.dsl = 2 params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') params.bwa_index = WorkflowMain.getGenomeAttribute(params, 'bwa') params.bowtie2_index = WorkflowMain.getGenomeAttribute(params, 'bowtie2') +params.chromap_index = WorkflowMain.getGenomeAttribute(params, 'chromap') params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') diff --git a/nextflow_schema.json b/nextflow_schema.json index f8a9b0ccd..df595341c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -103,6 +103,12 @@ "fa_icon": "fas fa-bezier-curve", "description": "Path to directory or tar.gz archive for pre-built Bowtie2 index." }, + "chromap_index": { + "type": "string", + "format": "path", + "fa_icon": "fas fa-bezier-curve", + "description": "Path to directory or tar.gz archive for pre-built Chromap index." + }, "star_index": { "type": "string", "format": "path", diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a88d05725..e271da03d 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -18,6 +18,7 @@ include { GFFREAD } from '../../modules/nf-core/modules/gffread/mai include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/modules/custom/getchromsizes/main' include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' include { BOWTIE2_BUILD } from '../../modules/nf-core/modules/bowtie2/build/main' +include { CHROMAP_INDEX } from '../../modules/nf-core/modules/chromap/index/main' include { GTF2BED } from '../../modules/local/gtf2bed' include { GENOME_BLACKLIST_REGIONS } from '../../modules/local/genome_blacklist_regions' @@ -158,6 +159,24 @@ workflow PREPARE_GENOME { } } + // + // Uncompress CHROMAP index or generate from scratch if required + // + ch_chromap_index = Channel.empty() + if (prepare_tool_index == 'chromap') { + if (params.chromap_index) { + if (params.chromap_index.endsWith('.tar.gz')) { + ch_chromap_index = UNTAR ( params.chromap_index ).untar + ch_versions = ch_versions.mix(UNTAR.out.versions) + } else { + ch_chromap_index = file(params.chromap_index) + } + } else { + ch_chromap_index = CHROMAP_INDEX ( ch_fasta ).index + ch_versions = ch_versions.mix(CHROMAP_INDEX.out.versions) + } + } + // // Uncompress STAR index or generate from scratch if required // @@ -184,6 +203,7 @@ workflow PREPARE_GENOME { filtered_bed = ch_genome_filtered_bed // path: *.include_regions.bed bwa_index = ch_bwa_index // path: bwa/index/ bowtie2_index = ch_bowtie2_index // path: bowtie2/index/ + chromap_index = ch_chromap_index // path: genome.index star_index = ch_star_index // path: star/index/ versions = ch_versions.ifEmpty(null) // channel: [ versions.yml ] diff --git a/subworkflows/nf-core/align_chromap.nf b/subworkflows/nf-core/align_chromap.nf new file mode 100644 index 000000000..5afa99bc2 --- /dev/null +++ b/subworkflows/nf-core/align_chromap.nf @@ -0,0 +1,38 @@ +/* + * Map reads, sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +include { CHROMAP_CHROMAP } from '../../modules/nf-core/modules/chromap/chromap/main' +include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' + +workflow ALIGN_CHROMAP { + take: + reads // channel: [ val(meta), [ reads ] ] + index // path: /path/to/index + fasta // path: /path/to/fasta + + main: + + ch_versions = Channel.empty() + + // + // Map reads with CHROMAP + // + CHROMAP_CHROMAP(reads, fasta, index, [], [], [], []) + ch_versions = ch_versions.mix(CHROMAP_CHROMAP.out.versions.first()) + + // + // Sort, index BAM file and run samtools stats, flagstat and idxstats + // + BAM_SORT_SAMTOOLS(CHROMAP_CHROMAP.out.bam) + ch_versions = ch_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first()) + + emit: + bam = BAM_SORT_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] + bai = BAM_SORT_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] + stats = BAM_SORT_SAMTOOLS.out.stats // channel: [ val(meta), [ stats ] ] + flagstat = BAM_SORT_SAMTOOLS.out.flagstat // channel: [ val(meta), [ flagstat ] ] + idxstats = BAM_SORT_SAMTOOLS.out.idxstats // channel: [ val(meta), [ idxstats ] ] + + versions = ch_versions // path: versions.yml +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 61516c9a0..698f93839 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -5,7 +5,7 @@ */ def valid_params = [ - aligners : [ 'bwa', 'bowtie2', 'star' ] + aligners : [ 'bwa', 'bowtie2', 'chromap', 'star' ] ] def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,7 +18,7 @@ def checkPathParamList = [ params.input, params.multiqc_config, params.fasta, params.gtf, params.gff, params.gene_bed, - params.bwa_index, params.bowtie2_index, params.star_index, + params.bwa_index, params.bowtie2_index, params.chromap_index, params.star_index, params.blacklist, params.bamtools_filter_pe_config, params.bamtools_filter_se_config ] @@ -27,10 +27,6 @@ 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!' } -// Check alignment parameters -def prepareToolIndices = [] -// if (!params.skip_alignment) { prepareToolIndices << params.aligner } //DEL - // Save AWS IGenomes file containing annotation version def anno_readme = params.genomes[ params.genome ]?.readme if (anno_readme && file(anno_readme).exists()) { @@ -118,6 +114,7 @@ include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../module include { FASTQC_TRIMGALORE } from '../subworkflows/nf-core/fastqc_trimgalore' include { ALIGN_BWA_MEM } from '../subworkflows/nf-core/align_bwa_mem' include { ALIGN_BOWTIE2 } from '../subworkflows/nf-core/align_bowtie2' +include { ALIGN_CHROMAP } from '../subworkflows/nf-core/align_chromap' include { ALIGN_STAR } from '../subworkflows/nf-core/align_star' include { MARK_DUPLICATES_PICARD } from '../subworkflows/nf-core/mark_duplicates_picard' @@ -199,6 +196,23 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ALIGN_BOWTIE2.out.versions.first()) } + // + // SUBWORKFLOW: Alignment with CHROMAP & BAM QC + // + if (params.aligner == 'chromap') { + ALIGN_CHROMAP ( + FASTQC_TRIMGALORE.out.reads, + PREPARE_GENOME.out.chromap_index, + PREPARE_GENOME.out.fasta + ) + ch_genome_bam = ALIGN_CHROMAP.out.bam + ch_genome_bam_index = ALIGN_CHROMAP.out.bai + ch_samtools_stats = ALIGN_CHROMAP.out.stats + ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat + ch_samtools_idxstats = ALIGN_CHROMAP.out.idxstats + ch_versions = ch_versions.mix(ALIGN_CHROMAP.out.versions.first()) + } + // // SUBWORKFLOW: Alignment with STAR & BAM QC // From 3797d2d825b59326138801a04a46783039775ecc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 15:06:39 +0200 Subject: [PATCH 362/538] Add chromap as a choice for aligner (schema) --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index df595341c..cb99b41f5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -215,7 +215,7 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": ["bwa", "bowtie2", "star"] + "enum": ["bwa", "bowtie2", "chromap", "star"] }, "keep_dups": { "type": "boolean", From dbdefe6235d1276a3a1a11d9a65c095f5c55e754 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 15:08:43 +0200 Subject: [PATCH 363/538] Make prettier happy --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 63e09554a..c417bcb98 100644 --- a/modules.json +++ b/modules.json @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} From 3fc73c3828846efb769dab288f17af56dbee563c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 15:17:12 +0200 Subject: [PATCH 364/538] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index acc542769..995ed3a46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners - Update pipeline template to nf-core/tools `2.2` - Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - Removed `--publish_dir_mode` as it is no longer required for the new syntax From ffa1038f55e63bf65cdf07dfeebc2b7a8df19742 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 22:13:31 +0200 Subject: [PATCH 365/538] Apply review suggestions --- conf/modules.config | 5 +---- subworkflows/nf-core/align_chromap.nf | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a1c8b5a9b..560853be8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -233,10 +233,7 @@ if (params.aligner == 'chromap') { ] } withName: CHROMAP_CHROMAP { - ext.args = [ - '--preset chip', - '--SAM' - ].join(' ').trim() + ext.args = '--preset chip --SAM' ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, diff --git a/subworkflows/nf-core/align_chromap.nf b/subworkflows/nf-core/align_chromap.nf index 5afa99bc2..7eb739779 100644 --- a/subworkflows/nf-core/align_chromap.nf +++ b/subworkflows/nf-core/align_chromap.nf @@ -7,9 +7,9 @@ include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' workflow ALIGN_CHROMAP { take: - reads // channel: [ val(meta), [ reads ] ] - index // path: /path/to/index - fasta // path: /path/to/fasta + reads // channel: [ val(meta), [ reads ] ] + index // path: /path/to/index + fasta // path: /path/to/fasta main: From 3800855ecb73bf22fad5ccaad34094756b3e062f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 30 Mar 2022 23:18:52 +0200 Subject: [PATCH 366/538] 1st iteration for filtering macs2 files without peaks --- workflows/chipseq.nf | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 698f93839..90d37a202 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -263,7 +263,7 @@ workflow CHIPSEQ { // FILTER_BAM_BAMTOOLS ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), - PREPARE_GENOME.out.filtered_bed, + PREPARE_GENOME.out.filtered_bed.first(), ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config @@ -405,10 +405,22 @@ workflow CHIPSEQ { ch_ip_control_bam, params.macs_gsize ) + ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) + // + // Filter for MACS2 files without peaks + // + // [[id:SPT5_T15_REP1, single_end:false, antibody:SPT5, control:SPT5_INPUT_REP1], /home/kadomu/nxf_scratch/02/91c628910c3014b2267e2bcff1a82d/SPT5_T15_REP1_peaks.broadPeak] + MACS2_CALLPEAK + .out + .peak + .filter { meta, peaks -> peaks.size() > 0 } + .set { ch_macs2_peaks } + ch_ip_control_bam - .join(MACS2_CALLPEAK.out.peak, by: [0]) + //.join(MACS2_CALLPEAK.out.peak, by: [0]) + .join(ch_macs2_peaks, by: [0]) .map { it -> [ it[0], it[1], it[3] ] } .set { ch_ip_peak } FRIP_SCORE ( @@ -431,12 +443,14 @@ workflow CHIPSEQ { if (!params.skip_peak_annotation && !params.skip_peak_qc) { PLOT_MACS2_QC ( - MACS2_CALLPEAK.out.peak.collect{it[1]} + // MACS2_CALLPEAK.out.peak.collect{it[1]} + ch_macs2_peaks.collect{it[1]} ) ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) HOMER_ANNOTATEPEAKS_MACS2 ( - MACS2_CALLPEAK.out.peak, + // MACS2_CALLPEAK.out.peak + ch_macs2_peaks, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.gtf ) @@ -457,9 +471,11 @@ workflow CHIPSEQ { if (!params.skip_consensus_peaks) { // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - MACS2_CALLPEAK - .out - .peak + + // MACS2_CALLPEAK + // .out + // .peak + ch_macs2_peaks .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } .groupTuple() .map { @@ -538,7 +554,8 @@ workflow CHIPSEQ { IGV ( PREPARE_GENOME.out.fasta, UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), + ch_macs2_peaks.collect{it[1]}.ifEmpty([]), MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), "bwa/mergedLibrary/bigwig", { ["bwa/mergedLibrary/macs2", From 684906dceb2c013ad2319bf2a82b3a794cd9cc41 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 31 Mar 2022 15:08:06 +0200 Subject: [PATCH 367/538] Fix issue with phantompeakqualtools --- CHANGELOG.md | 1 + modules/local/multiqc_custom_phantompeakqualtools.nf | 2 +- modules/nf-core/modules/phantompeakqualtools/main.nf | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 995ed3a46..b971bd081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners - Update pipeline template to nf-core/tools `2.2` - Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index d0b1ea9cb..7ee98d2a5 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -19,7 +19,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv - Rscript -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" + Rscript -e --max-ppsize=500000 "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" awk -v OFS='\t' '{print "${meta.id}", \$9}' $spp | cat $nsc_header - > ${prefix}.spp_nsc_mqc.tsv awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index c8325b059..c52892921 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -26,7 +26,7 @@ process PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` - Rscript -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript -e --max-ppsize=500000 "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus cat <<-END_VERSIONS > versions.yml "${task.process}": From 3f18b50e86679dd2d4040f52e5b5042c89377928 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 31 Mar 2022 16:42:22 +0200 Subject: [PATCH 368/538] Arguments order matter --- modules/local/multiqc_custom_phantompeakqualtools.nf | 2 +- modules/nf-core/modules/phantompeakqualtools/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index 7ee98d2a5..2e9118237 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -19,7 +19,7 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ cp $correlation_header ${prefix}.spp_correlation_mqc.tsv - Rscript -e --max-ppsize=500000 "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" + Rscript --max-ppsize=500000 -e "load('$rdata'); write.table(crosscorr\\\$cross.correlation, file=\\"${prefix}.spp_correlation_mqc.tsv\\", sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE,append=TRUE)" awk -v OFS='\t' '{print "${meta.id}", \$9}' $spp | cat $nsc_header - > ${prefix}.spp_nsc_mqc.tsv awk -v OFS='\t' '{print "${meta.id}", \$10}' $spp | cat $rsc_header - > ${prefix}.spp_rsc_mqc.tsv diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index c52892921..038c7c6ba 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -26,7 +26,7 @@ process PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` - Rscript -e --max-ppsize=500000 "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript --max-ppsize=500000 -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus cat <<-END_VERSIONS > versions.yml "${task.process}": From 70c2c76bc26dde61e223d9a1cad8d0b859c5f198 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 1 Apr 2022 09:44:31 +0200 Subject: [PATCH 369/538] Install phantompeakqualtools from modules --- modules.json | 4 +- .../modules/phantompeakqualtools/main.nf | 2 +- .../modules/phantompeakqualtools/meta.yml | 60 +++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 modules/nf-core/modules/phantompeakqualtools/meta.yml diff --git a/modules.json b/modules.json index c417bcb98..bc1fa02c4 100644 --- a/modules.json +++ b/modules.json @@ -58,7 +58,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "phantompeakqualtools": { - "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + "git_sha": "5e7daa7b96fa9699a52ac8fa3dcbf4291cc6d050" }, "picard/collectmultiplemetrics": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -101,4 +101,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index 038c7c6ba..f584cb65d 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -26,7 +26,7 @@ process PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` - Rscript --max-ppsize=500000 -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/phantompeakqualtools/meta.yml b/modules/nf-core/modules/phantompeakqualtools/meta.yml new file mode 100644 index 000000000..6488500d4 --- /dev/null +++ b/modules/nf-core/modules/phantompeakqualtools/meta.yml @@ -0,0 +1,60 @@ +name: "phantompeakqualtools" + +description: +keywords: + - "ChIP-Seq" + - "QC" + - "phantom peaks" +tools: + - "phantompeakqualtools": + description: | + "This package computes informative enrichment and quality measures + for ChIP-seq/DNase-seq/FAIRE-seq/MNase-seq data. It can also be used + to obtain robust estimates of the predominant fragment length or + characteristic tag shift values in these assays." + homepage: "None" + documentation: "https://github.com/kundajelab/phantompeakqualtools" + tool_dev_url: "https://github.com/kundajelab/phantompeakqualtools" + doi: "https://doi.org/10.1101/gr.136184.111" + licence: "['BSD-3-clause']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - spp: + type: file + description: | + A ChIP-Seq Processing Pipeline file containing + peakshift/phantomPeak results + pattern: "*.{out}" + - pdf: + type: file + description: A pdf containing save cross-correlation plots + pattern: "*.{pdf}" + - rdata: + type: file + description: Rdata file containing the R session + pattern: "*.{Rdata}" + +authors: + - "@drpatelh" + - "@Emiller88" + - "@JoseEspinosa" From 7ff25bef3caf3955b18ea587bc6e48ea67d0c99b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 1 Apr 2022 10:03:28 +0200 Subject: [PATCH 370/538] Fix prettier --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index bc1fa02c4..bf894642f 100644 --- a/modules.json +++ b/modules.json @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} From dae04ece0048b63dec42e97f5a66e2f39ddd0af7 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Apr 2022 18:16:33 +0200 Subject: [PATCH 371/538] Filter empty peaks files --- workflows/chipseq.nf | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 90d37a202..f5960e9d3 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -400,18 +400,15 @@ workflow CHIPSEQ { .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } .set { ch_ip_control_bam } - MACS2_CALLPEAK ( ch_ip_control_bam, params.macs_gsize ) - ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) // // Filter for MACS2 files without peaks // - // [[id:SPT5_T15_REP1, single_end:false, antibody:SPT5, control:SPT5_INPUT_REP1], /home/kadomu/nxf_scratch/02/91c628910c3014b2267e2bcff1a82d/SPT5_T15_REP1_peaks.broadPeak] MACS2_CALLPEAK .out .peak @@ -419,10 +416,10 @@ workflow CHIPSEQ { .set { ch_macs2_peaks } ch_ip_control_bam - //.join(MACS2_CALLPEAK.out.peak, by: [0]) .join(ch_macs2_peaks, by: [0]) .map { it -> [ it[0], it[1], it[3] ] } .set { ch_ip_peak } + FRIP_SCORE ( ch_ip_peak ) @@ -443,13 +440,11 @@ workflow CHIPSEQ { if (!params.skip_peak_annotation && !params.skip_peak_qc) { PLOT_MACS2_QC ( - // MACS2_CALLPEAK.out.peak.collect{it[1]} ch_macs2_peaks.collect{it[1]} ) ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) HOMER_ANNOTATEPEAKS_MACS2 ( - // MACS2_CALLPEAK.out.peak ch_macs2_peaks, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.gtf @@ -471,10 +466,6 @@ workflow CHIPSEQ { if (!params.skip_consensus_peaks) { // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - - // MACS2_CALLPEAK - // .out - // .peak ch_macs2_peaks .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } .groupTuple() @@ -554,7 +545,6 @@ workflow CHIPSEQ { IGV ( PREPARE_GENOME.out.fasta, UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - // MACS2_CALLPEAK.out.peak.collect{it[1]}.ifEmpty([]), ch_macs2_peaks.collect{it[1]}.ifEmpty([]), MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), "bwa/mergedLibrary/bigwig", From 0ea8f11dec012c43a2ea7e95f1e245bf906a6fab Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Apr 2022 18:17:48 +0200 Subject: [PATCH 372/538] Replace "if" by "when" otherwise error when the if condition is not met --- modules/local/macs2_consensus.nf | 65 +++++++++++++++++--------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index 7ca2c35e7..cd27807f1 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -21,36 +21,39 @@ process MACS2_CONSENSUS { tuple val(meta), path("*.intersect.txt"), emit: intersect_txt path "versions.yml" , emit: versions + when: + (meta.multiple_groups || meta.replicates_exist) + script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - if (meta.multiple_groups || meta.replicates_exist) { - def prefix = task.ext.prefix ?: "${meta.id}" - def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') - def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') - def expandparam = params.narrow_peak ? '--is_narrow_peak' : '' - """ - sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ - | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt - - macs2_merged_expand.py \\ - ${prefix}.txt \\ - ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ - ${prefix}.boolean.txt \\ - --min_replicates $params.min_reps_consensus \\ - $expandparam - - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed - - echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf - awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf - - plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - END_VERSIONS - """ - } + + def prefix = task.ext.prefix ?: "${meta.id}" + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') + def collapsecols = params.narrow_peak ? (['collapse']*9).join(',') : (['collapse']*8).join(',') + def expandparam = params.narrow_peak ? '--is_narrow_peak' : '' + """ + sort -T '.' -k1,1 -k2,2n ${peaks.collect{it.toString()}.sort().join(' ')} \\ + | mergeBed -c $mergecols -o $collapsecols > ${prefix}.txt + + macs2_merged_expand.py \\ + ${prefix}.txt \\ + ${peaks.collect{it.toString()}.sort().join(',').replaceAll("_peaks.${peak_type}","")} \\ + ${prefix}.boolean.txt \\ + --min_replicates $params.min_reps_consensus \\ + $expandparam + + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$1, \$2, \$3, \$4, "0", "+" }' ${prefix}.boolean.txt > ${prefix}.bed + + echo -e "GeneID\tChr\tStart\tEnd\tStrand" > ${prefix}.saf + awk -v FS='\t' -v OFS='\t' 'FNR > 1 { print \$4, \$1, \$2, \$3, "+" }' ${prefix}.boolean.txt >> ${prefix}.saf + + plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + END_VERSIONS + """ + } From 081ff45942d93e4ebb6a55c1c29e0464cd1e9753 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Apr 2022 18:28:54 +0200 Subject: [PATCH 373/538] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b971bd081..42ea62619 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners - Update pipeline template to nf-core/tools `2.2` From 31523142591e045cb6d4d1c69c93e1578a7fc210 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Apr 2022 10:15:49 +0200 Subject: [PATCH 374/538] Bring back publish_dir_mode --- conf/modules.config | 110 ++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 560853be8..f1f4921da 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -46,7 +46,7 @@ process { withName: 'GUNZIP_.*' { publishDir = [ path: { "${params.outdir}/genome" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -59,7 +59,7 @@ process { withName: 'UNTAR_.*|BWA_INDEX|BOWTIE2_BUILD|STAR_GENOMEGENERATE' { publishDir = [ path: { "${params.outdir}/genome/index" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -69,7 +69,7 @@ process { ext.args = '--keep-exon-attrs -F -T' publishDir = [ path: { "${params.outdir}/genome" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -78,7 +78,7 @@ process { withName: 'GTF2BED' { publishDir = [ path: { "${params.outdir}/genome" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -87,7 +87,7 @@ process { withName: 'CUSTOM_GETCHROMSIZES' { publishDir = [ path: { "${params.outdir}/genome" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -96,7 +96,7 @@ process { withName: 'GENOME_BLACKLIST_REGIONS' { publishDir = [ path: { "${params.outdir}/genome" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_reference ] @@ -114,12 +114,12 @@ if (!(params.skip_fastqc || params.skip_qc)) { publishDir = [ [ path: { "${params.outdir}/fastqc" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{html}" ], [ path: { "${params.outdir}/fastqc/zips" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{zip}" ] ] @@ -137,22 +137,22 @@ if (!params.skip_trimming) { publishDir = [ [ path: { "${params.outdir}/trimgalore/fastqc" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{html}" ], [ path: { "${params.outdir}/trimgalore/fastqc/zips" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{zip}" ], [ path: { "${params.outdir}/trimgalore/logs" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.txt" ], [ path: { "${params.outdir}/trimgalore" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.fq.gz", enabled: params.save_trimmed ] @@ -166,7 +166,7 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - mode: 'copy' + mode: params.publish_dir_mode ] } @@ -174,7 +174,7 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -183,7 +183,7 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -200,7 +200,7 @@ if (params.aligner == 'bwa') { ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -214,7 +214,7 @@ if (params.aligner == 'bowtie2') { ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -228,7 +228,7 @@ if (params.aligner == 'chromap') { ext.args = '' publishDir = [ path: { "${params.outdir}/genome/${params.aligner}/index" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -237,7 +237,7 @@ if (params.aligner == 'chromap') { ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -260,17 +260,17 @@ if (params.aligner == 'star') { publishDir = [ [ path: { "${params.outdir}/${params.aligner}/log" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.{out,tab}' ], [ path: { "${params.outdir}/${params.aligner}/library" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.bam', ], [ path: { "${params.outdir}/${params.aligner}/unmapped" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_unaligned ] @@ -285,7 +285,7 @@ process { ext.prefix = { "${meta.id}.mLb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -296,12 +296,12 @@ process { publishDir = [ [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.metrics.txt' ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.bam', enabled: params.save_align_intermeds ] @@ -312,7 +312,7 @@ process { ext.prefix = { "${meta.id}.mkD.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.{bai,csi}' ] } @@ -320,7 +320,7 @@ process { withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.{stats,flagstat,idxstats}' ] } @@ -329,7 +329,7 @@ process { ext.prefix = { "${meta.id}.mLb.flT.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: params.save_align_intermeds ] @@ -340,7 +340,7 @@ process { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -349,7 +349,7 @@ process { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*.{bai,csi}' ] } @@ -358,7 +358,7 @@ process { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.bam" ] } @@ -367,7 +367,7 @@ process { ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{stats,flagstat,idxstats}" ] } @@ -376,7 +376,7 @@ process { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.{out,pdf}" ] } @@ -384,7 +384,7 @@ process { withName: 'MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS' { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -394,12 +394,12 @@ process { publishDir = [ [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.bigWig" ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig/scale" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.txt" ] ] @@ -410,7 +410,7 @@ process { publishDir = [ [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.bigWig" ] ] @@ -425,12 +425,12 @@ if (!params.skip_picard_metrics) { publishDir = [ [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*_metrics" ], [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/picard_metrics/pdf" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.pdf" ] ] @@ -445,7 +445,7 @@ if (!params.skip_preseq) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/preseq" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -459,7 +459,7 @@ if (!params.skip_plot_profile) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -468,7 +468,7 @@ if (!params.skip_plot_profile) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -477,7 +477,7 @@ if (!params.skip_plot_profile) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -494,7 +494,7 @@ if (!params.skip_plot_fingerprint) { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotFingerprint" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -516,7 +516,7 @@ if (params.macs_gsize) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -540,7 +540,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -556,7 +556,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -569,7 +569,7 @@ if (params.macs_gsize) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -582,7 +582,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -599,7 +599,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -612,7 +612,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -630,7 +630,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -652,7 +652,7 @@ if (params.macs_gsize) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus/deseq2' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -667,7 +667,7 @@ if (params.macs_gsize) { "${params.outdir}/igv", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -684,7 +684,7 @@ if (!params.skip_multiqc) { "${params.outdir}/multiqc", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 265170b7b554d5684f26fc0da01881456a8123ce Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Apr 2022 10:24:19 +0200 Subject: [PATCH 375/538] Update changelog --- CHANGELOG.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42ea62619..53ca266b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,14 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners -- Update pipeline template to nf-core/tools `2.2` +- Updated pipeline template to [nf-core/tools 2.3.2](https://github.com/nf-core/tools/releases/tag/2.3.2) - Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - - Removed `--publish_dir_mode` as it is no longer required for the new syntax - Bump minimum Nextflow version from `21.04.0` -> `21.10.3` -- Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) - Added `python3` shebang to appropriate scripts in `bin/` directory - [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter -- Update pipeline template to nf-core/tools `2.1` - Add `--save_unaligned` parameter (only available for `bowtie2` and `star`) - Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder - [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. From 1f5a9f88813c9f69b7bd28dd2ccce5e8fa13f767 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Apr 2022 15:43:37 +0200 Subject: [PATCH 376/538] Update modules --- assets/multiqc_config.yml | 4 +-- conf/modules.config | 7 +++-- docs/output.md | 2 +- modules.json | 28 +++++++++---------- modules/nf-core/modules/bowtie2/align/main.nf | 6 ++-- modules/nf-core/modules/bwa/mem/main.nf | 8 ++---- .../nf-core/modules/chromap/chromap/main.nf | 6 ++-- modules/nf-core/modules/fastqc/main.nf | 12 ++++++++ modules/nf-core/modules/multiqc/main.nf | 12 ++++++++ .../picard/collectmultiplemetrics/main.nf | 20 +++++++++++++ .../modules/picard/markduplicates/main.nf | 13 +++++++++ .../nf-core/modules/preseq/lcextrap/main.nf | 12 ++++---- .../nf-core/modules/preseq/lcextrap/meta.yml | 9 +++--- .../nf-core/modules/samtools/idxstats/main.nf | 6 ++-- .../nf-core/modules/samtools/index/main.nf | 18 ++++++++++-- modules/nf-core/modules/samtools/sort/main.nf | 17 +++++++++-- .../nf-core/modules/samtools/stats/main.nf | 17 +++++++++-- modules/nf-core/modules/untar/main.nf | 27 ++++++++++++------ modules/nf-core/modules/untar/meta.yml | 10 +++++++ subworkflows/local/prepare_genome.nf | 6 ++-- workflows/chipseq.nf | 2 +- 21 files changed, 177 insertions(+), 65 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index ad69b5d8a..1a55a16cb 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -155,7 +155,7 @@ extra_fn_clean_exts: - ".peak" - "_spp" - ".spp" - - "ccurve" + - "lc_extrap" # # Customise the module search patterns to speed up execution time # # - Skip module sub-tools that we are not interested in @@ -166,7 +166,7 @@ sp: cutadapt: fn: "*trimming_report.txt" preseq: - fn: "*.ccurve.txt" + fn: "*.lc_extrap.txt" deeptools/plotFingerprintOutRawCounts: fn: "*plotFingerprint*" deeptools/plotProfile: diff --git a/conf/modules.config b/conf/modules.config index f1f4921da..4d0988886 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -192,10 +192,11 @@ process { if (params.aligner == 'bwa') { process { withName: 'BWA_MEM' { - ext.args = [ + ext.args = { [ '-M', - params.bwa_min_score ? " -T ${params.bwa_min_score}" : '' - ].join(' ').trim() + params.bwa_min_score ? " -T ${params.bwa_min_score}" : '', + meta.read_group ? "-R ${meta.read_group}": '' + ].join(' ').trim() } ext.args2 = '-bhS -F 0x0100 -O BAM' ext.prefix = { "${meta.id}.Lb" } publishDir = [ diff --git a/docs/output.md b/docs/output.md index 88b9b99bf..c80fb81a1 100644 --- a/docs/output.md +++ b/docs/output.md @@ -87,7 +87,7 @@ The library-level alignments associated with the same sample are merged and subs - `bwa/mergedLibrary/picard_metrics/pdf/` - `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. - `bwa/mergedLibrary/preseq/` - - `*.ccurve.txt`: Preseq expected future yield file. + - `*.lc_extrap.txt`: Preseq expected future yield file. > **NB:** File names in the resulting directory (i.e. `bwa/mergedLibrary/`) will have the '`.mLb.`' suffix. diff --git a/modules.json b/modules.json index bf894642f..d2e4dbca4 100644 --- a/modules.json +++ b/modules.json @@ -4,7 +4,7 @@ "repos": { "nf-core/modules": { "bowtie2/align": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "bowtie2/build": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -13,10 +13,10 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "bwa/mem": { - "git_sha": "950700bcdc0e9a2b6883d40d2c51c6fc435cd714" + "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" }, "chromap/chromap": { - "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "chromap/index": { "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" @@ -40,7 +40,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "gffread": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -55,37 +55,37 @@ "git_sha": "f0800157544a82ae222931764483331a81812012" }, "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "phantompeakqualtools": { "git_sha": "5e7daa7b96fa9699a52ac8fa3dcbf4291cc6d050" }, "picard/collectmultiplemetrics": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/markduplicates": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "picard/mergesamfiles": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "preseq/lcextrap": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "7111e571cc5b6069de4673cd6165af680f17b4d7" }, "samtools/flagstat": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/idxstats": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/index": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/sort": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/stats": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "subread/featurecounts": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -97,7 +97,7 @@ "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "untar": { - "git_sha": "7ec09d0ef4df89617baacc9b2dafcddb7cd4b05a" + "git_sha": "9ae34a01d1747019fd37753ff4cafb05aec35a2b" } } } diff --git a/modules/nf-core/modules/bowtie2/align/main.nf b/modules/nf-core/modules/bowtie2/align/main.nf index 7e8a9659b..44ce76ca0 100644 --- a/modules/nf-core/modules/bowtie2/align/main.nf +++ b/modules/nf-core/modules/bowtie2/align/main.nf @@ -2,10 +2,10 @@ process BOWTIE2_ALIGN { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4 bioconda::samtools=1.14 conda-forge::pigz=2.6' : null) + conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4 bioconda::samtools=1.15.1 conda-forge::pigz=2.6' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:4d235f41348a00533f18e47c9669f1ecb327f629-0' : - 'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:4d235f41348a00533f18e47c9669f1ecb327f629-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' : + 'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/modules/bwa/mem/main.nf b/modules/nf-core/modules/bwa/mem/main.nf index 27ea6f42e..f55af9443 100644 --- a/modules/nf-core/modules/bwa/mem/main.nf +++ b/modules/nf-core/modules/bwa/mem/main.nf @@ -2,10 +2,10 @@ process BWA_MEM { tag "$meta.id" label 'process_high' - conda (params.enable_conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::bwa=0.7.17 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:c56a3aabc8d64e52d5b9da1e8ecec2031668596d-0' : - 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:c56a3aabc8d64e52d5b9da1e8ecec2031668596d-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:8110a70be2bfe7f75a2ea7f2a89cda4cc7732095-0' : + 'quay.io/biocontainers/mulled-v2-fe8faa35dbf6dc65a0f7f5d4ea12e31a79f73e40:8110a70be2bfe7f75a2ea7f2a89cda4cc7732095-0' }" input: tuple val(meta), path(reads) @@ -23,14 +23,12 @@ process BWA_MEM { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def read_group = meta.read_group ? "-R ${meta.read_group}" : "" def samtools_command = sort_bam ? 'sort' : 'view' """ INDEX=`find -L ./ -name "*.amb" | sed 's/.amb//'` bwa mem \\ $args \\ - $read_group \\ -t $task.cpus \\ \$INDEX \\ $reads \\ diff --git a/modules/nf-core/modules/chromap/chromap/main.nf b/modules/nf-core/modules/chromap/chromap/main.nf index bf3d1234c..137f0340c 100644 --- a/modules/nf-core/modules/chromap/chromap/main.nf +++ b/modules/nf-core/modules/chromap/chromap/main.nf @@ -2,10 +2,10 @@ process CHROMAP_CHROMAP { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::chromap=0.2.1 bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::chromap=0.2.1 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:bd74d08a359024829a7aec1638a28607bbcd8a58-0' : - 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:bd74d08a359024829a7aec1638a28607bbcd8a58-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:963e4fe6a85c548a4018585660aed79780a175d3-0' : + 'quay.io/biocontainers/mulled-v2-1f09f39f20b1c4ee36581dc81cc323c70e661633:963e4fe6a85c548a4018585660aed79780a175d3-0' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index ed6b8c50b..05730368b 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -44,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 1264aac1e..ae019dbf0 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -28,4 +28,16 @@ process MULTIQC { multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ + + stub: + """ + touch multiqc_data + touch multiqc_plots + touch multiqc_report.html + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index e023ea3c2..340463a86 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -42,4 +42,24 @@ process PICARD_COLLECTMULTIPLEMETRICS { picard: \$(picard CollectMultipleMetrics --version 2>&1 | grep -o 'Version.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.CollectMultipleMetrics.alignment_summary_metrics + touch ${prefix}.CollectMultipleMetrics.insert_size_metrics + touch ${prefix}.CollectMultipleMetrics.quality_distribution.pdf + touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle_metrics + touch ${prefix}.CollectMultipleMetrics.quality_by_cycle_metrics + touch ${prefix}.CollectMultipleMetrics.read_length_histogram.pdf + touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle.pdf + touch ${prefix}.CollectMultipleMetrics.quality_by_cycle.pdf + touch ${prefix}.CollectMultipleMetrics.insert_size_histogram.pdf + touch ${prefix}.CollectMultipleMetrics.quality_distribution_metrics + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard CollectMultipleMetrics --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 5196b6edf..e754a587e 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -42,4 +42,17 @@ process PICARD_MARKDUPLICATES { picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + touch ${prefix}.bam.bai + touch ${prefix}.MarkDuplicates.metrics.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + picard: \$(echo \$(picard MarkDuplicates --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/preseq/lcextrap/main.nf b/modules/nf-core/modules/preseq/lcextrap/main.nf index d6dd19e23..97261557e 100644 --- a/modules/nf-core/modules/preseq/lcextrap/main.nf +++ b/modules/nf-core/modules/preseq/lcextrap/main.nf @@ -5,16 +5,16 @@ process PRESEQ_LCEXTRAP { conda (params.enable_conda ? "bioconda::preseq=3.1.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/preseq:3.1.2--h06ef8b0_1' : - 'quay.io/biocontainers/preseq:3.1.2--h06ef8b0_1' }" + 'https://depot.galaxyproject.org/singularity/preseq:3.1.2--h445547b_2': + 'quay.io/biocontainers/preseq:3.1.2--h445547b_2' }" input: tuple val(meta), path(bam) output: - tuple val(meta), path("*.ccurve.txt"), emit: ccurve - tuple val(meta), path("*.log") , emit: log - path "versions.yml" , emit: versions + tuple val(meta), path("*.lc_extrap.txt"), emit: lc_extrap + tuple val(meta), path("*.log") , emit: log + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -28,7 +28,7 @@ process PRESEQ_LCEXTRAP { lc_extrap \\ $args \\ $paired_end \\ - -output ${prefix}.ccurve.txt \\ + -output ${prefix}.lc_extrap.txt \\ $bam cp .command.err ${prefix}.command.log diff --git a/modules/nf-core/modules/preseq/lcextrap/meta.yml b/modules/nf-core/modules/preseq/lcextrap/meta.yml index 0e33df250..f1be05a2f 100644 --- a/modules/nf-core/modules/preseq/lcextrap/meta.yml +++ b/modules/nf-core/modules/preseq/lcextrap/meta.yml @@ -8,8 +8,8 @@ tools: - preseq: description: Software for predicting library complexity and genome coverage in high-throughput sequencing homepage: http://smithlabresearch.org/software/preseq/ - documentation: None - tool_dev_url: None + documentation: http://smithlabresearch.org/wp-content/uploads/manual.pdf + tool_dev_url: https://github.com/smithlabcode/preseq doi: "" licence: ["GPL"] @@ -34,10 +34,10 @@ output: type: file description: File containing software versions pattern: "versions.yml" - - ccurve: + - lc_extrap: type: file description: File containing output of Preseq lcextrap - pattern: "*.{ccurve.txt}" + pattern: "*.{lc_extrap.txt}" - log: type: file description: Log file containing stderr produced by Preseq @@ -45,3 +45,4 @@ output: authors: - "@drpatelh" + - "@Emiller88" diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index 7d5cee172..a49ff35f9 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index e41cdcc88..e04e63e85 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(input) @@ -33,4 +33,16 @@ process SAMTOOLS_INDEX { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + """ + touch ${input}.bai + touch ${input}.crai + touch ${input}.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index 0e2de8baa..b4fc1cbe9 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam) @@ -28,4 +28,15 @@ process SAMTOOLS_SORT { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 6efc9d9a5..bbdc3240d 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(input), path(input_index) @@ -34,4 +34,15 @@ process SAMTOOLS_STATS { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${input}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index bbae948aa..bbfa0bfe7 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -2,25 +2,25 @@ process UNTAR { tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::tar=1.32" : null) + conda (params.enable_conda ? "conda-forge::tar=1.34" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv2/biocontainers_v1.2.0_cv2.img' : + 'biocontainers/biocontainers:v1.2.0_cv2' }" input: - path archive + tuple val(meta), path(archive) output: - path "$untar" , emit: untar - path "versions.yml", emit: versions + tuple val(meta), path("$untar"), emit: untar + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - untar = archive.toString() - '.tar.gz' + untar = archive.toString() - '.tar.gz' """ tar \\ -xzvf \\ @@ -33,4 +33,15 @@ process UNTAR { untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') END_VERSIONS """ + + stub: + untar = archive.toString() - '.tar.gz' + """ + touch $untar + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index e877a97c1..d426919bd 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -10,11 +10,21 @@ tools: documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - archive: type: file description: File to be untar pattern: "*.{tar}.{gz}" output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - untar: type: file description: diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index e271da03d..33aa189ed 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -130,7 +130,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bwa') { if (params.bwa_index) { if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR_BWA_INDEX ( params.bwa_index ).untar + ch_bwa_index = UNTAR_BWA_INDEX ( [], params.bwa_index ).untar.map{it -> it[1]} ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) } else { ch_bwa_index = file(params.bwa_index) @@ -148,7 +148,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bowtie2') { if (params.bowtie2_index) { if (params.bowtie2_index.endsWith('.tar.gz')) { - ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( params.bowtie2_index ).untar + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [], params.bowtie2_index ).untar.map{it -> it[1]} ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) } else { ch_bowtie2_index = file(params.bowtie2_index) @@ -184,7 +184,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'star') { if (params.star_index) { if (params.star_index.endsWith('.tar.gz')) { - ch_star_index = UNTAR_STAR_INDEX ( params.star_index ).untar + ch_star_index = UNTAR_STAR_INDEX ( [], params.star_index ).untar.map{it -> it[1]} ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) } else { ch_star_index = file(params.star_index) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index f5960e9d3..625632528 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -291,7 +291,7 @@ workflow CHIPSEQ { PRESEQ_LCEXTRAP ( FILTER_BAM_BAMTOOLS.out.bam ) - ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.ccurve + ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.lc_extrap ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) } From 938d0342d0bfbede0e4dcfe5c91313c0a749520e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Apr 2022 08:40:33 +0200 Subject: [PATCH 377/538] Update samtools flagstat --- modules/nf-core/modules/samtools/flagstat/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index 9e3440acd..b87b21081 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam), path(bai) From e9f4e092ed4507340a35a08ad86a59e14ede357a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Apr 2022 08:40:55 +0200 Subject: [PATCH 378/538] Update bam_filter mulled container --- modules/local/bam_filter.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/bam_filter.nf b/modules/local/bam_filter.nf index 6b31709df..ff07c084b 100644 --- a/modules/local/bam_filter.nf +++ b/modules/local/bam_filter.nf @@ -5,10 +5,10 @@ process BAM_FILTER { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bamtools=2.4.0 bioconda::samtools=1.4.1" : null) + conda (params.enable_conda ? "bioconda::bamtools=2.5.2 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0' : - 'quay.io/biocontainers/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:fc33176431a4b9ef3213640937e641d731db04f1-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:5687a7da26983502d0a8a9a6b05ed727c740ddc4-0' : + 'quay.io/biocontainers/mulled-v2-0560a8046fc82aa4338588eca29ff18edab2c5aa:5687a7da26983502d0a8a9a6b05ed727c740ddc4-0' }" input: tuple val(meta), path(bam), path(bai) From 715ff243c5c95bbfeee15d0c711004da6fa15793 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Apr 2022 10:01:37 +0200 Subject: [PATCH 379/538] Update tools versions in changelog --- CHANGELOG.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53ca266b4..c84a38edb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,30 +39,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Note, since the pipeline is now using Nextflow DSL2, each process will be run with its own [Biocontainer](https://biocontainers.pro/#/registry). This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. - +| Dependency | Old version | New version | +|-----------------------------|-------------|-------------| +| `samtools` | 1.10 | 1.15.1 | +| `picard` | 2.23.1 | 2.26.10 | +| `picard` | 2.23.1 | 2.26.10 | +| `bamtools` | 2.5.1 | 2.5.2 | +| `pysam` | 0.15.3 | 0.16.0.1 | +| `bedtools` | 2.29.2 | 2.30.0 | +| `ucsc-bedgraphtobigwig` | 357 | 377 | +| `deeptools` | 3.4.3 | 3.5.1 | +| `pigz` | 2.3.4 | 2.6 | +| `preseq` | 2.0.3 | 3.1.2 | +| `multiqc` | 1.9 | 1.12 | +| `r-base` | 3.6.1 | 4.0.3 | +| `r-ggplot2` | 3.3.2 | 3.3.3 | +| `bioconductor-deseq2` | 1.26.0 | 1.28.0 | +| `r-optparse` | - | 1.7.1 | +| `chromap` | - | 0.2.1 | +| `bowtie2` | - | 2.4.4 | +| `star` | - | 2.6.1d | +| `r-tidyr` | - | - | +| `r-lattice` | - | - | +| `r-xfun` | - | - | +| `bioconductor-vsn` | - | - | > **NB:** Dependency has been **updated** if both old and new version information is present. > **NB:** Dependency has been **added** if just the new version information is present. From d0f6680e96c8faea670dbe3d5e2e233ef38c40e9 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Apr 2022 11:29:38 +0200 Subject: [PATCH 380/538] Make prettier happy --- CHANGELOG.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c84a38edb..bfc2befaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,30 +39,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Note, since the pipeline is now using Nextflow DSL2, each process will be run with its own [Biocontainer](https://biocontainers.pro/#/registry). This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. -| Dependency | Old version | New version | -|-----------------------------|-------------|-------------| -| `samtools` | 1.10 | 1.15.1 | -| `picard` | 2.23.1 | 2.26.10 | -| `picard` | 2.23.1 | 2.26.10 | -| `bamtools` | 2.5.1 | 2.5.2 | -| `pysam` | 0.15.3 | 0.16.0.1 | -| `bedtools` | 2.29.2 | 2.30.0 | -| `ucsc-bedgraphtobigwig` | 357 | 377 | -| `deeptools` | 3.4.3 | 3.5.1 | -| `pigz` | 2.3.4 | 2.6 | -| `preseq` | 2.0.3 | 3.1.2 | -| `multiqc` | 1.9 | 1.12 | -| `r-base` | 3.6.1 | 4.0.3 | -| `r-ggplot2` | 3.3.2 | 3.3.3 | -| `bioconductor-deseq2` | 1.26.0 | 1.28.0 | -| `r-optparse` | - | 1.7.1 | -| `chromap` | - | 0.2.1 | -| `bowtie2` | - | 2.4.4 | -| `star` | - | 2.6.1d | -| `r-tidyr` | - | - | -| `r-lattice` | - | - | -| `r-xfun` | - | - | -| `bioconductor-vsn` | - | - | +| Dependency | Old version | New version | +| ----------------------- | ----------- | ----------- | +| `samtools` | 1.10 | 1.15.1 | +| `picard` | 2.23.1 | 2.26.10 | +| `picard` | 2.23.1 | 2.26.10 | +| `bamtools` | 2.5.1 | 2.5.2 | +| `pysam` | 0.15.3 | 0.16.0.1 | +| `bedtools` | 2.29.2 | 2.30.0 | +| `ucsc-bedgraphtobigwig` | 357 | 377 | +| `deeptools` | 3.4.3 | 3.5.1 | +| `pigz` | 2.3.4 | 2.6 | +| `preseq` | 2.0.3 | 3.1.2 | +| `multiqc` | 1.9 | 1.12 | +| `r-base` | 3.6.1 | 4.0.3 | +| `r-ggplot2` | 3.3.2 | 3.3.3 | +| `bioconductor-deseq2` | 1.26.0 | 1.28.0 | +| `r-optparse` | - | 1.7.1 | +| `chromap` | - | 0.2.1 | +| `bowtie2` | - | 2.4.4 | +| `star` | - | 2.6.1d | +| `r-tidyr` | - | - | +| `r-lattice` | - | - | +| `r-xfun` | - | - | +| `bioconductor-vsn` | - | - | > **NB:** Dependency has been **updated** if both old and new version information is present. > **NB:** Dependency has been **added** if just the new version information is present. From 2f556a19747d87a711d72aa529b9c8432d0cb73c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 22 Apr 2022 10:28:16 +0200 Subject: [PATCH 381/538] Update FRIP_SCORE mulled container --- modules/local/frip_score.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index 6a364c58c..e8fdbcc91 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -2,10 +2,10 @@ process FRIP_SCORE { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.9" : null) + conda (params.enable_conda ? "bioconda::bedtools=2.30.0 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-': - 'quay.io/biocontainers/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:2200fd433290bb814a952b2fd7cc8013499de840-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:3127fcae6b6bdaf8181e21a26ae61231030a9fcb-0': + 'quay.io/biocontainers/mulled-v2-8186960447c5cb2faa697666dc1e6d919ad23f3e:3127fcae6b6bdaf8181e21a26ae61231030a9fcb-0' }" input: tuple val(meta), path(bam), path(peak) From d3e6824a104fde17d1e0cacc672b82e4c981829b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 22 Apr 2022 13:24:48 +0200 Subject: [PATCH 382/538] Update bam_remove_orphans mulled container --- CHANGELOG.md | 2 +- modules/local/bam_remove_orphans.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfc2befaf..9fda27321 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,7 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi | `picard` | 2.23.1 | 2.26.10 | | `picard` | 2.23.1 | 2.26.10 | | `bamtools` | 2.5.1 | 2.5.2 | -| `pysam` | 0.15.3 | 0.16.0.1 | +| `pysam` | 0.15.3 | 0.19.0 | | `bedtools` | 2.29.2 | 2.30.0 | | `ucsc-bedgraphtobigwig` | 357 | 377 | | `deeptools` | 3.4.3 | 3.5.1 | diff --git a/modules/local/bam_remove_orphans.nf b/modules/local/bam_remove_orphans.nf index 99ff4f932..21ffc73a9 100644 --- a/modules/local/bam_remove_orphans.nf +++ b/modules/local/bam_remove_orphans.nf @@ -5,10 +5,10 @@ process BAM_REMOVE_ORPHANS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::pysam=0.16.0.1 bioconda::samtools=1.13" : null) + conda (params.enable_conda ? "bioconda::pysam=0.19.0 bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0' : - 'quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:980645707aa512b63b32c44c35888ac1dab126dd-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:402e865b8f6af2f3e58c6fc8d57127ff0144b2c7-0' : + 'quay.io/biocontainers/mulled-v2-57736af1eb98c01010848572c9fec9fff6ffaafd:402e865b8f6af2f3e58c6fc8d57127ff0144b2c7-0' }" input: tuple val(meta), path(bam) From dd79c1ceee7d07eae07057fae2a546d7c2b9158d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 22 Apr 2022 16:55:43 +0200 Subject: [PATCH 383/538] Update modules --- conf/modules.config | 1 + modules.json | 6 +++--- modules/nf-core/modules/gunzip/main.nf | 4 ++-- modules/nf-core/modules/phantompeakqualtools/main.nf | 2 +- modules/nf-core/modules/untar/main.nf | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 4d0988886..5a94f3374 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -374,6 +374,7 @@ process { } withName: 'PHANTOMPEAKQUALTOOLS' { + ext.args = { "-p=$task.cpus" } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, diff --git a/modules.json b/modules.json index d2e4dbca4..7ec5dd8ef 100644 --- a/modules.json +++ b/modules.json @@ -46,7 +46,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gunzip": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" }, "homer/annotatepeaks": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -58,7 +58,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "phantompeakqualtools": { - "git_sha": "5e7daa7b96fa9699a52ac8fa3dcbf4291cc6d050" + "git_sha": "b3e56c83c683111d0d3edfa2821454d6132b6b66" }, "picard/collectmultiplemetrics": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" @@ -97,7 +97,7 @@ "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" }, "untar": { - "git_sha": "9ae34a01d1747019fd37753ff4cafb05aec35a2b" + "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" } } } diff --git a/modules/nf-core/modules/gunzip/main.nf b/modules/nf-core/modules/gunzip/main.nf index 9d4b06669..61bf1afa5 100644 --- a/modules/nf-core/modules/gunzip/main.nf +++ b/modules/nf-core/modules/gunzip/main.nf @@ -4,8 +4,8 @@ process GUNZIP { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: tuple val(meta), path(archive) diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index f584cb65d..0362b2e74 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -26,7 +26,7 @@ process PHANTOMPEAKQUALTOOLS { def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` - Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" -p=$task.cpus + Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index bbfa0bfe7..058d17644 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -2,10 +2,10 @@ process UNTAR { tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::tar=1.34" : null) + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv2/biocontainers_v1.2.0_cv2.img' : - 'biocontainers/biocontainers:v1.2.0_cv2' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: tuple val(meta), path(archive) From 503b95b81a968adf83e6a90ad0d1e5238454cc2c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 26 Apr 2022 09:56:33 +0200 Subject: [PATCH 384/538] Update phantompeakqualtools module --- conf/modules.config | 2 +- modules.json | 2 +- modules/nf-core/modules/phantompeakqualtools/main.nf | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5a94f3374..37672b73f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -374,7 +374,7 @@ process { } withName: 'PHANTOMPEAKQUALTOOLS' { - ext.args = { "-p=$task.cpus" } + ext.args2 = { "-p=$task.cpus" } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, diff --git a/modules.json b/modules.json index 7ec5dd8ef..d6cb9f038 100644 --- a/modules.json +++ b/modules.json @@ -58,7 +58,7 @@ "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "phantompeakqualtools": { - "git_sha": "b3e56c83c683111d0d3edfa2821454d6132b6b66" + "git_sha": "6a46e7cf117bbae41bca9b4c7ff7a77794df16ec" }, "picard/collectmultiplemetrics": { "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index 0362b2e74..d8f733425 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -22,11 +22,12 @@ process PHANTOMPEAKQUALTOOLS { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ RUN_SPP=`which run_spp.R` - Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" + Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" $args2 cat <<-END_VERSIONS > versions.yml "${task.process}": From 9ffb7a0a1af526870f4f3ceabf984029fbf5b90b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 28 Apr 2022 22:36:47 +0200 Subject: [PATCH 385/538] Update custom_getchromsizes module --- modules/nf-core/modules/custom/getchromsizes/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/modules/custom/getchromsizes/main.nf b/modules/nf-core/modules/custom/getchromsizes/main.nf index bbcfa9bec..0eabf3a4c 100644 --- a/modules/nf-core/modules/custom/getchromsizes/main.nf +++ b/modules/nf-core/modules/custom/getchromsizes/main.nf @@ -2,10 +2,10 @@ process CUSTOM_GETCHROMSIZES { tag "$fasta" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: path fasta From 2ff1476b33cb18524de60ec31e36b147c8a6a6aa Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 2 May 2022 12:29:19 +0200 Subject: [PATCH 386/538] Update modules picard and trimgalore modules --- modules.json | 10 +++++----- .../modules/picard/collectmultiplemetrics/main.nf | 12 ++++++------ .../nf-core/modules/picard/markduplicates/main.nf | 12 ++++++------ .../nf-core/modules/picard/mergesamfiles/main.nf | 10 +++++----- modules/nf-core/modules/trimgalore/main.nf | 13 ++++++++----- modules/nf-core/modules/trimgalore/meta.yml | 5 +++++ 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/modules.json b/modules.json index d6cb9f038..9a2a18374 100644 --- a/modules.json +++ b/modules.json @@ -25,7 +25,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "custom/getchromsizes": { - "git_sha": "950700bcdc0e9a2b6883d40d2c51c6fc435cd714" + "git_sha": "213403187932dbbdd936a04474cc8cd8abae7a08" }, "deeptools/computematrix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -61,13 +61,13 @@ "git_sha": "6a46e7cf117bbae41bca9b4c7ff7a77794df16ec" }, "picard/collectmultiplemetrics": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "00467ac64affbbc17b255762f10a6c8fa362aabc" }, "picard/markduplicates": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + "git_sha": "20ebb89ff97a2665106be9cace5ccb9aa4eed1be" }, "picard/mergesamfiles": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "20ebb89ff97a2665106be9cace5ccb9aa4eed1be" }, "preseq/lcextrap": { "git_sha": "7111e571cc5b6069de4673cd6165af680f17b4d7" @@ -91,7 +91,7 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "trimgalore": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "85ec13ff1fc2196c5a507ea497de468101baabed" }, "ucsc/bedgraphtobigwig": { "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index 340463a86..a653b5490 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -2,10 +2,10 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -33,9 +33,9 @@ process PICARD_COLLECTMULTIPLEMETRICS { -Xmx${avail_mem}g \\ CollectMultipleMetrics \\ $args \\ - INPUT=$bam \\ - OUTPUT=${prefix}.CollectMultipleMetrics \\ - REFERENCE_SEQUENCE=$fasta + --INPUT $bam \\ + --OUTPUT ${prefix}.CollectMultipleMetrics \\ + --REFERENCE_SEQUENCE $fasta cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index e754a587e..1565c6478 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" input: tuple val(meta), path(bam) @@ -33,9 +33,9 @@ process PICARD_MARKDUPLICATES { -Xmx${avail_mem}g \\ MarkDuplicates \\ $args \\ - I=$bam \\ - O=${prefix}.bam \\ - M=${prefix}.MarkDuplicates.metrics.txt + --INPUT $bam \\ + --OUTPUT ${prefix}.bam \\ + --METRICS_FILE ${prefix}.MarkDuplicates.metrics.txt cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/mergesamfiles/main.nf b/modules/nf-core/modules/picard/mergesamfiles/main.nf index ef5c39807..1e32c63a6 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/main.nf +++ b/modules/nf-core/modules/picard/mergesamfiles/main.nf @@ -2,10 +2,10 @@ process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.26.10" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.26.10--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.26.10--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" input: tuple val(meta), path(bams) @@ -33,8 +33,8 @@ process PICARD_MERGESAMFILES { -Xmx${avail_mem}g \\ MergeSamFiles \\ $args \\ - ${'INPUT='+bam_files.join(' INPUT=')} \\ - OUTPUT=${prefix}.bam + ${'--INPUT '+bam_files.join(' --INPUT ')} \\ + --OUTPUT ${prefix}.bam cat <<-END_VERSIONS > versions.yml "${task.process}": picard: \$( echo \$(picard MergeSamFiles --version 2>&1) | grep -o 'Version:.*' | cut -f2- -d:) diff --git a/modules/nf-core/modules/trimgalore/main.nf b/modules/nf-core/modules/trimgalore/main.nf index 9487c7990..3a3fca904 100644 --- a/modules/nf-core/modules/trimgalore/main.nf +++ b/modules/nf-core/modules/trimgalore/main.nf @@ -11,12 +11,13 @@ process TRIMGALORE { tuple val(meta), path(reads) output: - tuple val(meta), path("*.fq.gz") , emit: reads - tuple val(meta), path("*report.txt"), emit: log - path "versions.yml" , emit: versions + tuple val(meta), path("*{trimmed,val}*.fq.gz"), emit: reads + tuple val(meta), path("*report.txt") , emit: log + path "versions.yml" , emit: versions - tuple val(meta), path("*.html"), emit: html optional true - tuple val(meta), path("*.zip") , emit: zip optional true + tuple val(meta), path("*unpaired*.fq.gz") , emit: unpaired, optional: true + tuple val(meta), path("*.html") , emit: html , optional: true + tuple val(meta), path("*.zip") , emit: zip , optional: true when: task.ext.when == null || task.ext.when @@ -52,6 +53,7 @@ process TRIMGALORE { $c_r1 \\ $tpc_r1 \\ ${prefix}.fastq.gz + cat <<-END_VERSIONS > versions.yml "${task.process}": trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') @@ -73,6 +75,7 @@ process TRIMGALORE { $tpc_r2 \\ ${prefix}_1.fastq.gz \\ ${prefix}_2.fastq.gz + cat <<-END_VERSIONS > versions.yml "${task.process}": trimgalore: \$(echo \$(trim_galore --version 2>&1) | sed 's/^.*version //; s/Last.*\$//') diff --git a/modules/nf-core/modules/trimgalore/meta.yml b/modules/nf-core/modules/trimgalore/meta.yml index e99a88334..439f566df 100644 --- a/modules/nf-core/modules/trimgalore/meta.yml +++ b/modules/nf-core/modules/trimgalore/meta.yml @@ -37,6 +37,11 @@ output: List of input adapter trimmed FastQ files of size 1 and 2 for single-end and paired-end data, respectively. pattern: "*.{fq.gz}" + - unpaired: + type: file + description: | + FastQ files containing unpaired reads from read 1 or read 2 + pattern: "*unpaired*.fq.gz" - html: type: file description: FastQC report (optional) From d5d66470fd5559f01519fb665b627d33e98a4d97 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 2 May 2022 22:39:32 +0200 Subject: [PATCH 387/538] Update picard arguments --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 37672b73f..c44a6dfd1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -292,7 +292,7 @@ process { } withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { - ext.args = 'ASSUME_SORTED=true REMOVE_DUPLICATES=false VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.args = '--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.mkD.sorted" } publishDir = [ [ From 1c65c16edeb9a092f957e09180acdfe7119f6e6a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 3 May 2022 00:11:32 +0200 Subject: [PATCH 388/538] Is good to save changes before commiting --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c44a6dfd1..930a1d579 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -282,7 +282,7 @@ if (params.aligner == 'star') { process { withName: 'PICARD_MERGESAMFILES' { - ext.args = 'SORT_ORDER=coordinate VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.args = '--SORT_ORDER coordinate --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, @@ -422,7 +422,7 @@ process { if (!params.skip_picard_metrics) { process { withName: 'PICARD_COLLECTMULTIPLEMETRICS' { - ext.args = 'VALIDATION_STRINGENCY=LENIENT TMP_DIR=tmp' + ext.args = '--VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.clN.sorted" } publishDir = [ [ From 33d3bdda056cc66bd6c9070bc0abf670e9c6c229 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 3 May 2022 12:54:17 +0200 Subject: [PATCH 389/538] Address PR comments (gunzip also has meta ,...) --- subworkflows/local/prepare_genome.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 33aa189ed..32dd3e585 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -37,7 +37,7 @@ workflow PREPARE_GENOME { // ch_fasta = Channel.empty() if (params.fasta.endsWith('.gz')) { - ch_fasta = GUNZIP_FASTA ( params.fasta ).gunzip + ch_fasta = GUNZIP_FASTA ( [:], params.fasta ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } else { ch_fasta = file(params.fasta) @@ -48,14 +48,14 @@ workflow PREPARE_GENOME { // if (params.gtf) { if (params.gtf.endsWith('.gz')) { - ch_gtf = GUNZIP_GTF ( params.gtf ).gunzip + ch_gtf = GUNZIP_GTF ( [:], params.gtf ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } else { ch_gtf = file(params.gtf) } } else if (params.gff) { if (params.gff.endsWith('.gz')) { - ch_gff = GUNZIP_GFF ( params.gff ).gunzip + ch_gff = GUNZIP_GFF ( [:], params.gff ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) } else { ch_gff = file(params.gff) @@ -70,7 +70,7 @@ workflow PREPARE_GENOME { ch_blacklist = Channel.empty() if (params.blacklist) { if (params.blacklist.endsWith('.gz')) { - ch_blacklist = GUNZIP_BLACKLIST ( params.blacklist ).gunzip + ch_blacklist = GUNZIP_BLACKLIST ( [:], params.blacklist ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) } else { ch_blacklist = Channel.fromPath(file(params.blacklist)) @@ -97,7 +97,7 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(GTF2BED.out.versions) } else { if (params.gene_bed.endsWith('.gz')) { - ch_gene_bed = GUNZIP_GENE_BED ( params.gene_bed ).gunzip + ch_gene_bed = GUNZIP_GENE_BED ( [:], params.gene_bed ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) } else { ch_gene_bed = file(params.gene_bed) @@ -130,7 +130,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bwa') { if (params.bwa_index) { if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR_BWA_INDEX ( [], params.bwa_index ).untar.map{it -> it[1]} + ch_bwa_index = UNTAR_BWA_INDEX ( [:], params.bwa_index ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) } else { ch_bwa_index = file(params.bwa_index) @@ -148,7 +148,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bowtie2') { if (params.bowtie2_index) { if (params.bowtie2_index.endsWith('.tar.gz')) { - ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [], params.bowtie2_index ).untar.map{it -> it[1]} + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [:], params.bowtie2_index ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) } else { ch_bowtie2_index = file(params.bowtie2_index) @@ -184,7 +184,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'star') { if (params.star_index) { if (params.star_index.endsWith('.tar.gz')) { - ch_star_index = UNTAR_STAR_INDEX ( [], params.star_index ).untar.map{it -> it[1]} + ch_star_index = UNTAR_STAR_INDEX ( [:], params.star_index ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) } else { ch_star_index = file(params.star_index) From c70659ff4538dc367ec2166a8ef47b4bfae496f8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 9 May 2022 11:11:31 +0100 Subject: [PATCH 390/538] Replace last remaining vanilla Linux Biocontainer --- modules/local/multiqc_custom_peaks.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 64f918c4f..7eb6487d8 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -2,8 +2,8 @@ process MULTIQC_CUSTOM_PEAKS { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img': - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: tuple val(meta), path(peak), path(frip) From 458d121609bdc89bc959542f17202f9d48df4b36 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 16 May 2022 10:16:07 +0000 Subject: [PATCH 391/538] Template update for nf-core/tools version 2.4 --- .github/workflows/awsfulltest.yml | 3 - .github/workflows/awstest.yml | 3 - .github/workflows/branch.yml | 3 +- .github/workflows/ci.yml | 2 - .github/workflows/fix-linting.yml | 55 ++++++++++ .github/workflows/linting.yml | 4 +- .github/workflows/linting_comment.yml | 1 - .prettierignore | 9 ++ README.md | 25 ++--- assets/email_template.html | 142 ++++++++------------------ bin/check_samplesheet.py | 16 ++- nextflow.config | 2 +- 12 files changed, 135 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/fix-linting.yml create mode 100644 .prettierignore diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 700ff9000..c6f0c9c60 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,6 +28,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 666c70a31..73640cc6f 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -23,6 +23,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/chipseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 5a5468e14..1e03d409b 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/chipseq' run: | - "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/chipseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -42,4 +42,3 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false -# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b78f34dff..0596f36fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,5 +48,3 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - -# diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml new file mode 100644 index 000000000..b4f90734c --- /dev/null +++ b/.github/workflows/fix-linting.yml @@ -0,0 +1,55 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] + +jobs: + deploy: + # Only run if comment is on a PR with the main repo, and if it contains the magic keywords + if: > + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@nf-core-bot fix linting') && + github.repository == 'nf-core/chipseq' + runs-on: ubuntu-latest + steps: + # Use the @nf-core-bot token to check out so we can push later + - uses: actions/checkout@v3 + with: + token: ${{ secrets.nf_core_bot_auth_token }} + + # Action runs on the issue comment, so we don't get the PR by default + # Use the gh cli to check out the PR + - name: Checkout Pull Request + run: gh pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} + + - uses: actions/setup-node@v2 + + - name: Install Prettier + run: npm install -g prettier @prettier/plugin-php + + # Check that we actually need to fix something + - name: Run 'prettier --check' + id: prettier_status + run: | + if prettier --check ${GITHUB_WORKSPACE}; then + echo "::set-output name=result::pass" + else + echo "::set-output name=result::fail" + fi + + - name: Run 'prettier --write' + if: steps.prettier_status.outputs.result == 'fail' + run: prettier --write ${GITHUB_WORKSPACE} + + - name: Commit & push changes + if: steps.prettier_status.outputs.result == 'fail' + run: | + git config user.email "core@nf-co.re" + git config user.name "nf-core-bot" + git config push.default upstream + git add . + git status + git commit -m "[automated] Fix linting with Prettier" + git push diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index e9cf5de3a..77358dee7 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -48,7 +48,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v3 with: python-version: "3.6" architecture: "x64" @@ -78,5 +78,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - -# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 91c487a1a..04758f61e 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -26,4 +26,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md -# diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..d0e7ae589 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +email_template.html +.nextflow* +work/ +data/ +results/ +.DS_Store +testing/ +testing* +*.pyc diff --git a/README.md b/README.md index 71c912997..45ee3b4fc 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@ -# ![nf-core/chipseq](docs/images/nf-core/chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core/chipseq_logo_dark.png#gh-dark-mode-only) +# ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) - -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) - -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/chipseq) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) + +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) +[![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/chipseq) + +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/chipseq) +[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) +[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction diff --git a/assets/email_template.html b/assets/email_template.html index 5c35a97ba..5a4548bb0 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,111 +1,53 @@ - - - - + + + + - - - nf-core/chipseq Pipeline Report - - -
- + + nf-core/chipseq Pipeline Report + + +
-

nf-core/chipseq v${version}

-

Run Name: $runName

+ - <% if (!success){ out << """ -
-

nf-core/chipseq execution completed unsuccessfully!

+

nf-core/chipseq v${version}

+

Run Name: $runName

+ +<% if (!success){ + out << """ +
+

nf-core/chipseq execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

-
${errorReport}
-
- """ } else { out << """ -
+
${errorReport}
+
+ """ +} else { + out << """ +
nf-core/chipseq execution completed successfully! -
- """ } %> +
+ """ +} +%> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
-$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> " - - - - - " }.join("\n") %> - -
- $k - -
$v
-
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
$k
$v
-

nf-core/chipseq

-

https://github.com/nf-core/chipseq

-
- +

nf-core/chipseq

+

https://github.com/nf-core/chipseq

+ +
+ + diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5473b624c..3652c63c8 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,7 @@ def _validate_pair(self, row): if row[self._first_col] and row[self._second_col]: row[self._single_col] = False assert ( - Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] ), "FASTQ pairs must have the same file extensions." else: row[self._single_col] = True @@ -129,6 +129,16 @@ def validate_unique_samples(self): row[self._sample_col] = f"{sample}_T{seen[sample]}" +def read_head(handle, num_lines=10): + """Read the specified number of lines from the current position in the file.""" + lines = [] + for idx, line in enumerate(handle): + if idx == num_lines: + break + lines.append(line) + return "".join(lines) + + def sniff_format(handle): """ Detect the tabular format. @@ -144,13 +154,13 @@ def sniff_format(handle): https://docs.python.org/3/glossary.html#term-text-file """ - peek = handle.read(2048) + peek = read_head(handle) + handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): logger.critical(f"The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) - handle.seek(0) return dialect diff --git a/nextflow.config b/nextflow.config index d7b8696c4..6c5ab6b95 100644 --- a/nextflow.config +++ b/nextflow.config @@ -159,7 +159,7 @@ trace { } dag { enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.html" } manifest { From a6eb7812f070fb88542f7e57c6a175992f7d5068 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 17 May 2022 10:48:52 +0200 Subject: [PATCH 392/538] Uncomment again cromap in test --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d968b6343..4a040e5c3 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,7 +76,7 @@ jobs: matrix: aligner: - "bowtie2" - - "chromap" + # - "chromap" - "star" steps: - name: Check out pipeline code From d2968e41af07edb060d815ee06813905c9b1517b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 17 May 2022 12:08:44 +0200 Subject: [PATCH 393/538] Fix readme zenodo link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 364e90da0..91c27e231 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.-1073c8)](https://doi.org/10.5281/zenodo.3240506) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) From 7b574746548ee753957896aa3b27f7acada26aa8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 17 May 2022 12:16:22 +0200 Subject: [PATCH 394/538] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fda27321..e8cde001e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- Updated pipeline template to [nf-core/tools 2.4.2](https://github.com/nf-core/tools/releases/tag/2.4.2) - [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners -- Updated pipeline template to [nf-core/tools 2.3.2](https://github.com/nf-core/tools/releases/tag/2.3.2) - Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - Bump minimum Nextflow version from `21.04.0` -> `21.10.3` - Added `python3` shebang to appropriate scripts in `bin/` directory From c8c3119a944e66799ed0807d418318eb1d725d9e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 17 May 2022 12:19:12 +0200 Subject: [PATCH 395/538] Correct tools version in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8cde001e..6928ed449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- Updated pipeline template to [nf-core/tools 2.4.2](https://github.com/nf-core/tools/releases/tag/2.4.2) +- Updated pipeline template to [nf-core/tools 2.4.1](https://github.com/nf-core/tools/releases/tag/2.4.1) - [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners From 06a43724b6f52ed6515bce6c1c244bea37268640 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 18 May 2022 15:44:34 +0200 Subject: [PATCH 396/538] Add deeptools plotfingerprint labels --- conf/modules.config | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 930a1d579..d995efdb2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -489,10 +489,11 @@ if (!params.skip_plot_profile) { if (!params.skip_plot_fingerprint) { process { withName: 'DEEPTOOLS_PLOTFINGERPRINT' { - ext.args = [ + ext.args = { [ '--skipZeros', - "--numberOfSamples $params.fingerprint_bins" - ].join(' ').trim() + "--numberOfSamples $params.fingerprint_bins", + "--labels $meta.ip $meta.control" + ].join(' ').trim() } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotFingerprint" }, From 9de3362c4d71a463c58e7ee243513affe6f5564e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 18 May 2022 15:46:32 +0200 Subject: [PATCH 397/538] Fix channel assignation --- subworkflows/local/filter_bam_bamtools.nf | 1 - workflows/chipseq.nf | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/filter_bam_bamtools.nf b/subworkflows/local/filter_bam_bamtools.nf index 8472ce5d0..40e9b1be6 100644 --- a/subworkflows/local/filter_bam_bamtools.nf +++ b/subworkflows/local/filter_bam_bamtools.nf @@ -14,7 +14,6 @@ workflow FILTER_BAM_BAMTOOLS { bamtools_filter_pe_config // file: BAMtools filter JSON config file for PE data main: - ch_versions = Channel.empty() BAM_FILTER(ch_bam_bai, ch_bed, bamtools_filter_se_config, bamtools_filter_pe_config) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 625632528..d8ee01872 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -279,7 +279,7 @@ workflow CHIPSEQ { FILTER_BAM_BAMTOOLS.out.bam, PREPARE_GENOME.out.fasta ) - ch_picardcollectmultiplemetrics_multiqc = MARK_DUPLICATES_PICARD.out.metrics + ch_picardcollectmultiplemetrics_multiqc = PICARD_COLLECTMULTIPLEMETRICS.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) } From 3faadf01d14b95c43447fb55897941820c3f6275 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 18 May 2022 16:11:09 +0200 Subject: [PATCH 398/538] Fix assignation of pvalue and qvalue for macs2 callpeak --- conf/modules.config | 56 ++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d995efdb2..c679be345 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -511,8 +511,8 @@ if (params.macs_gsize) { '--keep-dup all', params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", params.save_macs_pileup ? '--bdg --SPMR' : '', - params.macs_fdr ? "--pvalue ${params.macs_pvalue}" : '', - params.macs_pvalue ? "--qvalue ${params.macs_fdr}" : '' + params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '', + params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' ].join(' ').trim() publishDir = [ path: { [ @@ -549,21 +549,8 @@ if (params.macs_gsize) { } } - if (!params.skip_peak_annotation && !params.skip_peak_qc) { + if (!params.skip_peak_annotation) { process { - withName: 'PLOT_MACS2_QC' { - ext.args = '-o ./ -p macs2_peak' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: 'HOMER_ANNOTATEPEAKS_MACS2' { ext.args = '-gid' // ext.prefix = 'peaks' @@ -576,18 +563,35 @@ if (params.macs_gsize) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + } - withName: 'PLOT_HOMER_ANNOTATEPEAKS' { - ext.args = '-o ./ -p macs2_annotatePeaks' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' + if (!params.skip_peak_qc) { + process { + withName: 'PLOT_MACS2_QC' { + ext.args = '-o ./ -p macs2_peak' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'PLOT_HOMER_ANNOTATEPEAKS' { + ext.args = '-o ./ -p macs2_annotatePeaks' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } } } From ab1afe328a24f10de872c11ccaea4f9ebd2cfcdc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 19 May 2022 10:24:41 +0200 Subject: [PATCH 399/538] Fix skip_peak_annotation and skip_peak_qc options --- workflows/chipseq.nf | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index d8ee01872..726fc48fb 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -438,12 +438,7 @@ workflow CHIPSEQ { ch_custompeaks_frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count - if (!params.skip_peak_annotation && !params.skip_peak_qc) { - PLOT_MACS2_QC ( - ch_macs2_peaks.collect{it[1]} - ) - ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) - + if (!params.skip_peak_annotation) { HOMER_ANNOTATEPEAKS_MACS2 ( ch_macs2_peaks, PREPARE_GENOME.out.fasta, @@ -451,13 +446,20 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt" - ) - ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv - ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + if (!params.skip_peak_qc) { + PLOT_MACS2_QC ( + ch_macs2_peaks.collect{it[1]} + ) + ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) + + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt" + ) + ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv + ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + } } // From 377028f4df1ff0c1cfef8de001cef3049685a204 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 19 May 2022 10:25:38 +0200 Subject: [PATCH 400/538] Aligning code in emits of local modules --- modules/local/multiqc_custom_peaks.nf | 2 +- modules/local/multiqc_custom_phantompeakqualtools.nf | 4 ++-- modules/local/plot_homer_annotatepeaks.nf | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 7eb6487d8..1ca41d4ce 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -12,7 +12,7 @@ process MULTIQC_CUSTOM_PEAKS { output: tuple val(meta), path("*.peak_count_mqc.tsv"), emit: count - tuple val(meta), path("*.FRiP_mqc.tsv"), emit: frip + tuple val(meta), path("*.FRiP_mqc.tsv") , emit: frip script: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index 2e9118237..706af4fc0 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -11,8 +11,8 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { path correlation_header output: - tuple val(meta), path("*.spp_nsc_mqc.tsv"), emit: nsc - tuple val(meta), path("*.spp_rsc_mqc.tsv"), emit: rsc + tuple val(meta), path("*.spp_nsc_mqc.tsv") , emit: nsc + tuple val(meta), path("*.spp_rsc_mqc.tsv") , emit: rsc tuple val(meta), path("*.spp_correlation_mqc.tsv"), emit: correlation script: diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 0873e38eb..2cb38a373 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -12,9 +12,9 @@ process PLOT_HOMER_ANNOTATEPEAKS { val suffix output: - path '*.txt', emit: txt - path '*.pdf', emit: pdf - path '*.tsv', emit: tsv + path '*.txt' , emit: txt + path '*.pdf' , emit: pdf + path '*.tsv' , emit: tsv path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ From d3ff899fcf2e0b91508371939636537a0c254270 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 19 May 2022 15:52:54 +0200 Subject: [PATCH 401/538] Preseq run on the output of picard markduplicates and not after removing orphans --- workflows/chipseq.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 726fc48fb..a76bcdd83 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -270,6 +270,18 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(FILTER_BAM_BAMTOOLS.out.versions.first().ifEmpty(null)) + // + // MODULE: Library coverage + // + ch_preseq_multiqc = Channel.empty() + if (!params.skip_preseq) { + PRESEQ_LCEXTRAP ( + MARK_DUPLICATES_PICARD.out.bam + ) + ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.lc_extrap + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + } + // // MODULE: Post alignment QC // @@ -283,18 +295,6 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) } - // - // MODULE: Library coverage - // - ch_preseq_multiqc = Channel.empty() - if (!params.skip_preseq) { - PRESEQ_LCEXTRAP ( - FILTER_BAM_BAMTOOLS.out.bam - ) - ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.lc_extrap - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) - } - // // MODULE: Strand cross-correlation // From d9eddb39a5681b1c266cfeadc8d44c07884aba44 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 25 May 2022 23:18:06 +0200 Subject: [PATCH 402/538] Remove input from required params --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index cb99b41f5..7429b1cbf 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["input", "outdir"], + "required": ["outdir"], "properties": { "input": { "type": "string", From a20cf2a35c6e64aede52a618ca479d836df19e08 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 26 May 2022 11:51:44 +0200 Subject: [PATCH 403/538] Remove multiqc headers that were defined twice --- workflows/chipseq.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index a76bcdd83..29e2fc3b1 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -486,7 +486,7 @@ workflow CHIPSEQ { meta.replicates_exist = groups.max { groups.value }.value > 1 [ meta, peaks ] } .set { ch_antibody_peaks } - + // ch_antibody_peaks.dump() MACS2_CONSENSUS ( ch_antibody_peaks ) @@ -510,11 +510,15 @@ workflow CHIPSEQ { .map { meta, saf -> [ meta.id, meta, saf ] } .set { ch_ip_saf } + // ch_ip_saf.dump() + ch_ip_control_bam .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } .groupTuple() .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } + // .dump() .join(ch_ip_saf) + .dump() .map { it -> fmeta = it[1] @@ -530,8 +534,6 @@ workflow CHIPSEQ { ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - ch_deseq2_pca_header = file("$projectDir/assets/multiqc/deseq2_pca_header.txt", checkIfExists: true) - ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true) if (!params.skip_deseq2_qc) { DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, From fae13fa88582c5da749fcb1b902ce02647b2ab7b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 26 May 2022 12:04:37 +0200 Subject: [PATCH 404/538] Fix reference to chipseq in multiqc headers --- assets/multiqc/deseq2_clustering_header.txt | 2 +- assets/multiqc/deseq2_pca_header.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/multiqc/deseq2_clustering_header.txt b/assets/multiqc/deseq2_clustering_header.txt index a8e8adb96..3dd28211b 100644 --- a/assets/multiqc/deseq2_clustering_header.txt +++ b/assets/multiqc/deseq2_clustering_header.txt @@ -3,7 +3,7 @@ #description: "is generated from clustering the Euclidean distances between # DESeq2 # rlog values for each sample -# in the deseq2_qc.r script." +# in the deseq2_qc.r script." #plot_type: 'heatmap' #anchor: 'deseq2_clustering' #pconfig: diff --git a/assets/multiqc/deseq2_pca_header.txt b/assets/multiqc/deseq2_pca_header.txt index da7660b02..55b0bbadf 100644 --- a/assets/multiqc/deseq2_pca_header.txt +++ b/assets/multiqc/deseq2_pca_header.txt @@ -2,7 +2,7 @@ #section_name: 'MERGED LIB: DESeq2 PCA plot' #description: "PCA plot between samples in the experiment. # These values are calculated using DESeq2 -# in the deseq2_qc.r script." +# in the deseq2_qc.r script." #plot_type: 'scatter' #anchor: 'deseq2_pca' #pconfig: From 770921e1b7bfad9063cdc22f47234871e2264e5d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 16 Jun 2022 23:32:05 +0200 Subject: [PATCH 405/538] Fix nested conditions --- conf/modules.config | 90 ++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c679be345..af24b735c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -624,59 +624,59 @@ if (params.macs_gsize) { ] } } - } - if (!params.skip_peak_annotation) { - process { - withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { - ext.args = '-gid' - ext.prefix = 'consensus_peaks' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_deseq2_qc) { - process { - withName: DESEQ2_QC { - ext.args = [ - '--id_col 1', - '--sample_suffix \'.mLb.clN.sorted.bam\'', - '--count_col 7', - params.deseq2_vst ? '--vst TRUE' : '' - ].join(' ').trim() - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus/deseq2' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + if (!params.skip_peak_annotation) { + process { + withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { + ext.args = '-gid' + ext.prefix = 'consensus_peaks' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } } - } - if (!params.skip_igv) { - process { - withName: 'IGV' { - publishDir = [ + if (!params.skip_deseq2_qc) { + process { + withName: DESEQ2_QC { + ext.args = [ + '--id_col 1', + '--sample_suffix \'.mLb.clN.sorted.bam\'', + '--count_col 7', + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() + publishDir = [ path: { [ - "${params.outdir}/igv", - params.narrow_peak? '/narrowPeak' : '/broadPeak' + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus/deseq2' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + ] + } + } + } + + if (!params.skip_igv) { + process { + withName: 'IGV' { + publishDir = [ + path: { [ + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } } } From 5458e90ec94efcd4e51dfaaee29cf2e8ec2a0661 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 16 Jun 2022 23:35:18 +0200 Subject: [PATCH 406/538] Fix deseq condition (back to the same as DSL1 ver) --- modules/local/deseq2_qc.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index dcc933c4f..f9153b426 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -24,7 +24,7 @@ process DESEQ2_QC { path "versions.yml" , emit: versions script: - if (meta.multiple_groups || meta.replicates_exist) { + if (meta.multiple_groups && meta.replicates_exist) { def args = task.ext.args ?: '' def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def antibody = meta.antibody From 7e1d4f263e5b7c982b71ffb43abeff3b87244f6b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 16 Jun 2022 23:37:28 +0200 Subject: [PATCH 407/538] Make sure fmeta are local inside map --- workflows/chipseq.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 29e2fc3b1..919791cec 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -238,7 +238,7 @@ workflow CHIPSEQ { ch_genome_bam .map { meta, bam -> - fmeta = meta.findAll { it.key != 'read_group' } + def fmeta = meta.findAll { it.key != 'read_group' } fmeta.id = fmeta.id.split('_')[0..-2].join('_') [ fmeta, bam ] } .groupTuple(by: [0]) @@ -521,7 +521,7 @@ workflow CHIPSEQ { .dump() .map { it -> - fmeta = it[1] + def fmeta = it[1] fmeta['id'] = it[3]['id'] fmeta['replicates_exist'] = it[3]['replicates_exist'] fmeta['multiple_groups'] = it[3]['multiple_groups'] From d33d5573ce69c81d78ddc41e0a9e6d09e91915b2 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Jun 2022 11:38:56 +0200 Subject: [PATCH 408/538] Make fasta available for igv --- subworkflows/local/prepare_genome.nf | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 32dd3e585..c8f76a0cf 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -43,6 +43,19 @@ workflow PREPARE_GENOME { ch_fasta = file(params.fasta) } + // Make fasta file available if reference saved or IGV is run + if (params.save_reference || !params.skip_igv) { + // log.info "test\n===============culo\n===============culo\n===============culo\n===============culo\n===============culo\n" + file("${params.outdir}/genome/").mkdirs() + ch_fasta.copyTo("${params.outdir}/genome/") + } + // else { + // log.info "pedo\n===============pedo\n===============pedo\n================pedo\n===============pedo\n===============pedo\n" + // } + // ch_fasta.subscribe { + // it.copyTo("${params.outdir}/genome/") + // } + // // Uncompress GTF annotation file or create from GFF3 if required // From 59a07d9c9ffa0546cfc8ac2d235ce1fba12dc4e2 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 23 Jun 2022 11:42:20 +0200 Subject: [PATCH 409/538] Get rid of testing code --- subworkflows/local/prepare_genome.nf | 7 ------- 1 file changed, 7 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index c8f76a0cf..342465697 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -45,16 +45,9 @@ workflow PREPARE_GENOME { // Make fasta file available if reference saved or IGV is run if (params.save_reference || !params.skip_igv) { - // log.info "test\n===============culo\n===============culo\n===============culo\n===============culo\n===============culo\n" file("${params.outdir}/genome/").mkdirs() ch_fasta.copyTo("${params.outdir}/genome/") } - // else { - // log.info "pedo\n===============pedo\n===============pedo\n================pedo\n===============pedo\n===============pedo\n" - // } - // ch_fasta.subscribe { - // it.copyTo("${params.outdir}/genome/") - // } // // Uncompress GTF annotation file or create from GFF3 if required From 7c50dfdd3a4ab56fa7bcb68a04901684055e73bb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 28 Jun 2022 00:00:58 +0200 Subject: [PATCH 410/538] Remove ch_markduplicates_multiqc since is directly reported as MARK_DUPLICATES_PICARD.out.metrics.collect{it[1]}.ifEmpty([]) --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 919791cec..9aee6cb1b 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -253,10 +253,10 @@ workflow CHIPSEQ { // // SUBWORKFLOW: Mark duplicates & filter BAM files after merging // - ch_markduplicates_multiqc = Channel.empty() MARK_DUPLICATES_PICARD ( PICARD_MERGESAMFILES.out.bam ) + ch_versions = ch_versions.mix(MARK_DUPLICATES_PICARD.out.versions) // // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE From a2bd7e2c313ac370639df3d61560a6ad8a1a4fa2 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 28 Jun 2022 00:02:33 +0200 Subject: [PATCH 411/538] Remove prefix since is not used in samtools_index --- conf/modules.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index af24b735c..8a8ec8b33 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -310,7 +310,6 @@ process { } withName: '.*:MARK_DUPLICATES_PICARD:SAMTOOLS_INDEX' { - ext.prefix = { "${meta.id}.mkD.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, From 34cdc2f4f2ff4b10cc5f744dc862fc87f2256e65 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 28 Jun 2022 08:34:50 +0200 Subject: [PATCH 412/538] Move macs2_consensus "when" to modules.config --- conf/modules.config | 1 + modules/local/macs2_consensus.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 8a8ec8b33..2744e0ed4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -598,6 +598,7 @@ if (params.macs_gsize) { if (!params.skip_consensus_peaks) { process { withName: 'MACS2_CONSENSUS' { + ext.when = { meta.multiple_groups || meta.replicates_exist } ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index cd27807f1..f28dc732e 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -22,7 +22,7 @@ process MACS2_CONSENSUS { path "versions.yml" , emit: versions when: - (meta.multiple_groups || meta.replicates_exist) + task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ From d35739d6922a38289504ade2bb4f45132938c4c1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 28 Jun 2022 10:10:41 +0200 Subject: [PATCH 413/538] Skip preseq on test config --- conf/test.config | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index d9c938a09..fdbf74c6d 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,12 +23,16 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' // Genome references - fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' - gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' + genome = 'hg19' + // fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' + // gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' // Not mandatory but permits the pipeline to run through peak-calling steps macs_gsize = 1.2e7 // For speed to avoid CI time-out fingerprint_bins = 100 + + // Avoid preseq errors with test data + skip_preseq = true } From 277bd119f4747960d0059df30f7a3cea8fccb625 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 28 Jun 2022 10:53:19 +0200 Subject: [PATCH 414/538] Address review comments --- conf/test.config | 5 ++--- workflows/chipseq.nf | 6 +----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/conf/test.config b/conf/test.config index fdbf74c6d..a9ca58c82 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,9 +23,8 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' // Genome references - genome = 'hg19' - // fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' - // gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' + gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' // Not mandatory but permits the pipeline to run through peak-calling steps macs_gsize = 1.2e7 diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 9aee6cb1b..7c7862728 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -486,7 +486,7 @@ workflow CHIPSEQ { meta.replicates_exist = groups.max { groups.value }.value > 1 [ meta, peaks ] } .set { ch_antibody_peaks } - // ch_antibody_peaks.dump() + MACS2_CONSENSUS ( ch_antibody_peaks ) @@ -510,15 +510,11 @@ workflow CHIPSEQ { .map { meta, saf -> [ meta.id, meta, saf ] } .set { ch_ip_saf } - // ch_ip_saf.dump() - ch_ip_control_bam .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } .groupTuple() .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } - // .dump() .join(ch_ip_saf) - .dump() .map { it -> def fmeta = it[1] From 69c8db1d7ae22a7de58b016a744668a99d949055 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 13:23:23 +0200 Subject: [PATCH 415/538] Updated macs_gsize on igenomes and add a process to calculate it if not available --- conf/igenomes.config | 108 ++++++++-- conf/modules.config | 228 +++++++++++----------- conf/test.config | 6 +- lib/WorkflowChipseq.groovy | 4 +- lib/WorkflowMain.groovy | 15 ++ main.nf | 2 +- modules/local/khmer_uniquekmers.nf | 38 ++++ nextflow.config | 2 +- nextflow_schema.json | 33 +++- workflows/chipseq.nf | 303 +++++++++++++++-------------- 10 files changed, 455 insertions(+), 284 deletions(-) create mode 100644 modules/local/khmer_uniquekmers.nf diff --git a/conf/igenomes.config b/conf/igenomes.config index d174cd316..e18b5ebea 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -46,8 +46,15 @@ params { bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" mito_name = "MT" - macs_gsize = "1.87e9" + // macs_gsize = "1.87e9" blacklist = "${projectDir}/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed" + macs_gsize = [ + "50" : 2307679482, + "75" : 2406655830, + "100" : 2466184610, + "150" : 2492306232, + "200" : 2519386924 + ] } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" @@ -90,7 +97,14 @@ params { gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" mito_name = "MtDNA" - macs_gsize = "9e7" + // macs_gsize = "9e7" + macs_gsize = [ + "50" : 95159402, + "75" : 96945370, + "100" : 98259898, + "150" : 98721103, + "200" : 98672558 + ] } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" @@ -122,7 +136,14 @@ params { gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" mito_name = "M" - macs_gsize = "1.2e8" + // macs_gsize = "1.2e8" + macs_gsize = [ + "50" : 123519388, + "75" : 124886264, + "100" : 126807034, + "150" : 126903604, + "200" : 128575605 + ] } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" @@ -226,7 +247,14 @@ params { gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" mito_name = "MT" - macs_gsize = "1.2e7" + // macs_gsize = "1.2e7" + macs_gsize = [ + "50" : 11624332, + "75" : 11693438, + "100" : 11777680, + "150" : 11783749, + "200" : 11825681 + ] } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" @@ -238,7 +266,14 @@ params { bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" mito_name = "MT" - macs_gsize = "1.21e7" + // macs_gsize = "1.21e7" + macs_gsize = [ + "50" : 12190646, + "75" : 12291456, + "100" : 12346649, + "150" : 12403911, + "200" : 12442064 + ] } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" @@ -280,8 +315,15 @@ params { gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" mito_name = "chrM" - macs_gsize = "2.7e9" + // macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v3.0/hg38-blacklist.v3.bed" + macs_gsize = [ + "50" : 2701262066, + "75" : 2749859687, + "100" : 2805665311, + "150" : 2862089864, + "200" : 2892537351 + ] } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" @@ -293,8 +335,15 @@ params { bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" mito_name = "chrM" - macs_gsize = "2.7e9" + // macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v1.0/hg19-blacklist.v1.bed" + macs_gsize = [ + "50" : 2684219875, + "75" : 2733035409, + "100" : 2774803719, + "150" : 2824648687, + "200" : 2848794782 + ] } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" @@ -306,8 +355,15 @@ params { bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" mito_name = "chrM" - macs_gsize = "1.87e9" + // macs_gsize = "1.87e9" blacklist = "${projectDir}/assets/blacklists/v2.0/mm10-blacklist.v2.bed" + macs_gsize = [ + "50" : 2307679482, + "75" : 2406655830, + "100" : 2466184610, + "150" : 2492306232, + "200" : 2519386924 + ] } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" @@ -329,7 +385,14 @@ params { bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" mito_name = "chrM" - macs_gsize = "9e7" + // macs_gsize = "9e7" + macs_gsize = [ + "50" : 95156190, + "75" : 96995949, + "100" : 98287299, + "150" : 98879728, + "200" : 98769409 + ] } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" @@ -351,7 +414,14 @@ params { gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" mito_name = "chrM" - macs_gsize = "1.37e9" + // macs_gsize = "1.37e9" + macs_gsize = [ + "50" : 1172895610, + "75" : 1229400206, + "100" : 1253908756, + "150" : 1285330773, + "200" : 1292538906 + ] } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" @@ -362,7 +432,14 @@ params { gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" mito_name = "chrM" - macs_gsize = "1.2e8" + // macs_gsize = "1.2e8" + macs_gsize = [ + "50" : 123548253, + "75" : 124886264, + "100" : 126807034, + "150" : 126908682, + "200" : 128599061 + ] } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" @@ -415,7 +492,14 @@ params { bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" mito_name = "chrM" - macs_gsize = "1.2e7" + // macs_gsize = "1.2e7" + macs_gsize = [ + "50" : "11624332", + "75" : "11693438", + "100" : "11777680", + "150" : "11783749", + "200" : "11825681" + ] } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/modules.config b/conf/modules.config index 2744e0ed4..b9d490c51 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -503,16 +503,55 @@ if (!params.skip_plot_fingerprint) { } } -if (params.macs_gsize) { +process { + withName: 'MACS2_CALLPEAK' { + ext.args = [ + '--keep-dup all', + params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", + params.save_macs_pileup ? '--bdg --SPMR' : '', + params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '', + params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + ].join(' ').trim() + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'FRIP_SCORE' { + ext.args = '-bed -c -f 0.20' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + enabled: false + ] + } + + withName: 'MULTIQC_CUSTOM_PEAKS' { + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +if (!params.skip_peak_annotation) { process { - withName: 'MACS2_CALLPEAK' { - ext.args = [ - '--keep-dup all', - params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", - params.save_macs_pileup ? '--bdg --SPMR' : '', - params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '', - params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' - ].join(' ').trim() + withName: 'HOMER_ANNOTATEPEAKS_MACS2' { + ext.args = '-gid' + // ext.prefix = 'peaks' publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", @@ -522,26 +561,63 @@ if (params.macs_gsize) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + } + + if (!params.skip_peak_qc) { + process { + withName: 'PLOT_MACS2_QC' { + ext.args = '-o ./ -p macs2_peak' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'PLOT_HOMER_ANNOTATEPEAKS' { + ext.args = '-o ./ -p macs2_annotatePeaks' + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/qc' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} - withName: 'FRIP_SCORE' { - ext.args = '-bed -c -f 0.20' +if (!params.skip_consensus_peaks) { + process { + withName: 'MACS2_CONSENSUS' { + ext.when = { meta.multiple_groups || meta.replicates_exist } + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' + '/consensus' ].join('') }, - enabled: false + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: 'MULTIQC_CUSTOM_PEAKS' { + withName: 'SUBREAD_FEATURECOUNTS' { + ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' - ].join('') }, + '/consensus' + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -550,133 +626,55 @@ if (params.macs_gsize) { if (!params.skip_peak_annotation) { process { - withName: 'HOMER_ANNOTATEPEAKS_MACS2' { + withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { ext.args = '-gid' - // ext.prefix = 'peaks' + ext.prefix = 'consensus_peaks' publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - - if (!params.skip_peak_qc) { - process { - withName: 'PLOT_MACS2_QC' { - ext.args = '-o ./ -p macs2_peak' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: 'PLOT_HOMER_ANNOTATEPEAKS' { - ext.args = '-o ./ -p macs2_annotatePeaks' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/qc' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } } - if (!params.skip_consensus_peaks) { + if (!params.skip_deseq2_qc) { process { - withName: 'MACS2_CONSENSUS' { - ext.when = { meta.multiple_groups || meta.replicates_exist } - ext.prefix = { "${meta.id}.consensus_peaks" } - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: 'SUBREAD_FEATURECOUNTS' { - ext.args = '-F SAF -O --fracOverlap 0.2' + withName: DESEQ2_QC { + ext.args = [ + '--id_col 1', + '--sample_suffix \'.mLb.clN.sorted.bam\'', + '--count_col 7', + params.deseq2_vst ? '--vst TRUE' : '' + ].join(' ').trim() publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus/deseq2' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } + } - if (!params.skip_peak_annotation) { - process { - withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { - ext.args = '-gid' - ext.prefix = 'consensus_peaks' - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_deseq2_qc) { - process { - withName: DESEQ2_QC { - ext.args = [ - '--id_col 1', - '--sample_suffix \'.mLb.clN.sorted.bam\'', - '--count_col 7', - params.deseq2_vst ? '--vst TRUE' : '' - ].join(' ').trim() - publishDir = [ + if (!params.skip_igv) { + process { + withName: 'IGV' { + publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus/deseq2' + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } - } - - if (!params.skip_igv) { - process { - withName: 'IGV' { - publishDir = [ - path: { [ - "${params.outdir}/igv", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + ] } } } diff --git a/conf/test.config b/conf/test.config index a9ca58c82..2fad3bc87 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,15 +20,13 @@ params { max_time = 6.h // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' + read_length = 50 // Genome references fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genome.fa' gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/atacseq/reference/genes.gtf' - // Not mandatory but permits the pipeline to run through peak-calling steps - macs_gsize = 1.2e7 - // For speed to avoid CI time-out fingerprint_bins = 100 diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 7ad86e8c1..8593c45be 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -93,8 +93,8 @@ class WorkflowChipseq { private static void macsGsizeWarn(log) { log.warn "=============================================================================\n" + " --macs_gsize parameter has not been provided.\n" + - " MACS2 peak-calling and differential analysis will be skipped.\n" + - " Provide '--macs_gsize macs2_genome_size' to change this behaviour.\n" + + " Its value will be obtained using khmer unique-kmers.py based on the --read_length parameter.\n" + + " Provide '--macs_gsize macs2_genome_size' or --read_length to change this behaviour.\n" + "===================================================================================" } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index e17aadd9d..f28972f1f 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -90,4 +90,19 @@ class WorkflowMain { } return val } + + // + // Get macs genome size (macs_gsize) + // + public static Integer getMacsGsize(params) { + def val = null + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey('macs_gsize')) { + if (params.genomes[ params.genome ][ 'macs_gsize' ].containsKey(params.read_length.toString())) { + val = params.genomes[ params.genome ][ 'macs_gsize' ][ params.read_length.toString() ] + } + } + } + return val + } } diff --git a/main.nf b/main.nf index b91365fac..9baf7cb86 100755 --- a/main.nf +++ b/main.nf @@ -25,8 +25,8 @@ params.star_index = WorkflowMain.getGenomeAttribute(params, 'star') params.gtf = WorkflowMain.getGenomeAttribute(params, 'gtf') params.gff = WorkflowMain.getGenomeAttribute(params, 'gff') params.gene_bed = WorkflowMain.getGenomeAttribute(params, 'gene_bed') -params.macs_gsize = WorkflowMain.getGenomeAttribute(params, 'macs_gsize') params.blacklist = WorkflowMain.getGenomeAttribute(params, 'blacklist') +params.macs_gsize = WorkflowMain.getMacsGsize(params) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/modules/local/khmer_uniquekmers.nf b/modules/local/khmer_uniquekmers.nf new file mode 100644 index 000000000..8ad89a628 --- /dev/null +++ b/modules/local/khmer_uniquekmers.nf @@ -0,0 +1,38 @@ +process KHMER_UNIQUEKMERS { + tag "$fasta" + label 'process_low' + + conda (params.enable_conda ? "bioconda::khmer=3.0.0a3" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/khmer:3.0.0a3--py37haa7609a_2' : + 'quay.io/biocontainers/khmer:3.0.0a3--py37haa7609a_2' }" + + input: + path fasta + val kmer_size + + output: + path "report.txt" , emit: report + path "kmers.txt" , emit: kmers + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + unique-kmers.py \\ + -k $kmer_size \\ + -R report.txt \\ + $args \\ + $fasta + + grep ^number report.txt | sed 's/^.*:.[[:blank:]]//g' > kmers.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + khmer: \$( unique-kmers.py --version 2>&1 | grep ^khmer | sed 's/^khmer //;s/ .*\$//' ) + END_VERSIONS + """ +} diff --git a/nextflow.config b/nextflow.config index a776c52f0..511589e2c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,6 +13,7 @@ params { seq_center = null fragment_size = 200 fingerprint_bins = 500000 + read_length = 100 // References genome = null @@ -40,7 +41,6 @@ params { // Options: Peaks narrow_peak = false broad_cutoff = 0.1 - macs_gsize = null macs_fdr = null macs_pvalue = null min_reps_consensus = 1 diff --git a/nextflow_schema.json b/nextflow_schema.json index 7429b1cbf..a3772b598 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,9 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["outdir"], + "required": [ + "outdir" + ], "properties": { "input": { "type": "string", @@ -33,6 +35,19 @@ "description": "Sequencing center information to be added to read group of BAM files.", "fa_icon": "fas fa-synagogue" }, + "read_length": { + "type": "integer", + "description": "Read length to calculate macs genome size (--macs_gsize)parameter", + "fa_icon": "fas fa-chart-area", + "default": 100, + "enum": [ + 50, + 75, + 100, + 150, + 200 + ] + }, "outdir": { "type": "string", "format": "directory-path", @@ -215,7 +230,12 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": ["bwa", "bowtie2", "chromap", "star"] + "enum": [ + "bwa", + "bowtie2", + "chromap", + "star" + ] }, "keep_dups": { "type": "boolean", @@ -491,7 +511,14 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], "hidden": true }, "fingerprint_bins": { diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 7c7862728..f8d5f6485 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -64,6 +64,7 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering */ include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' +include { KHMER_UNIQUEKMERS } from '../modules/local/khmer_uniquekmers' include { FRIP_SCORE } from '../modules/local/frip_score' include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' @@ -390,176 +391,186 @@ workflow CHIPSEQ { // // Call peaks // + ch_macs_gsize = Channel.empty() ch_custompeaks_frip_multiqc = Channel.empty() ch_custompeaks_count_multiqc = Channel.empty() ch_plothomerannotatepeaks_multiqc = Channel.empty() ch_subreadfeaturecounts_multiqc = Channel.empty() - if (params.macs_gsize) { - // Create channel: [ val(meta), ip_bam, control_bam ] - ch_ip_control_bam_bai - .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } - .set { ch_ip_control_bam } - - MACS2_CALLPEAK ( - ch_ip_control_bam, - params.macs_gsize + + ch_macs_gsize = params.macs_gsize + if (!params.macs_gsize) { + KHMER_UNIQUEKMERS ( + PREPARE_GENOME.out.fasta, + params.read_length ) - ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) + ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { it.text.trim() } + } - // - // Filter for MACS2 files without peaks - // - MACS2_CALLPEAK - .out - .peak - .filter { meta, peaks -> peaks.size() > 0 } - .set { ch_macs2_peaks } + // Create channel: [ val(meta), ip_bam, control_bam ] + ch_ip_control_bam_bai + .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + .set { ch_ip_control_bam } - ch_ip_control_bam - .join(ch_macs2_peaks, by: [0]) - .map { it -> [ it[0], it[1], it[3] ] } - .set { ch_ip_peak } + MACS2_CALLPEAK ( + ch_ip_control_bam, + ch_macs_gsize + ) + ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) - FRIP_SCORE ( - ch_ip_peak - ) - ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) + // + // Filter for MACS2 files without peaks + // + MACS2_CALLPEAK + .out + .peak + .filter { meta, peaks -> peaks.size() > 0 } + .set { ch_macs2_peaks } + + ch_ip_control_bam + .join(ch_macs2_peaks, by: [0]) + .map { it -> [ it[0], it[1], it[3] ] } + .set { ch_ip_peak } + FRIP_SCORE ( ch_ip_peak - .join(FRIP_SCORE.out.txt, by: [0]) - .map { it -> [ it[0], it[2], it[3] ] } - .set { ch_ip_peak_frip } - - MULTIQC_CUSTOM_PEAKS ( - ch_ip_peak_frip, - ch_peak_count_header, - ch_frip_score_header + ) + ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) + + ch_ip_peak + .join(FRIP_SCORE.out.txt, by: [0]) + .map { it -> [ it[0], it[2], it[3] ] } + .set { ch_ip_peak_frip } + + MULTIQC_CUSTOM_PEAKS ( + ch_ip_peak_frip, + ch_peak_count_header, + ch_frip_score_header + ) + ch_custompeaks_frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip + ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count + + if (!params.skip_peak_annotation) { + HOMER_ANNOTATEPEAKS_MACS2 ( + ch_macs2_peaks, + PREPARE_GENOME.out.fasta, + PREPARE_GENOME.out.gtf ) - ch_custompeaks_frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip - ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) + + if (!params.skip_peak_qc) { + PLOT_MACS2_QC ( + ch_macs2_peaks.collect{it[1]} + ) + ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) + + PLOT_HOMER_ANNOTATEPEAKS ( + HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, + ch_peak_annotation_header, + "_peaks.annotatePeaks.txt" + ) + ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv + ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) + } + } + + // + // Consensus peaks analysis + // + if (!params.skip_consensus_peaks) { + // Create channel: [ meta , [ peaks ] ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + ch_macs2_peaks + .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .groupTuple() + .map { + antibody, groups, peaks -> + [ + antibody, + groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, + peaks + ] } + .map { + antibody, groups, peaks -> + def meta = [:] + meta.id = antibody + meta.multiple_groups = groups.size() > 1 + meta.replicates_exist = groups.max { groups.value }.value > 1 + [ meta, peaks ] } + .set { ch_antibody_peaks } + + MACS2_CONSENSUS ( + ch_antibody_peaks + ) + ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { - HOMER_ANNOTATEPEAKS_MACS2 ( - ch_macs2_peaks, + HOMER_ANNOTATEPEAKS_CONSENSUS ( + MACS2_CONSENSUS.out.bed, PREPARE_GENOME.out.fasta, PREPARE_GENOME.out.gtf ) - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) - - if (!params.skip_peak_qc) { - PLOT_MACS2_QC ( - ch_macs2_peaks.collect{it[1]} - ) - ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) - - PLOT_HOMER_ANNOTATEPEAKS ( - HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, - ch_peak_annotation_header, - "_peaks.annotatePeaks.txt" - ) - ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv - ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions) - } + ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) + // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + } + + // Create channel: [ val(meta), ip_bam ] + MACS2_CONSENSUS + .out + .saf + .map { meta, saf -> [ meta.id, meta, saf ] } + .set { ch_ip_saf } + + ch_ip_control_bam + .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } + .groupTuple() + .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } + .join(ch_ip_saf) + .map { + it -> + def fmeta = it[1] + fmeta['id'] = it[3]['id'] + fmeta['replicates_exist'] = it[3]['replicates_exist'] + fmeta['multiple_groups'] = it[3]['multiple_groups'] + [ fmeta, it[2], it[4] ] } + .set { ch_ip_bam } + + SUBREAD_FEATURECOUNTS ( + ch_ip_bam + ) + ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary + ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) + + if (!params.skip_deseq2_qc) { + DESEQ2_QC ( + SUBREAD_FEATURECOUNTS.out.counts, + ch_deseq2_pca_header, + ch_deseq2_clustering_header + ) } // - // Consensus peaks analysis + // Create IGV session // - if (!params.skip_consensus_peaks) { - // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] - ch_macs2_peaks - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } - .groupTuple() - .map { - antibody, groups, peaks -> - [ - antibody, - groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, - peaks - ] } - .map { - antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } - .set { ch_antibody_peaks } - - MACS2_CONSENSUS ( - ch_antibody_peaks - ) - ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) - - if (!params.skip_peak_annotation) { - HOMER_ANNOTATEPEAKS_CONSENSUS ( - MACS2_CONSENSUS.out.bed, - PREPARE_GENOME.out.fasta, - PREPARE_GENOME.out.gtf - ) - ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt - } - - // Create channel: [ val(meta), ip_bam ] - MACS2_CONSENSUS - .out - .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .groupTuple() - .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } - .join(ch_ip_saf) - .map { - it -> - def fmeta = it[1] - fmeta['id'] = it[3]['id'] - fmeta['replicates_exist'] = it[3]['replicates_exist'] - fmeta['multiple_groups'] = it[3]['multiple_groups'] - [ fmeta, it[2], it[4] ] } - .set { ch_ip_bam } - - SUBREAD_FEATURECOUNTS ( - ch_ip_bam + if (!params.skip_igv) { + IGV ( + PREPARE_GENOME.out.fasta, + UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + ch_macs2_peaks.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + "bwa/mergedLibrary/bigwig", + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') } ) - ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary - ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - - if (!params.skip_deseq2_qc) { - DESEQ2_QC ( - SUBREAD_FEATURECOUNTS.out.counts, - ch_deseq2_pca_header, - ch_deseq2_clustering_header - ) - } - - // - // Create IGV session - // - if (!params.skip_igv) { - IGV ( - PREPARE_GENOME.out.fasta, - UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - ch_macs2_peaks.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - "bwa/mergedLibrary/bigwig", - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') } - ) - ch_versions = ch_versions.mix(IGV.out.versions) - } + ch_versions = ch_versions.mix(IGV.out.versions) } } + // // MODULE: Pipeline reporting // From 329ba7a25348aa60992eb41203893e17ba002b82 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 14:39:38 +0200 Subject: [PATCH 416/538] prettier and schema do not like each other --- nextflow_schema.json | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index a3772b598..abfc9a6e2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,9 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "outdir" - ], + "required": ["outdir"], "properties": { "input": { "type": "string", @@ -40,13 +38,7 @@ "description": "Read length to calculate macs genome size (--macs_gsize)parameter", "fa_icon": "fas fa-chart-area", "default": 100, - "enum": [ - 50, - 75, - 100, - 150, - 200 - ] + "enum": [50, 75, 100, 150, 200] }, "outdir": { "type": "string", @@ -230,12 +222,7 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "bwa", - "bowtie2", - "chromap", - "star" - ] + "enum": ["bwa", "bowtie2", "chromap", "star"] }, "keep_dups": { "type": "boolean", @@ -511,14 +498,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "fingerprint_bins": { From 58c2f4c90381c9a57d224f534ac22de3aca5dbe6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 16:08:52 +0200 Subject: [PATCH 417/538] Update previously existing macs_gsize with "read_length hashes" --- conf/igenomes.config | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index e18b5ebea..addb5a7d7 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -21,8 +21,14 @@ params { bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" mito_name = "MT" - macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v1.0/GRCh37-blacklist.v1.bed" + macs_gsize = [ + "50" : 2684219875, + "75" : 2733035409, + "100" : 2774803719, + "150" : 2824648687, + "200" : 2848794782 + ] } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" @@ -33,8 +39,14 @@ params { gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" mito_name = "chrM" - macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v3.0/hg38-blacklist.v3.bed" + macs_gsize = [ + "50" : 2701262066, + "75" : 2749859687, + "100" : 2805665311, + "150" : 2862089864, + "200" : 2892537351 + ] } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" @@ -46,7 +58,6 @@ params { bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" mito_name = "MT" - // macs_gsize = "1.87e9" blacklist = "${projectDir}/assets/blacklists/v2.0/GRCm38-blacklist.v2.bed" macs_gsize = [ "50" : 2307679482, @@ -97,7 +108,6 @@ params { gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" mito_name = "MtDNA" - // macs_gsize = "9e7" macs_gsize = [ "50" : 95159402, "75" : 96945370, @@ -136,7 +146,6 @@ params { gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" mito_name = "M" - // macs_gsize = "1.2e8" macs_gsize = [ "50" : 123519388, "75" : 124886264, @@ -247,7 +256,6 @@ params { gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" mito_name = "MT" - // macs_gsize = "1.2e7" macs_gsize = [ "50" : 11624332, "75" : 11693438, @@ -266,7 +274,6 @@ params { bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" mito_name = "MT" - // macs_gsize = "1.21e7" macs_gsize = [ "50" : 12190646, "75" : 12291456, @@ -315,7 +322,6 @@ params { gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" mito_name = "chrM" - // macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v3.0/hg38-blacklist.v3.bed" macs_gsize = [ "50" : 2701262066, @@ -335,7 +341,6 @@ params { bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" mito_name = "chrM" - // macs_gsize = "2.7e9" blacklist = "${projectDir}/assets/blacklists/v1.0/hg19-blacklist.v1.bed" macs_gsize = [ "50" : 2684219875, @@ -355,7 +360,6 @@ params { bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" mito_name = "chrM" - // macs_gsize = "1.87e9" blacklist = "${projectDir}/assets/blacklists/v2.0/mm10-blacklist.v2.bed" macs_gsize = [ "50" : 2307679482, @@ -385,7 +389,6 @@ params { bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" mito_name = "chrM" - // macs_gsize = "9e7" macs_gsize = [ "50" : 95156190, "75" : 96995949, @@ -414,7 +417,6 @@ params { gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" mito_name = "chrM" - // macs_gsize = "1.37e9" macs_gsize = [ "50" : 1172895610, "75" : 1229400206, @@ -432,7 +434,6 @@ params { gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" mito_name = "chrM" - // macs_gsize = "1.2e8" macs_gsize = [ "50" : 123548253, "75" : 124886264, @@ -492,7 +493,6 @@ params { bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" mito_name = "chrM" - // macs_gsize = "1.2e7" macs_gsize = [ "50" : "11624332", "75" : "11693438", From 420d05744609cacd9aec00fab49f8d0f0b27cad9 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 16:09:01 +0200 Subject: [PATCH 418/538] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6928ed449..d9a01b634 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update `igenomes.config` to fetch whole `BWAIndex/version0.6.0/` folder - [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter +- [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. +- [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsizes` on the `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `macs_gsizes` when the parameter is missing. ### Parameters @@ -30,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | | `--aligner` | | | `--save_unaligned` | | `--skip_diff_analysis` | `--skip_deseq2_qc` | +| | `--read_length` | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. From 4a73a2009fae78e9a8cab29701fa193ce7923d86 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Thu, 30 Jun 2022 16:50:01 +0200 Subject: [PATCH 419/538] Update CHANGELOG.md Co-authored-by: Harshil Patel --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a01b634..953213af5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter - [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. -- [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsizes` on the `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `macs_gsizes` when the parameter is missing. +- [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing. ### Parameters From a3289a5ad0be5ea8d8cae6e006ddf2fc175b24f6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 17:39:53 +0200 Subject: [PATCH 420/538] Install khmer uniquekmers as a nf-core module --- modules.json | 3 ++ .../modules/khmer/uniquekmers/main.nf} | 0 .../modules/khmer/uniquekmers/meta.yml | 42 +++++++++++++++++++ workflows/chipseq.nf | 2 +- 4 files changed, 46 insertions(+), 1 deletion(-) rename modules/{local/khmer_uniquekmers.nf => nf-core/modules/khmer/uniquekmers/main.nf} (100%) create mode 100644 modules/nf-core/modules/khmer/uniquekmers/meta.yml diff --git a/modules.json b/modules.json index 9a2a18374..f4a8aeac4 100644 --- a/modules.json +++ b/modules.json @@ -51,6 +51,9 @@ "homer/annotatepeaks": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "khmer/uniquekmers": { + "git_sha": "82fdff4fb4ce6cafcc028a7503da835427f35352" + }, "macs2/callpeak": { "git_sha": "f0800157544a82ae222931764483331a81812012" }, diff --git a/modules/local/khmer_uniquekmers.nf b/modules/nf-core/modules/khmer/uniquekmers/main.nf similarity index 100% rename from modules/local/khmer_uniquekmers.nf rename to modules/nf-core/modules/khmer/uniquekmers/main.nf diff --git a/modules/nf-core/modules/khmer/uniquekmers/meta.yml b/modules/nf-core/modules/khmer/uniquekmers/meta.yml new file mode 100644 index 000000000..31405cc16 --- /dev/null +++ b/modules/nf-core/modules/khmer/uniquekmers/meta.yml @@ -0,0 +1,42 @@ +name: "khmer_uniquekmers" +description: +keywords: + - khmer + - k-mer + - effective genome size + +tools: + - "khmer": + description: khmer k-mer counting library + homepage: https://github.com/dib-lab/khmer + documentation: https://khmer.readthedocs.io/en/latest/ + tool_dev_url: https://github.com/dib-lab/khmer + doi: "10.12688/f1000research.6924.1" + licence: ["BSD License"] + +input: + - fasta: + type: file + description: fasta file + pattern: "*.{fa,fasta}" + - kmer_size: + type: value + description: k-mer size to use + pattern: "[0-9]+" + +output: + - report: + type: file + description: Text file containing unique-kmers.py execution report + pattern: "report.txt" + - kmers: + type: file + description: Text file containing number of kmers + pattern: "kmers.txt" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@JoseEspinosa" diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index f8d5f6485..af46dc81a 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -64,7 +64,6 @@ ch_deseq2_clustering_header = file("$projectDir/assets/multiqc/deseq2_clustering */ include { BEDTOOLS_GENOMECOV } from '../modules/local/bedtools_genomecov' -include { KHMER_UNIQUEKMERS } from '../modules/local/khmer_uniquekmers' include { FRIP_SCORE } from '../modules/local/frip_score' include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' @@ -101,6 +100,7 @@ include { DEEPTOOLS_COMPUTEMATRIX } from '../modules/nf-core/modules/deept include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/modules/deeptools/plotprofile/main' include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/modules/deeptools/plotheatmap/main' include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/modules/deeptools/plotfingerprint/main' +include { KHMER_UNIQUEKMERS } from '../modules/nf-core/modules/khmer/uniquekmers/main' include { MACS2_CALLPEAK } from '../modules/nf-core/modules/macs2/callpeak/main' include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/modules/subread/featurecounts/main' include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' From c771d94de662e719800a3c861732a7fa32b340f0 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 30 Jun 2022 17:40:41 +0200 Subject: [PATCH 421/538] Set read_length to null and exit when param not provided --- lib/WorkflowChipseq.groovy | 6 ++++++ nextflow.config | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 8593c45be..9bdea8a91 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -28,6 +28,12 @@ class WorkflowChipseq { macsGsizeWarn(log) } + if (!params.read_length && !params.macs_gsize) { + log.error "Read length not specified! The pipeline requires either the '--read_length' parameter to be set" + + "to infer MACS2 genome size\nor to provide it with the '--macs_gsize' parameter" + System.exit(1) + } + if (params.aligner) { if (!valid_params['aligners'].contains(params.aligner)) { log.error "Invalid option: '${params.aligner}'. Valid options for '--aligner': ${valid_params['aligners'].join(', ')}." diff --git a/nextflow.config b/nextflow.config index 511589e2c..6e0603d5b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,7 +13,7 @@ params { seq_center = null fragment_size = 200 fingerprint_bins = 500000 - read_length = 100 + read_length = null // References genome = null From a6f6e47eafc9c7780b795823746eb2e8b4a367a0 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 1 Jul 2022 08:32:59 +0200 Subject: [PATCH 422/538] Update rest of macs_gsize maps --- conf/igenomes.config | 172 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index addb5a7d7..786cf6acf 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -77,6 +77,13 @@ params { bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" mito_name = "Mt" + macs_gsize = [ + "50" : 114339094, + "75" : 115317469, + "100" : 118459858, + "150" : 118504138, + "200" : 117723393 + ] } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" @@ -87,6 +94,13 @@ params { gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" + macs_gsize = [ + "50" : 4150072, + "75" : 4191132, + "100" : 4198752, + "150" : 4176800, + "200" : 4197072 + ] } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" @@ -98,6 +112,13 @@ params { bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2370644326, + "75" : 2480511357, + "100" : 2567220492, + "150" : 2594494201, + "200" : 2648740387 + ] } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" @@ -126,6 +147,13 @@ params { bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2237684358, + "75" : 2279860111, + "100" : 2293979635, + "150" : 2300527794, + "200" : 2313332891 + ] } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" @@ -136,6 +164,13 @@ params { gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" mito_name = "MT" + macs_gsize = [ + "50" : 1172895610, + "75" : 1229400206, + "100" : 1253908756, + "150" : 1285330773, + "200" : 1292538906 + ] } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" @@ -147,8 +182,8 @@ params { bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" mito_name = "M" macs_gsize = [ - "50" : 123519388, - "75" : 124886264, + "50" : 123519388, + "75" : 124886264, "100" : 126807034, "150" : 126903604, "200" : 128575605 @@ -164,6 +199,13 @@ params { bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2294980416, + "75" : 2289244826, + "100" : 2334155865, + "150" : 2343297042, + "200" : 2350515523 + ] } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" @@ -174,6 +216,13 @@ params { gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" + macs_gsize = [ + "50" : 4481912, + "75" : 4485018, + "100" : 4468952, + "150" : 4489684, + "200" : 4527891 + ] } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" @@ -184,6 +233,13 @@ params { gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" mito_name = "MT" + macs_gsize = [ + "50" : 974987959, + "75" : 978772437, + "100" : 984935167, + "150" : 979442039, + "200" : 991678648 + ] } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" @@ -194,6 +250,13 @@ params { gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" + macs_gsize = [ + "50" : 748112428, + "75" : 826455017, + "100" : 857283568, + "150" : 895077451, + "200" : 911783687 + ] } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" @@ -205,6 +268,13 @@ params { bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2498932238, + "75" : 2598624693, + "100" : 2642166663, + "150" : 2661433343, + "200" : 2674888870 + ] } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" @@ -215,6 +285,13 @@ params { gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" mito_name = "Mt" + macs_gsize = [ + "50" : 322594956, + "75" : 337043804, + "100" : 345775274, + "150" : 355020671, + "200" : 363478234 + ] } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" @@ -226,6 +303,13 @@ params { bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2576111695, + "75" : 2702821987, + "100" : 2733435831, + "150" : 2735167196, + "200" : 2738912507 + ] } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" @@ -236,6 +320,13 @@ params { gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" mito_name = "MT" + macs_gsize = [ + "50" : 2303951475, + "75" : 2367071843, + "100" : 2402745922, + "150" : 2405692811, + "200" : 2407324495 + ] } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" @@ -246,6 +337,13 @@ params { gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" mito_name = "MT" + macs_gsize = [ + "50" : 2375372135, + "75" : 2440746491, + "100" : 2480029900, + "150" : 2477334634, + "200" : 2478552171 + ] } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" @@ -291,6 +389,13 @@ params { gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" + macs_gsize = [ + "50" : 444102512, + "75" : 506986021, + "100" : 540037446, + "150" : 575130820, + "200" : 595857042 + ] } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" @@ -302,6 +407,13 @@ params { bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" mito_name = "MT" + macs_gsize = [ + "50" : 2105185708, + "75" : 2131615607, + "100" : 2149244400, + "150" : 2189757848, + "200" : 2203893315 + ] } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" @@ -312,6 +424,13 @@ params { gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" mito_name = "Mt" + macs_gsize = [ + "50" : 1113453752, + "75" : 1392458449, + "100" : 1579923466, + "150" : 1729475311, + "200" : 1841419596 + ] } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" @@ -378,6 +497,13 @@ params { gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" mito_name = "chrM" + macs_gsize = [ + "50" : 2370644326, + "75" : 2480511357, + "100" : 2567220492, + "150" : 2594494201, + "200" : 2648740387 + ] } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" @@ -407,6 +533,13 @@ params { bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" mito_name = "chrM" + macs_gsize = [ + "50" : 2237684358, + "75" : 2279860111, + "100" : 2293979635, + "150" : 2300527794, + "200" : 2313332891 + ] } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" @@ -452,6 +585,13 @@ params { bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" mito_name = "chrM" + macs_gsize = [ + "50" : 2294980416, + "75" : 2289244826, + "100" : 2334155865, + "150" : 2343297042, + "200" : 2350515523 + ] } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" @@ -463,6 +603,13 @@ params { bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" mito_name = "chrM" + macs_gsize = [ + "50" : 974987959, + "75" : 978772437, + "100" : 984935167, + "150" : 979442039, + "200" : 991678648 + ] } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" @@ -474,6 +621,13 @@ params { bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" mito_name = "chrM" + macs_gsize = [ + "50" : 2576111695, + "75" : 2702821987, + "100" : 2733435831, + "150" : 2735167196, + "200" : 2738912507 + ] } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" @@ -484,6 +638,13 @@ params { gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" mito_name = "chrM" + macs_gsize = [ + "50" : 2375372135, + "75" : 2440746491, + "100" : 2480029900, + "150" : 2477334634, + "200" : 2478552171 + ] } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" @@ -511,6 +672,13 @@ params { bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" mito_name = "chrM" + macs_gsize = [ + "50" : 2105185708, + "75" : 2131615607, + "100" : 2149244400, + "150" : 2189757848, + "200" : 2203893315 + ] } } } From 1221e794fa6af3ca61a174dbb1bc140ddc8f084a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 1 Jul 2022 08:50:41 +0200 Subject: [PATCH 423/538] Fix spaces --- conf/igenomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 786cf6acf..7f282cee1 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -23,8 +23,8 @@ params { mito_name = "MT" blacklist = "${projectDir}/assets/blacklists/v1.0/GRCh37-blacklist.v1.bed" macs_gsize = [ - "50" : 2684219875, - "75" : 2733035409, + "50" : 2684219875, + "75" : 2733035409, "100" : 2774803719, "150" : 2824648687, "200" : 2848794782 From d6f46214386d9e407b5390191bde90f1f6538594 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Jul 2022 09:40:01 +0200 Subject: [PATCH 424/538] Get rid of default read_length in schema --- nextflow_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index abfc9a6e2..073935e48 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -37,7 +37,6 @@ "type": "integer", "description": "Read length to calculate macs genome size (--macs_gsize)parameter", "fa_icon": "fas fa-chart-area", - "default": 100, "enum": [50, 75, 100, 150, 200] }, "outdir": { From b3badc25c2894b3799e90eafb9cde1453ccbc96e Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Wed, 6 Jul 2022 13:14:25 +0200 Subject: [PATCH 425/538] Update lib/WorkflowChipseq.groovy Co-authored-by: Harshil Patel --- lib/WorkflowChipseq.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 9bdea8a91..068d4640f 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -99,7 +99,7 @@ class WorkflowChipseq { private static void macsGsizeWarn(log) { log.warn "=============================================================================\n" + " --macs_gsize parameter has not been provided.\n" + - " Its value will be obtained using khmer unique-kmers.py based on the --read_length parameter.\n" + + " It will be auto-calculated by 'khmer unique-kmers.py' using the '--read_length' parameter.\n" + " Provide '--macs_gsize macs2_genome_size' or --read_length to change this behaviour.\n" + "===================================================================================" } From 40f1d8f6e9f1a24be2d2134710a4d872e869f61f Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Wed, 6 Jul 2022 13:14:43 +0200 Subject: [PATCH 426/538] Update lib/WorkflowChipseq.groovy Co-authored-by: Harshil Patel --- lib/WorkflowChipseq.groovy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 068d4640f..422ff0ed7 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -29,8 +29,7 @@ class WorkflowChipseq { } if (!params.read_length && !params.macs_gsize) { - log.error "Read length not specified! The pipeline requires either the '--read_length' parameter to be set" + - "to infer MACS2 genome size\nor to provide it with the '--macs_gsize' parameter" + log.error "Both '--read_length' and '--macs_gsize' not specified! Please specify either to infer MACS2 genome size for peak calling." System.exit(1) } From 030ef2c48fcd46118a14006e9cd34bd60e9b28d4 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Wed, 6 Jul 2022 13:15:11 +0200 Subject: [PATCH 427/538] Update lib/WorkflowChipseq.groovy Co-authored-by: Harshil Patel --- lib/WorkflowChipseq.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 422ff0ed7..a072e4838 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -99,7 +99,7 @@ class WorkflowChipseq { log.warn "=============================================================================\n" + " --macs_gsize parameter has not been provided.\n" + " It will be auto-calculated by 'khmer unique-kmers.py' using the '--read_length' parameter.\n" + - " Provide '--macs_gsize macs2_genome_size' or --read_length to change this behaviour.\n" + + " Explicitly provide '--macs_gsize macs2_genome_size' to change this behaviour.\n" + "===================================================================================" } From e62830d48e7497fc88d6b2d6a43e084ec4b5dc60 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Wed, 6 Jul 2022 13:15:30 +0200 Subject: [PATCH 428/538] Update nextflow_schema.json Co-authored-by: Harshil Patel --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 073935e48..feffbe782 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,7 +35,7 @@ }, "read_length": { "type": "integer", - "description": "Read length to calculate macs genome size (--macs_gsize)parameter", + "description": "Read length use to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", "fa_icon": "fas fa-chart-area", "enum": [50, 75, 100, 150, 200] }, From 1a0999c740e6a0b5c7f0f7a6c2f0b4d38e46e21a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 6 Jul 2022 12:45:27 +0100 Subject: [PATCH 429/538] Update nextflow_schema.json --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index feffbe782..ed9cf2007 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,7 +35,7 @@ }, "read_length": { "type": "integer", - "description": "Read length use to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", + "description": "Read length used to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", "fa_icon": "fas fa-chart-area", "enum": [50, 75, 100, 150, 200] }, From 9f783fba987971a4002083f0ba0c7341df83e4ee Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Jul 2022 14:36:43 +0200 Subject: [PATCH 430/538] Fix file naming for HOMER_ANNOTATEPEAKS_MACS2 --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index b9d490c51..e8f169fcf 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -551,7 +551,7 @@ if (!params.skip_peak_annotation) { process { withName: 'HOMER_ANNOTATEPEAKS_MACS2' { ext.args = '-gid' - // ext.prefix = 'peaks' + ext.prefix = { "${meta.id}_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", From b99804195607e46dadcbabce34f727b9a8c893bd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Jul 2022 16:59:55 +0200 Subject: [PATCH 431/538] Fix untar chromap --- subworkflows/local/prepare_genome.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 342465697..9c8615993 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -12,6 +12,7 @@ include { include { UNTAR as UNTAR_BWA_INDEX UNTAR as UNTAR_BOWTIE2_INDEX + UNTAR as UNTAR_CHROMAP_INDEX UNTAR as UNTAR_STAR_INDEX } from '../../modules/nf-core/modules/untar/main' include { GFFREAD } from '../../modules/nf-core/modules/gffread/main' @@ -172,7 +173,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'chromap') { if (params.chromap_index) { if (params.chromap_index.endsWith('.tar.gz')) { - ch_chromap_index = UNTAR ( params.chromap_index ).untar + ch_chromap_index = UNTAR_CHROMAP_INDEX ( [:], params.chromap_index ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR.out.versions) } else { ch_chromap_index = file(params.chromap_index) From bf5baaec68908eb830814c04a2946b78f5066033 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Jul 2022 23:04:36 +0200 Subject: [PATCH 432/538] Generate IGV session regardless of consensus execution --- conf/modules.config | 24 ++++++++++++------------ modules/local/igv.nf | 5 ++--- workflows/chipseq.nf | 39 ++++++++++++++++++++------------------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e8f169fcf..f8a125863 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -663,19 +663,19 @@ if (!params.skip_consensus_peaks) { } } } +} - if (!params.skip_igv) { - process { - withName: 'IGV' { - publishDir = [ - path: { [ - "${params.outdir}/igv", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } +if (!params.skip_igv) { + process { + withName: 'IGV' { + publishDir = [ + path: { [ + "${params.outdir}/igv", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } } diff --git a/modules/local/igv.nf b/modules/local/igv.nf index 0cf01511a..8578092b4 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -16,7 +16,6 @@ process IGV { val bigwig_publish_dir val peak_publish_dir val consensus_publish_dir - // path differential_peaks from ch_macs_consensus_deseq_comp_igv.collect().ifEmpty([]) output: path "*files.txt" , emit: txt @@ -27,6 +26,8 @@ process IGV { """ find * -type l -name "*.bigWig" -exec echo -e ""{}"\\t0,0,178" \\; > bigwig.igv.txt find * -type l -name "*Peak" -exec echo -e ""{}"\\t0,0,178" \\; > peaks.igv.txt + # Avoid error when consensus not produced + find * -type l -name "*.bed" -exec echo -e ""{}"\\t0,0,178" \\; | { grep "^$consensus_publish_dir" || test \$? = 1; } > bed.igv.txt cat *.txt > igv_files.txt igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' @@ -37,5 +38,3 @@ process IGV { END_VERSIONS """ } -// find * -type f -name "${prefix}.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/"{}"\\t0,0,0" \\; > ${prefix}.bed.igv.txt -// find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${PEAK_TYPE}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index af46dc81a..7db9f9016 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -548,29 +548,30 @@ workflow CHIPSEQ { ch_deseq2_clustering_header ) } + } - // - // Create IGV session - // - if (!params.skip_igv) { - IGV ( - PREPARE_GENOME.out.fasta, - UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), - ch_macs2_peaks.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), - "bwa/mergedLibrary/bigwig", - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - { ["bwa/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') } - ) - ch_versions = ch_versions.mix(IGV.out.versions) - } + // + // Create IGV session + // + if (!params.skip_igv) { + IGV ( + PREPARE_GENOME.out.fasta, + UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), + ch_macs2_peaks.collect{it[1]}.ifEmpty([]), + MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + "bwa/mergedLibrary/bigwig", + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + { ["bwa/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') } + ) + ch_versions = ch_versions.mix(IGV.out.versions) } + // // MODULE: Pipeline reporting // From b55decebe932a400fdbdc940d34cc6cb3516b536 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 6 Jul 2022 23:20:36 +0200 Subject: [PATCH 433/538] Move deseq2_qc condition to ext.when modules config --- conf/modules.config | 1 + modules/local/deseq2_qc.nf | 58 ++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f8a125863..2d0e60456 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -645,6 +645,7 @@ if (!params.skip_consensus_peaks) { if (!params.skip_deseq2_qc) { process { withName: DESEQ2_QC { + ext.when = { "${meta.multiple_groups} && ${meta.replicates_exist}" } ext.args = [ '--id_col 1', '--sample_suffix \'.mLb.clN.sorted.bam\'', diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index f9153b426..65afb4c7d 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -24,34 +24,32 @@ process DESEQ2_QC { path "versions.yml" , emit: versions script: - if (meta.multiple_groups && meta.replicates_exist) { - def args = task.ext.args ?: '' - def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - def antibody = meta.antibody - def prefix = "${antibody}.consensus_peaks" - """ - deseq2_qc.r \\ - --count_file $counts \\ - --outdir ./ \\ - --outprefix $prefix \\ - --cores $task.cpus \\ - $args - - sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt - cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv - - sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt - cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv - - find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${peak_type}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") - END_VERSIONS - """ - } + def args = task.ext.args ?: '' + def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' + def antibody = meta.antibody + def prefix = "${antibody}.consensus_peaks" + """ + deseq2_qc.r \\ + --count_file $counts \\ + --outdir ./ \\ + --outprefix $prefix \\ + --cores $task.cpus \\ + $args + + sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt + sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv + + sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt + sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv + + find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${peak_type}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") + END_VERSIONS + """ } From 106419f96fd9c6447c3bec994c3c40b69fd25098 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 11 Jul 2022 17:09:51 +0200 Subject: [PATCH 434/538] Change type to avoid issue when casting to integer --- lib/WorkflowMain.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index f28972f1f..916fad864 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -94,7 +94,7 @@ class WorkflowMain { // // Get macs genome size (macs_gsize) // - public static Integer getMacsGsize(params) { + public static Long getMacsGsize(params) { def val = null if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { if (params.genomes[ params.genome ].containsKey('macs_gsize')) { From 9e01e909ce4b5d7ec3da72796349a0f9e25e2035 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 11 Jul 2022 22:47:48 +0200 Subject: [PATCH 435/538] Do not publish khmer_uniquekmers results --- conf/modules.config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 2d0e60456..4081c3e40 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -485,6 +485,16 @@ if (!params.skip_plot_profile) { } } +if (!params.macs_gsize) { + process { + withName: 'KHMER_UNIQUEKMERS' { + publishDir = [ + enabled: false + ] + } + } +} + if (!params.skip_plot_fingerprint) { process { withName: 'DEEPTOOLS_PLOTFINGERPRINT' { From 6becc2533789798ee4755838393dbbf63df97c68 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 12 Jul 2022 13:14:28 +0200 Subject: [PATCH 436/538] Fix paths according to dsl1 pipeline version --- conf/modules.config | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 4081c3e40..1acd8f8bb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -488,9 +488,7 @@ if (!params.skip_plot_profile) { if (!params.macs_gsize) { process { withName: 'KHMER_UNIQUEKMERS' { - publishDir = [ - enabled: false - ] + publishDir = [ enabled: false ] } } } @@ -524,7 +522,7 @@ process { ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: params.publish_dir_mode, @@ -536,7 +534,7 @@ process { ext.args = '-bed -c -f 0.20' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -547,7 +545,7 @@ process { withName: 'MULTIQC_CUSTOM_PEAKS' { publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -564,7 +562,7 @@ if (!params.skip_peak_annotation) { ext.prefix = { "${meta.id}_peaks" } publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: params.publish_dir_mode, @@ -579,7 +577,7 @@ if (!params.skip_peak_annotation) { ext.args = '-o ./ -p macs2_peak' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -592,7 +590,7 @@ if (!params.skip_peak_annotation) { ext.args = '-o ./ -p macs2_annotatePeaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -611,9 +609,10 @@ if (!params.skip_consensus_peaks) { ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.antibody}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -624,7 +623,7 @@ if (!params.skip_consensus_peaks) { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, @@ -641,7 +640,7 @@ if (!params.skip_consensus_peaks) { ext.prefix = 'consensus_peaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, @@ -664,7 +663,7 @@ if (!params.skip_consensus_peaks) { ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + "${params.outdir}/${params.aligner}/mergedLibrary/macs", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus/deseq2' ].join('') }, From 07ca7be2125cc1d6a5de32ba247975639ab5901f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 12 Jul 2022 16:54:31 +0200 Subject: [PATCH 437/538] Fix ext.when condition of deseq2_qc --- conf/modules.config | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1acd8f8bb..cd371b35a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -485,11 +485,9 @@ if (!params.skip_plot_profile) { } } -if (!params.macs_gsize) { - process { - withName: 'KHMER_UNIQUEKMERS' { - publishDir = [ enabled: false ] - } +process { + withName: 'KHMER_UNIQUEKMERS' { + publishDir = [ enabled: false ] } } @@ -654,7 +652,7 @@ if (!params.skip_consensus_peaks) { if (!params.skip_deseq2_qc) { process { withName: DESEQ2_QC { - ext.when = { "${meta.multiple_groups} && ${meta.replicates_exist}" } + ext.when = { meta.multiple_groups && meta.replicates_exist } ext.args = [ '--id_col 1', '--sample_suffix \'.mLb.clN.sorted.bam\'', From c21ba790593aeadc6fefde97869992840b60e6f0 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 09:15:24 +0200 Subject: [PATCH 438/538] Publish genome fa idx, include regions and chr sizes by default as in v1.2.2 --- conf/modules.config | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index cd371b35a..c1f8d2bb1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -89,7 +89,6 @@ process { path: { "${params.outdir}/genome" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference ] } @@ -98,7 +97,6 @@ process { path: { "${params.outdir}/genome" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_reference ] } } @@ -166,16 +164,14 @@ process { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - mode: params.publish_dir_mode + enabled: false ] } withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { - ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/samtools" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + enabled: false ] } @@ -211,7 +207,7 @@ if (params.aligner == 'bwa') { if (params.aligner == 'bowtie2') { process { withName: 'BOWTIE2_ALIGN' { - ext.args = '' + ext.args = ''` ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, From 46d5a223c2d49975a3e1be1c137b2b8c13e03f7c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 10:45:14 +0200 Subject: [PATCH 439/538] Rename again macs folders as macs2 --- conf/modules.config | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c1f8d2bb1..b26adfabd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -516,7 +516,7 @@ process { ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: params.publish_dir_mode, @@ -528,7 +528,7 @@ process { ext.args = '-bed -c -f 0.20' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -556,7 +556,7 @@ if (!params.skip_peak_annotation) { ext.prefix = { "${meta.id}_peaks" } publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, mode: params.publish_dir_mode, @@ -571,7 +571,7 @@ if (!params.skip_peak_annotation) { ext.args = '-o ./ -p macs2_peak' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -584,7 +584,7 @@ if (!params.skip_peak_annotation) { ext.args = '-o ./ -p macs2_annotatePeaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, @@ -603,7 +603,7 @@ if (!params.skip_consensus_peaks) { ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', "/${meta.antibody}" @@ -617,7 +617,7 @@ if (!params.skip_consensus_peaks) { ext.args = '-F SAF -O --fracOverlap 0.2' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, @@ -634,7 +634,7 @@ if (!params.skip_consensus_peaks) { ext.prefix = 'consensus_peaks' publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' ].join('') }, @@ -657,7 +657,7 @@ if (!params.skip_consensus_peaks) { ].join(' ').trim() publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus/deseq2' ].join('') }, From c67864fc8a899184f8eecd2adb217ab07e1f0535 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 12:48:15 +0200 Subject: [PATCH 440/538] Fix typo --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index b26adfabd..64a8cfa74 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -207,7 +207,7 @@ if (params.aligner == 'bwa') { if (params.aligner == 'bowtie2') { process { withName: 'BOWTIE2_ALIGN' { - ext.args = ''` + ext.args = '' ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, From 647064ccfeaf270da053ad1873325b49dcfb9074 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 13:09:08 +0200 Subject: [PATCH 441/538] Fix path --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 64a8cfa74..344adfc1a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -606,7 +606,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', - "/${meta.antibody}" + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } From 322a7d9e2737ca26d107dc1855ae82708d010471 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 13:12:11 +0200 Subject: [PATCH 442/538] Add read_length to test_full for retrieving macs_gsize --- conf/test_full.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/test_full.config b/conf/test_full.config index de6120539..f47445a54 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -17,6 +17,9 @@ params { // Input data for full size test input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_full.csv' + // Used to get macs_gsize + read_length = 50 + // Genome references genome = 'hg19' } From f69ffbd9b101cc19af3a2937cde952e85b3ab031 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 19 Jul 2022 17:31:40 +0200 Subject: [PATCH 443/538] Fix dir structure inside macs2 consensus --- conf/modules.config | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 344adfc1a..865c8316d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -619,7 +619,8 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -636,7 +637,8 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -659,7 +661,9 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus/deseq2' + '/consensus', + "/${meta.id}", + '/deseq2' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } From 4ec3b2c33f203babc26afd3ea1117199cda625d8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Jul 2022 16:07:36 +0200 Subject: [PATCH 444/538] Fix file publication according to dsl1 pipeline --- conf/modules.config | 121 +++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 51 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 344adfc1a..e189f7003 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -65,6 +65,15 @@ process { ] } + withName: 'UNTAR_CHROMAP_INDEX|CHROMAP_INDEX' { + publishDir = [ + path: { "${params.outdir}/genome/index/chromap" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] + } + withName: 'GFFREAD' { ext.args = '--keep-exon-attrs -F -T' publishDir = [ @@ -88,7 +97,7 @@ process { publishDir = [ path: { "${params.outdir}/genome" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -96,7 +105,7 @@ process { publishDir = [ path: { "${params.outdir}/genome" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } @@ -160,27 +169,40 @@ if (!params.skip_trimming) { } process { - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { ext.prefix = { "${meta.id}.Lb.sorted" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools" }, - enabled: false + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_align_intermeds ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS:SAMTOOLS_INDEX' { publishDir = [ - path: { "${params.outdir}/${params.aligner}/samtools" }, - enabled: false + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_align_intermeds ] } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { - ext.prefix = { "${meta.id}.Lb.sorted" } + // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { + // ext.prefix = { "${meta.id}.Lb.sorted" } + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, + // mode: params.publish_dir_mode, + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + // ] + // } + + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS::BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { publishDir = [ - path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, + path: { "${params.outdir}/${params.aligner}/library/samtools_stats/" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_align_intermeds ] } } @@ -195,11 +217,13 @@ if (params.aligner == 'bwa') { ].join(' ').trim() } ext.args2 = '-bhS -F 0x0100 -O BAM' ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/library" }, + // mode: params.publish_dir_mode, + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + // enabled: params.save_align_intermeds + // ] + publishDir = [ enabled: false ] } } } @@ -209,16 +233,17 @@ if (params.aligner == 'bowtie2') { withName: 'BOWTIE2_ALIGN' { ext.args = '' ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/library" }, + // mode: params.publish_dir_mode, + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + // enabled: params.save_align_intermeds + // ] + publishDir = [ enabled: false ] } } } - if (params.aligner == 'chromap') { process { withName: CHROMAP_INDEX { @@ -235,7 +260,8 @@ if (params.aligner == 'chromap') { publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_align_intermeds ] } } @@ -310,6 +336,7 @@ process { path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, pattern: '*.{bai,csi}' + // pattern: '*.{bam,bai,csi}' //TODO ] } @@ -321,12 +348,15 @@ process { ] } + //TODO + // Should only be published when paired end data is used and save_align_intermeds is true withName: 'BAM_FILTER' { - ext.prefix = { "${meta.id}.mLb.flT.sorted" } + // ext.prefix = { "${meta.id}.mLb.flT.sorted" } + ext.prefix = { meta.single_end ? "${meta.id}.mLb.test" : "${meta.id}.mLb.flT.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + pattern: '*.mLb.flT.sorted.bam', enabled: params.save_align_intermeds ] } @@ -334,11 +364,7 @@ process { withName: 'BAM_REMOVE_ORPHANS' { ext.args = '--only_fr_pairs' ext.prefix = { "${meta.id}.mLb.clN" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + publishDir = [ enabled: false ] } withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:SAMTOOLS_SORT' { @@ -346,7 +372,7 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, - pattern: '*.{bai,csi}' + pattern: '*.bam' ] } @@ -355,7 +381,7 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, - pattern: "*.bam" + pattern: '*.{bai,csi}' ] } @@ -387,29 +413,20 @@ process { } withName: 'BEDTOOLS_GENOMECOV' { - ext.prefix = { "${meta.id}.mLb.clN" } + ext.prefix = { "${meta.id}" } publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: params.publish_dir_mode, - pattern: "*.bigWig" - ], - [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig/scale" }, - mode: params.publish_dir_mode, - pattern: "*.txt" - ] + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig/scale" }, + mode: params.publish_dir_mode, + pattern: "*.txt" ] } withName: 'UCSC_BEDGRAPHTOBIGWIG' { - ext.prefix = { "${meta.id}.mLb.clN" } + ext.prefix = { "${meta.id}" } publishDir = [ - [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, - mode: params.publish_dir_mode, - pattern: "*.bigWig" - ] + path: { "${params.outdir}/${params.aligner}/mergedLibrary/bigwig" }, + mode: params.publish_dir_mode, + pattern: "*.bigWig" ] } } @@ -659,7 +676,9 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus/deseq2' + '/consensus', + "/${meta.id}", + '/deseq2' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } From 381636a9dd0d8e4d1cce3925461608468016ad99 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Jul 2022 16:36:08 +0200 Subject: [PATCH 445/538] Fix indent --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9369fca58..3d7311062 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -637,7 +637,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', - "/${meta.id}" + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -655,7 +655,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', - "/${meta.id}" + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } From ef3d550e15324d8c51ac8ef04b1ef5272e1c7522 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Jul 2022 17:27:44 +0200 Subject: [PATCH 446/538] More file publication fixes --- conf/modules.config | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3d7311062..ced2cac01 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -306,13 +306,10 @@ process { withName: 'PICARD_MERGESAMFILES' { ext.args = '--SORT_ORDER coordinate --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.sorted" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + publishDir = [ enabled: false ] } + // TODO parece que no funciona!!! SET SAVE_ALIGN_INTERMEDS (mirar si picard metrics tb) withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { ext.args = '--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.mkD.sorted" } @@ -336,7 +333,7 @@ process { path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, pattern: '*.{bai,csi}' - // pattern: '*.{bam,bai,csi}' //TODO + enabled: params.save_align_intermeds ] } From b077c38b5b20abe8b042580f8fdb38a929709ff8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Jul 2022 17:29:54 +0200 Subject: [PATCH 447/538] Fix tyop --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index ced2cac01..7a6a23cad 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -332,7 +332,7 @@ process { publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, - pattern: '*.{bai,csi}' + pattern: '*.{bai,csi}', enabled: params.save_align_intermeds ] } From f86d283efc3af8e67a1ed30999338780c6800008 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 20 Jul 2022 22:17:35 +0200 Subject: [PATCH 448/538] Change macs to macs2 output dir --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 7a6a23cad..524d4cdf1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -553,7 +553,7 @@ process { withName: 'MULTIQC_CUSTOM_PEAKS' { publishDir = [ path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs", + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' ].join('') }, From ff91222b3584bfde2ffb56f8f33a484a455ee27e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 08:45:08 +0200 Subject: [PATCH 449/538] Fix typo and not publish chromap bams before sorting --- conf/modules.config | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 524d4cdf1..0fed5bd03 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -188,6 +188,8 @@ process { ] } + // Lb.sorted in samtools_stats should be saved for save_align_intermeds, check if it is this one or not + // corresponds just after the alignment//TODO: fix this // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { // ext.prefix = { "${meta.id}.Lb.sorted" } // publishDir = [ @@ -197,7 +199,8 @@ process { // ] // } - withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS::BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { + //Chromap does not find this config selector //TODO: fix this //Fixed + withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { publishDir = [ path: { "${params.outdir}/${params.aligner}/library/samtools_stats/" }, mode: params.publish_dir_mode, @@ -257,12 +260,13 @@ if (params.aligner == 'chromap') { withName: CHROMAP_CHROMAP { ext.args = '--preset chip --SAM' ext.prefix = { "${meta.id}.Lb" } - publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: params.save_align_intermeds - ] + // publishDir = [ + // path: { "${params.outdir}/${params.aligner}/library" }, + // mode: params.publish_dir_mode, + // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + // enabled: params.save_align_intermeds + // ] + publishDir = [ enabled: false ] } } } From 07ea27fb597be1f04193382eca78f668d8ae99a1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 08:53:31 +0200 Subject: [PATCH 450/538] Add save_unaligned for bowtie2 --- conf/modules.config | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0fed5bd03..35b7ea39b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -220,13 +220,12 @@ if (params.aligner == 'bwa') { ].join(' ').trim() } ext.args2 = '-bhS -F 0x0100 -O BAM' ext.prefix = { "${meta.id}.Lb" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/library" }, - // mode: params.publish_dir_mode, - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - // enabled: params.save_align_intermeds - // ] - publishDir = [ enabled: false ] + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false + ] } } } @@ -236,13 +235,12 @@ if (params.aligner == 'bowtie2') { withName: 'BOWTIE2_ALIGN' { ext.args = '' ext.prefix = { "${meta.id}.Lb" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/library" }, - // mode: params.publish_dir_mode, - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - // enabled: params.save_align_intermeds - // ] - publishDir = [ enabled: false ] + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false + ] } } } @@ -260,13 +258,12 @@ if (params.aligner == 'chromap') { withName: CHROMAP_CHROMAP { ext.args = '--preset chip --SAM' ext.prefix = { "${meta.id}.Lb" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/library" }, - // mode: params.publish_dir_mode, - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - // enabled: params.save_align_intermeds - // ] - publishDir = [ enabled: false ] + publishDir = [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false + ] } } } @@ -294,6 +291,7 @@ if (params.aligner == 'star') { path: { "${params.outdir}/${params.aligner}/library" }, mode: params.publish_dir_mode, pattern: '*.bam', + enabled: false ], [ path: { "${params.outdir}/${params.aligner}/unmapped" }, From 25800a7a7107f6a39d0a55bf40ae563be452c201 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 11:14:05 +0200 Subject: [PATCH 451/538] Add save_unaligned for bowtie2 and refactor in star --- conf/modules.config | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 35b7ea39b..02588a41c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -236,10 +236,18 @@ if (params.aligner == 'bowtie2') { ext.args = '' ext.prefix = { "${meta.id}.Lb" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/library" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: false + [ + path: { "${params.outdir}/${params.aligner}/library" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: false + ], + [ + path: { "${params.outdir}/${params.aligner}/library/unmapped" }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + enabled: params.save_unaligned + ] ] } } @@ -283,7 +291,7 @@ if (params.aligner == 'star') { ].join(' ').trim() publishDir = [ [ - path: { "${params.outdir}/${params.aligner}/log" }, + path: { "${params.outdir}/${params.aligner}/library/log" }, mode: params.publish_dir_mode, pattern: '*.{out,tab}' ], @@ -294,7 +302,7 @@ if (params.aligner == 'star') { enabled: false ], [ - path: { "${params.outdir}/${params.aligner}/unmapped" }, + path: { "${params.outdir}/${params.aligner}/library/unmapped" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_unaligned From ba3b171536f6ebedcf580558e4d145a19637fb2b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 11:34:31 +0200 Subject: [PATCH 452/538] Update output.md --- docs/output.md | 80 +++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/docs/output.md b/docs/output.md index c80fb81a1..f2abcb5e3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -52,22 +52,45 @@ The initial QC and alignments are performed at the library-level e.g. if the sam ### Alignment +The pipeline has been written in a way where all the files generated downstream of the alignment are placed in the same directory as specified by `--aligner` e.g. if `--aligner bwa` is specified then all the downstream results will be placed in the `bwa/` directory. This helps with organising the directory structure and more importantly, allows the end-user to get the results from multiple aligners by simply re-running the pipeline with a different `--aligner` option along the `-resume` parameter. It also means that results won't be overwritten when resuming the pipeline and can be used for benchmarking between alignment algorithms if required. Thus, `` in the directory structure below corresponds to the aligner set when running the pipeline. +
Output files -- `bwa/library/` +- `/library/` - `*.bam`: The files resulting from the alignment of individual libraries are not saved by default so this directory will not be present in your results. You can override this behaviour with the use of the `--save_align_intermeds` flag in which case it will contain the coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -- `bwa/library/samtools_stats/` +- `/library/samtools_stats/` - SAMtools `.sorted.bam.flagstat`, `.sorted.bam.idxstats` and `.sorted.bam.stats` files generated from the alignment files. -> **NB:** File names in the resulting directory (i.e. `bwa/library/`) will have the '`.Lb.`' suffix. +> **NB:** File names in the resulting directory (i.e. `/library/`) will have the '`.Lb.`' suffix.
-Adapter-trimmed reads are mapped to the reference assembly using [BWA](http://bio-bwa.sourceforge.net/bwa.shtml). A genome index is required to run BWA so if this is not provided explicitly using the `--bwa_index` parameter then it will be created automatically from the genome fasta input. The index creation process can take a while for larger genomes so it is possible to use the `--save_reference` parameter to save the indices for future pipeline runs, reducing processing times. +Adapter-trimmed reads are mapped to the reference assembly using the aligner set by the `--aligner` parameter. Available aligners are [BWA](http://bio-bwa.sourceforge.net/bwa.shtml) (default), [Bowtie 2](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml), [Chromap](https://github.com/haowenz/chromap) and [STAR](https://github.com/alexdobin/STAR). A genome index is required to run any of this aligners so if this is not provided explicitly using the corresponding parameter (e.g. `--bwa_index`), then it will be created automatically from the genome fasta input. The index creation process can take a while for larger genomes so it is possible to use the `--save_reference` parameter to save the indices for future pipeline runs, reducing processing times. ![MultiQC - SAMtools stats plot](images/mqc_samtools_stats_plot.png) +#### Unmapped reads + +The `--save_unaligned` parameter enables to obtain FastQ files containing unmapped reads (only available for STAR and Bowtie2). + +
+ Output files +- `/library/unmapped/` + - `*.fastq.gz`: If `--save_unaligned` is specified, FastQ files containing unmapped reads will be placed in this directory. + +
+ +#### STAR logs + +
+ Output files + +- `star/library/log/` + - `*.SJ.out.tab`: File containing filtered splice junctions detected after mapping the reads. + - `*.Log.final.out`: STAR alignment report containing the mapping results summary. + - `*.Log.out` and `*.Log.progress.out`: STAR log files containing detailed information about the run. Typically only useful for debugging purposes. + ## Merged library-level analysis The library-level alignments associated with the same sample are merged and subsequently used for the downstream analyses. @@ -77,19 +100,19 @@ The library-level alignments associated with the same sample are merged and subs
Output files -- `bwa/mergedLibrary/` +- `/mergedLibrary/` - `*.bam`: Merged library-level, coordinate sorted `*.bam` files after the marking of duplicates, and filtering based on various criteria. The file suffix for the final filtered files will be `*.mLb.clN.*`. If you specify the `--save_align_intermeds` parameter then two additional sets of files will be present. These represent the unfiltered alignments with duplicates marked (`*.mLb.mkD.*`), and in the case of paired-end datasets the filtered alignments before the removal of orphan read pairs (`*.mLb.flT.*`). -- `bwa/mergedLibrary/samtools_stats/` +- `/mergedLibrary/samtools_stats/` - SAMtools `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. -- `bwa/mergedLibrary/picard_metrics/` +- `/mergedLibrary/picard_metrics/` - `*_metrics`: Alignment QC files from picard CollectMultipleMetrics. - `*.metrics.txt`: Metrics file from MarkDuplicates. -- `bwa/mergedLibrary/picard_metrics/pdf/` +- `/mergedLibrary/picard_metrics/pdf/` - `*.pdf`: Alignment QC plot files from picard CollectMultipleMetrics. -- `bwa/mergedLibrary/preseq/` +- `/mergedLibrary/preseq/` - `*.lc_extrap.txt`: Preseq expected future yield file. -> **NB:** File names in the resulting directory (i.e. `bwa/mergedLibrary/`) will have the '`.mLb.`' suffix. +> **NB:** File names in the resulting directory (i.e. `/mergedLibrary/`) will have the '`.mLb.`' suffix.
@@ -110,7 +133,7 @@ The [Preseq](http://smithlabresearch.org/software/preseq/) package is aimed at p
Output files -- `bwa/mergedLibrary/bigwig/` +- `/mergedLibrary/bigwig/` - `*.bigWig`: Normalised bigWig files scaled to 1 million mapped reads.
@@ -122,12 +145,12 @@ The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in a
Output files -- `bwa/mergedLibrary/phantompeakqualtools/` +- `/mergedLibrary/phantompeakqualtools/` - `*.spp.out`, `*.spp.pdf`: phantompeakqualtools output files. - `*_mqc.tsv`: MultiQC custom content files. -- `bwa/mergedLibrary/deepTools/plotFingerprint/` +- `/mergedLibrary/deepTools/plotFingerprint/` - `*.plotFingerprint.pdf`, `*.plotFingerprint.qcmetrics.txt`, `*.plotFingerprint.raw.txt`: plotFingerprint output files. -- `bwa/mergedLibrary/deepTools/plotProfile/` +- `/mergedLibrary/deepTools/plotProfile/` - `*.computeMatrix.mat.gz`, `*.computeMatrix.vals.mat.tab`, `*.plotProfile.pdf`, `*.plotProfile.tab`, `*.plotHeatmap.pdf`, `*.plotHeatmap.mat.tab`: plotProfile output files.
@@ -157,10 +180,10 @@ The results from deepTools plotProfile gives you a quick visualisation for the g
Output files -- `bwa/mergedLibrary/macs2//` +- `/mergedLibrary/macs2//` - `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in _narrowPeak_ or _broadPeak_ mode. - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. -- `bwa/mergedLibrary/macs2//qc/` +- `/mergedLibrary/macs2//qc/` - `macs_peak.plots.pdf`: QC plots for MACS2 peaks. - `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. - `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. @@ -186,7 +209,7 @@ Various QC plots per sample including number of peaks, fold-change distribution,
Output files -- `bwa/mergedLibrary/macs2//consensus/` +- `/mergedLibrary/macs2//consensus/` - `*.bed`: Consensus peak-set across all samples in BED format. - `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. @@ -214,18 +237,12 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -- `bwa/mergedLibrary/macs2//consensus//deseq2/` - - `*.results.txt`: Spreadsheet containing differential binding results across all consensus peaks and all comparisons. +- `/mergedLibrary/macs2//consensus//deseq2/` + - `*.sample.dists.txt`: Spreadsheet containing sample-to-sample distance across each consensus peak. - `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - - `*.log`: Log file with information for number of differentially bound intervals at different FDR and fold-change thresholds for each comparison. - `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. - `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. - - `bwa/mergedLibrary/macs2//consensus///` - - `*.results.txt`: Spreadsheet containing comparison-specific DESeq2 output for differential binding results across all peaks. - - `*FDR0.01.results.txt`, `*FDR0.05.results.txt`: Subset of above file for peaks that pass FDR <= 0.01 and FDR <= 0.05. - - `*FDR0.01.results.bed`, `*FDR0.05.results.bed`: BED files for peaks that pass FDR <= 0.01 and FDR <= 0.05. - - `*deseq2.plots.pdf`: MA, Volcano, clustering and scatterplots at FDR <= 0.01 and FDR <= 0.05. - - `bwa/mergedLibrary/macs2//consensus//sizeFactors/` + - `/mergedLibrary/macs2//consensus//sizeFactors/` - `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
@@ -238,16 +255,6 @@ This pipeline uses a standardised DESeq2 analysis script to get an idea of the r ![MultiQC - DESeq2 sample similarity plot](images/mqc_deseq2_sample_similarity_plot.png) -By default, all possible pairwise comparisons across the groups from a particular antibody (as defined in [`design.csv`](usage.md#--design)) are performed. The DESeq2 results are generated by the pipeline in various ways. You can load up the results across all of the comparisons in a single spreadsheet, or individual folders will also be created that contain the results specific to a particular comparison. For the latter, additional files will also be generated where the intervals have been pre-filtered based on a couple of standard FDR thresholds. Please see [DESeq2 output](http://bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#differential-expression-analysis) for a description of the columns generated by DESeq2. - -

- R - DESeq2 MA plot -

- -

- R - DESeq2 Volcano plot -

- ## Aggregate analysis ### Present QC for the raw read, alignment, peak and differential binding results @@ -304,6 +311,7 @@ Once installed, open IGV, go to `File > Open Session` and select the `igv_sessio - `bwa/`: Directory containing BWA indices. - `bowtie2/`: Directory containing BOWTIE2 indices. + - `chromap/`: Directory containing Chromap indices. - `star/`: Directory containing STAR indices. - If the `--save_reference` parameter is provided then the alignment indices generated by the pipeline will be saved in this directory. This can be quite a time-consuming process so it permits their reuse for future runs of the pipeline or for other purposes. From 5c37b568fb53266fdea98adf2d5931b80d83d1d5 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 11:35:01 +0200 Subject: [PATCH 453/538] Remove comparisons not available anymore --- docs/images/r_deseq2_ma_plot.png | Bin 160987 -> 0 bytes docs/images/r_deseq2_volcano_plot.png | Bin 40521 -> 0 bytes modules/local/deseq2_qc.nf | 2 -- 3 files changed, 2 deletions(-) delete mode 100755 docs/images/r_deseq2_ma_plot.png delete mode 100755 docs/images/r_deseq2_volcano_plot.png diff --git a/docs/images/r_deseq2_ma_plot.png b/docs/images/r_deseq2_ma_plot.png deleted file mode 100755 index 67c598fc74408eb74cbb6fdd61b0e78d9245c256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160987 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 diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index 65afb4c7d..acc4d595d 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -44,8 +44,6 @@ process DESEQ2_QC { sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv - find * -type f -name "*.FDR0.05.results.bed" -exec echo -e "bwa/mergedLibrary/macs/${peak_type}/consensus/${antibody}/deseq2/"{}"\\t255,0,0" \\; > ${prefix}.igv.txt - cat <<-END_VERSIONS > versions.yml "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') From 89d5bdf8e6bdfd6cc80102df4e29e246d464fff6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 11:45:37 +0200 Subject: [PATCH 454/538] Change trim_galore by trimgalore in output.md --- docs/output.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/output.md b/docs/output.md index f2abcb5e3..8074696c6 100644 --- a/docs/output.md +++ b/docs/output.md @@ -35,13 +35,13 @@ The initial QC and alignments are performed at the library-level e.g. if the sam
Output files -- `trim_galore/` +- `trimgalore/` - `*fastq.gz`: If `--save_trimmed` is specified, FastQ files **after** adapter trimming will be placed in this directory. -- `trim_galore/logs/` +- `trimgalore/logs/` - `*.log`: Log file generated by Trim Galore!. -- `trim_galore/fastqc/` +- `trimgalore/fastqc/` - `*_fastqc.html`: FastQC report containing quality metrics for read 1 (_and read2 if paired-end_) **after** adapter trimming. -- `trim_galore/fastqc/zips/` +- `trimgalore/fastqc/zips/` - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
From d37edb2cdd24a42db20d5ba975d5a3b240ae5797 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 17:04:27 +0200 Subject: [PATCH 455/538] Update modules --- conf/modules.config | 21 +--- modules.json | 29 +++-- modules/nf-core/modules/bowtie2/align/main.nf | 104 +++++++++--------- .../nf-core/modules/bowtie2/align/meta.yml | 11 ++ .../custom/dumpsoftwareversions/main.nf | 6 +- modules/nf-core/modules/gunzip/main.nf | 10 ++ .../modules/homer/annotatepeaks/main.nf | 4 +- modules/nf-core/modules/multiqc/main.nf | 43 -------- modules/nf-core/modules/multiqc/meta.yml | 40 ------- .../modules/phantompeakqualtools/main.nf | 4 +- .../picard/collectmultiplemetrics/main.nf | 10 +- .../picard/collectmultiplemetrics/meta.yml | 4 + .../modules/picard/markduplicates/main.nf | 6 +- .../modules/picard/mergesamfiles/main.nf | 6 +- .../nf-core/modules/samtools/flagstat/main.nf | 3 +- .../nf-core/modules/samtools/idxstats/main.nf | 4 +- .../nf-core/modules/samtools/stats/main.nf | 5 +- .../modules/ucsc/bedgraphtobigwig/main.nf | 4 +- modules/nf-core/modules/untar/main.nf | 8 +- subworkflows/nf-core/align_bowtie2.nf | 2 +- workflows/chipseq.nf | 3 +- 21 files changed, 130 insertions(+), 197 deletions(-) delete mode 100644 modules/nf-core/modules/multiqc/main.nf delete mode 100644 modules/nf-core/modules/multiqc/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 02588a41c..36dbe73ec 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -188,19 +188,8 @@ process { ] } - // Lb.sorted in samtools_stats should be saved for save_align_intermeds, check if it is this one or not - // corresponds just after the alignment//TODO: fix this - // withName: 'NFCORE_CHIPSEQ:CHIPSEQ:.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { - // ext.prefix = { "${meta.id}.Lb.sorted" } - // publishDir = [ - // path: { "${params.outdir}/${params.aligner}/library/samtools_stats" }, - // mode: params.publish_dir_mode, - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - // ] - // } - - //Chromap does not find this config selector //TODO: fix this //Fixed withName: 'NFCORE_CHIPSEQ:CHIPSEQ:ALIGN_.*:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:SAMTOOLS_.*' { + ext.prefix = { "${meta.id}.Lb.sorted.bam" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library/samtools_stats/" }, mode: params.publish_dir_mode, @@ -319,7 +308,6 @@ process { publishDir = [ enabled: false ] } - // TODO parece que no funciona!!! SET SAVE_ALIGN_INTERMEDS (mirar si picard metrics tb) withName: '.*:MARK_DUPLICATES_PICARD:PICARD_MARKDUPLICATES' { ext.args = '--ASSUME_SORTED true --REMOVE_DUPLICATES false --VALIDATION_STRINGENCY LENIENT --TMP_DIR tmp' ext.prefix = { "${meta.id}.mLb.mkD.sorted" } @@ -348,6 +336,7 @@ process { } withName: '.*:MARK_DUPLICATES_PICARD:BAM_STATS_SAMTOOLS:.*' { + ext.prefix = { "${meta.id}.mLb.mkD.sorted.bam" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, mode: params.publish_dir_mode, @@ -355,11 +344,9 @@ process { ] } - //TODO // Should only be published when paired end data is used and save_align_intermeds is true withName: 'BAM_FILTER' { - // ext.prefix = { "${meta.id}.mLb.flT.sorted" } - ext.prefix = { meta.single_end ? "${meta.id}.mLb.test" : "${meta.id}.mLb.flT.sorted" } + ext.prefix = { meta.single_end ? "${meta.id}.mLb.noPublish" : "${meta.id}.mLb.flT.sorted" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary" }, mode: params.publish_dir_mode, @@ -393,7 +380,7 @@ process { } withName: 'NFCORE_CHIPSEQ:CHIPSEQ:FILTER_BAM_BAMTOOLS:BAM_SORT_SAMTOOLS:BAM_STATS_SAMTOOLS:.*' { - ext.prefix = { "${meta.id}.mLb.clN.sorted" } + ext.prefix = { "${meta.id}.mLb.clN.sorted.bam" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/samtools_stats" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index f4a8aeac4..ad30c80a2 100644 --- a/modules.json +++ b/modules.json @@ -4,7 +4,7 @@ "repos": { "nf-core/modules": { "bowtie2/align": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" }, "bowtie2/build": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -22,7 +22,7 @@ "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" }, "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "e5b44499efcf6f7fb24874886bac60591c5d94dd" }, "custom/getchromsizes": { "git_sha": "213403187932dbbdd936a04474cc8cd8abae7a08" @@ -46,10 +46,10 @@ "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "gunzip": { - "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" + "git_sha": "fa37e0662690c4ec4260dae282fbce08777503e6" }, "homer/annotatepeaks": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" }, "khmer/uniquekmers": { "git_sha": "82fdff4fb4ce6cafcc028a7503da835427f35352" @@ -57,29 +57,26 @@ "macs2/callpeak": { "git_sha": "f0800157544a82ae222931764483331a81812012" }, - "multiqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, "phantompeakqualtools": { - "git_sha": "6a46e7cf117bbae41bca9b4c7ff7a77794df16ec" + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" }, "picard/collectmultiplemetrics": { - "git_sha": "00467ac64affbbc17b255762f10a6c8fa362aabc" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "picard/markduplicates": { - "git_sha": "20ebb89ff97a2665106be9cace5ccb9aa4eed1be" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "picard/mergesamfiles": { - "git_sha": "20ebb89ff97a2665106be9cace5ccb9aa4eed1be" + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" }, "preseq/lcextrap": { "git_sha": "7111e571cc5b6069de4673cd6165af680f17b4d7" }, "samtools/flagstat": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" }, "samtools/idxstats": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" }, "samtools/index": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" @@ -88,7 +85,7 @@ "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/stats": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "f48a24770e24358e58de66e9b805a70d77cd154b" }, "subread/featurecounts": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" @@ -97,10 +94,10 @@ "git_sha": "85ec13ff1fc2196c5a507ea497de468101baabed" }, "ucsc/bedgraphtobigwig": { - "git_sha": "e20e57f90b6787ac9a010a980cf6ea98bd990046" + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" }, "untar": { - "git_sha": "9aadd9a6d3f5964476582319b3a1c54a3e3fe7c9" + "git_sha": "51be617b1ca9bff973655eb899d591ed6ab253b5" } } } diff --git a/modules/nf-core/modules/bowtie2/align/main.nf b/modules/nf-core/modules/bowtie2/align/main.nf index 44ce76ca0..c74e376f7 100644 --- a/modules/nf-core/modules/bowtie2/align/main.nf +++ b/modules/nf-core/modules/bowtie2/align/main.nf @@ -1,77 +1,71 @@ process BOWTIE2_ALIGN { tag "$meta.id" - label 'process_high' + label "process_high" - conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4 bioconda::samtools=1.15.1 conda-forge::pigz=2.6' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' : - 'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' }" + conda (params.enable_conda ? "bioconda::bowtie2=2.4.4 bioconda::samtools=1.15.1 conda-forge::pigz=2.6" : null) + container "${ workflow.containerEngine == "singularity" && !task.ext.singularity_pull_docker_container ? + "https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0" : + "quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0" }" input: tuple val(meta), path(reads) path index val save_unaligned + val sort_bam output: - tuple val(meta), path('*.bam') , emit: bam - tuple val(meta), path('*.log') , emit: log - tuple val(meta), path('*fastq.gz'), emit: fastq, optional:true + tuple val(meta), path("*.bam") , emit: bam + tuple val(meta), path("*.log") , emit: log + tuple val(meta), path("*fastq.gz"), emit: fastq, optional:true path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' + def args = task.ext.args ?: "" + def args2 = task.ext.args2 ?: "" def prefix = task.ext.prefix ?: "${meta.id}" - if (meta.single_end) { - def unaligned = save_unaligned ? "--un-gz ${prefix}.unmapped.fastq.gz" : '' - """ - INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'` - bowtie2 \\ - -x \$INDEX \\ - -U $reads \\ - --threads $task.cpus \\ - $unaligned \\ - $args \\ - 2> ${prefix}.bowtie2.log \\ - | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS - """ + def unaligned = "" + def reads_args = "" + if (meta.single_end) { + unaligned = save_unaligned ? "--un-gz ${prefix}.unmapped.fastq.gz" : "" + reads_args = "-U ${reads}" } else { - def unaligned = save_unaligned ? "--un-conc-gz ${prefix}.unmapped.fastq.gz" : '' - """ - INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'` - bowtie2 \\ - -x \$INDEX \\ - -1 ${reads[0]} \\ - -2 ${reads[1]} \\ - --threads $task.cpus \\ - $unaligned \\ - $args \\ - 2> ${prefix}.bowtie2.log \\ - | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam - + unaligned = save_unaligned ? "--un-conc-gz ${prefix}.unmapped.fastq.gz" : "" + reads_args = "-1 ${reads[0]} -2 ${reads[1]}" + } - if [ -f ${prefix}.unmapped.fastq.1.gz ]; then - mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz - fi - if [ -f ${prefix}.unmapped.fastq.2.gz ]; then - mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz - fi + def samtools_command = sort_bam ? 'sort' : 'view' - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS - """ - } + """ + INDEX=`find -L ./ -name "*.rev.1.bt2" | sed "s/.rev.1.bt2//"` + [ -z "\$INDEX" ] && INDEX=`find -L ./ -name "*.rev.1.bt2l" | sed "s/.rev.1.bt2l//"` + [ -z "\$INDEX" ] && echo "Bowtie2 index files not found" 1>&2 && exit 1 + + bowtie2 \\ + -x \$INDEX \\ + $reads_args \\ + --threads $task.cpus \\ + $unaligned \\ + $args \\ + 2> ${prefix}.bowtie2.log \\ + | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.bam - + + if [ -f ${prefix}.unmapped.fastq.1.gz ]; then + mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz + fi + + if [ -f ${prefix}.unmapped.fastq.2.gz ]; then + mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/bowtie2/align/meta.yml b/modules/nf-core/modules/bowtie2/align/meta.yml index f80421eca..42ba0f964 100644 --- a/modules/nf-core/modules/bowtie2/align/meta.yml +++ b/modules/nf-core/modules/bowtie2/align/meta.yml @@ -2,7 +2,9 @@ name: bowtie2_align description: Align reads to a reference genome using bowtie2 keywords: - align + - map - fasta + - fastq - genome - reference tools: @@ -29,6 +31,15 @@ input: type: file description: Bowtie2 genome index files pattern: "*.ebwt" + - save_unaligned: + type: boolean + description: | + Save reads that do not map to the reference (true) or discard them (false) + (default: false) + - sort_bam: + type: boolean + description: use samtools sort (true) or samtools view (false) + pattern: "true or false" output: - bam: type: file diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 327d51005..203e485ae 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_low' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.13a' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13a--pyhdfd78af_1' : + 'quay.io/biocontainers/multiqc:1.13a--pyhdfd78af_1' }" input: path versions diff --git a/modules/nf-core/modules/gunzip/main.nf b/modules/nf-core/modules/gunzip/main.nf index 61bf1afa5..703670495 100644 --- a/modules/nf-core/modules/gunzip/main.nf +++ b/modules/nf-core/modules/gunzip/main.nf @@ -31,4 +31,14 @@ process GUNZIP { gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') END_VERSIONS """ + + stub: + gunzip = archive.toString() - '.gz' + """ + touch $gunzip + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/homer/annotatepeaks/main.nf b/modules/nf-core/modules/homer/annotatepeaks/main.nf index c9da82ed4..9056a5ab5 100644 --- a/modules/nf-core/modules/homer/annotatepeaks/main.nf +++ b/modules/nf-core/modules/homer/annotatepeaks/main.nf @@ -1,9 +1,8 @@ -def VERSION = '4.11' // Version information not provided by tool on CLI - process HOMER_ANNOTATEPEAKS { tag "$meta.id" label 'process_medium' + // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. conda (params.enable_conda ? "bioconda::homer=4.11" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/homer:4.11--pl526hc9558a2_3' : @@ -24,6 +23,7 @@ process HOMER_ANNOTATEPEAKS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '4.11' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ annotatePeaks.pl \\ $peak \\ diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index ae019dbf0..000000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,43 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - multiqc -f $args . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ - - stub: - """ - touch multiqc_data - touch multiqc_plots - touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml deleted file mode 100644 index 6fa891efc..000000000 --- a/modules/nf-core/modules/multiqc/meta.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: MultiQC -description: Aggregate results from bioinformatics analyses across many samples into a single report -keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report -tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ["GPL-3.0-or-later"] -input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" diff --git a/modules/nf-core/modules/phantompeakqualtools/main.nf b/modules/nf-core/modules/phantompeakqualtools/main.nf index d8f733425..43fca6836 100644 --- a/modules/nf-core/modules/phantompeakqualtools/main.nf +++ b/modules/nf-core/modules/phantompeakqualtools/main.nf @@ -1,9 +1,8 @@ -def VERSION = '1.2.2' // Version information not provided by tool on CLI - process PHANTOMPEAKQUALTOOLS { tag "$meta.id" label 'process_medium' + // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. conda (params.enable_conda ? "bioconda::phantompeakqualtools=1.2.2" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/phantompeakqualtools:1.2.2--0' : @@ -25,6 +24,7 @@ process PHANTOMPEAKQUALTOOLS { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '1.2.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ RUN_SPP=`which run_spp.R` Rscript $args -e "library(caTools); source(\\"\$RUN_SPP\\")" -c="$bam" -savp="${prefix}.spp.pdf" -savd="${prefix}.spp.Rdata" -out="${prefix}.spp.out" $args2 diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf index a653b5490..63f4e8729 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/main.nf @@ -2,14 +2,15 @@ process PICARD_COLLECTMULTIPLEMETRICS { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) path fasta + path fai output: tuple val(meta), path("*_metrics"), emit: metrics @@ -22,6 +23,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3 if (!task.memory) { log.info '[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' @@ -35,7 +37,7 @@ process PICARD_COLLECTMULTIPLEMETRICS { $args \\ --INPUT $bam \\ --OUTPUT ${prefix}.CollectMultipleMetrics \\ - --REFERENCE_SEQUENCE $fasta + $reference cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml index 68b5c65ee..c11b02cfa 100644 --- a/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml +++ b/modules/nf-core/modules/picard/collectmultiplemetrics/meta.yml @@ -28,6 +28,10 @@ input: - fasta: type: file description: Genome fasta file + - fai: + type: file + description: Index of FASTA file. Only needed when fasta is supplied. + pattern: "*.fai" output: - meta: type: map diff --git a/modules/nf-core/modules/picard/markduplicates/main.nf b/modules/nf-core/modules/picard/markduplicates/main.nf index 1565c6478..4e559fea0 100644 --- a/modules/nf-core/modules/picard/markduplicates/main.nf +++ b/modules/nf-core/modules/picard/markduplicates/main.nf @@ -2,10 +2,10 @@ process PICARD_MARKDUPLICATES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/modules/picard/mergesamfiles/main.nf b/modules/nf-core/modules/picard/mergesamfiles/main.nf index 1e32c63a6..cccf4d3d5 100644 --- a/modules/nf-core/modules/picard/mergesamfiles/main.nf +++ b/modules/nf-core/modules/picard/mergesamfiles/main.nf @@ -2,10 +2,10 @@ process PICARD_MERGESAMFILES { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::picard=2.27.1" : null) + conda (params.enable_conda ? "bioconda::picard=2.27.4" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/picard:2.27.1--hdfd78af_0' : - 'quay.io/biocontainers/picard:2.27.1--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/picard:2.27.4--hdfd78af_0' : + 'quay.io/biocontainers/picard:2.27.4--hdfd78af_0' }" input: tuple val(meta), path(bams) diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index b87b21081..03ec2dcf4 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -19,12 +19,13 @@ process SAMTOOLS_FLAGSTAT { script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ samtools \\ flagstat \\ --threads ${task.cpus-1} \\ $bam \\ - > ${bam}.flagstat + > ${prefix}.flagstat cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index a49ff35f9..4b2454198 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -19,11 +19,13 @@ process SAMTOOLS_IDXSTATS { script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ samtools \\ idxstats \\ $bam \\ - > ${bam}.idxstats + > ${prefix}.idxstats cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index bbdc3240d..89b92d79e 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -20,6 +20,7 @@ process SAMTOOLS_STATS { script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ @@ -27,7 +28,7 @@ process SAMTOOLS_STATS { --threads ${task.cpus-1} \\ ${reference} \\ ${input} \\ - > ${input}.stats + > ${prefix}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -38,7 +39,7 @@ process SAMTOOLS_STATS { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${input}.stats + touch ${prefix}.stats cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf index ef0ca088f..b18b190ad 100644 --- a/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/modules/ucsc/bedgraphtobigwig/main.nf @@ -1,9 +1,8 @@ -def VERSION = '377' // Version information not provided by tool on CLI - process UCSC_BEDGRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' + // WARN: Version information not provided by tool on CLI. Please update version string below when bumping container versions. conda (params.enable_conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1' : @@ -23,6 +22,7 @@ process UCSC_BEDGRAPHTOBIGWIG { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ bedGraphToBigWig \\ $bedgraph \\ diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 058d17644..29ab10a50 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -21,12 +21,18 @@ process UNTAR { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' untar = archive.toString() - '.tar.gz' + """ + mkdir output + tar \\ + -C output --strip-components 1 \\ -xzvf \\ $args \\ $archive \\ - $args2 \\ + $args2 + + mv output ${untar} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/nf-core/align_bowtie2.nf b/subworkflows/nf-core/align_bowtie2.nf index bb0888f3c..352191313 100644 --- a/subworkflows/nf-core/align_bowtie2.nf +++ b/subworkflows/nf-core/align_bowtie2.nf @@ -18,7 +18,7 @@ workflow ALIGN_BOWTIE2 { // // Map reads with BWA // - BOWTIE2_ALIGN(reads, index, save_unaligned) + BOWTIE2_ALIGN(reads, index, save_unaligned, false) ch_versions = ch_versions.mix(BOWTIE2_ALIGN.out.versions.first()) // diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 7db9f9016..13f859882 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -290,7 +290,8 @@ workflow CHIPSEQ { if (!params.skip_picard_metrics) { PICARD_COLLECTMULTIPLEMETRICS ( FILTER_BAM_BAMTOOLS.out.bam, - PREPARE_GENOME.out.fasta + PREPARE_GENOME.out.fasta, + [] ) ch_picardcollectmultiplemetrics_multiqc = PICARD_COLLECTMULTIPLEMETRICS.out.metrics ch_versions = ch_versions.mix(PICARD_COLLECTMULTIPLEMETRICS.out.versions.first()) From a5aad852611f322dc1933e0f2a16feed285b44f3 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 17:43:43 +0200 Subject: [PATCH 456/538] Fix error when skipping consensus peaks due to ext.when use --- workflows/chipseq.nf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 13f859882..8df584367 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -477,6 +477,7 @@ workflow CHIPSEQ { // // Consensus peaks analysis // + ch_macs2_consensus_bed_lib = Channel.empty() if (!params.skip_consensus_peaks) { // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] @@ -502,7 +503,8 @@ workflow CHIPSEQ { MACS2_CONSENSUS ( ch_antibody_peaks ) - ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) + ch_macs2_consensus_bed_lib = MACS2_CONSENSUS_LIB.out.bed + ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { HOMER_ANNOTATEPEAKS_CONSENSUS ( @@ -559,7 +561,7 @@ workflow CHIPSEQ { PREPARE_GENOME.out.fasta, UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), ch_macs2_peaks.collect{it[1]}.ifEmpty([]), - MACS2_CONSENSUS.out.bed.collect{it[1]}.ifEmpty([]), + ch_macs2_consensus_bed_lib.collect{it[1]}.ifEmpty([]), "bwa/mergedLibrary/bigwig", { ["bwa/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' From dc7b5863c51df98e24196aaf8e65c0e8ee90a9ba Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 17:51:47 +0200 Subject: [PATCH 457/538] Be careful when copy/pasting --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 8df584367..87520cf57 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -503,7 +503,7 @@ workflow CHIPSEQ { MACS2_CONSENSUS ( ch_antibody_peaks ) - ch_macs2_consensus_bed_lib = MACS2_CONSENSUS_LIB.out.bed + ch_macs2_consensus_bed_lib = MACS2_CONSENSUS.out.bed ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { From fa733cca012ac938bb2da5d4441f52f1b786d13d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 21 Jul 2022 22:36:39 +0200 Subject: [PATCH 458/538] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 953213af5..a9b1b4616 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter - [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. - [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing. +- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` {local module and use `ext.when` instead. +- Remove `deseq2` differential binding analysis of consensus peaks. ### Parameters From 8a5f546badd0e809806c903efc7af7dc4f78ce7f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Jul 2022 11:14:01 +0200 Subject: [PATCH 459/538] Fix path to igv files --- workflows/chipseq.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 87520cf57..b18b425bc 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -562,11 +562,11 @@ workflow CHIPSEQ { UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), ch_macs2_peaks.collect{it[1]}.ifEmpty([]), ch_macs2_consensus_bed_lib.collect{it[1]}.ifEmpty([]), - "bwa/mergedLibrary/bigwig", - { ["bwa/mergedLibrary/macs2", + { "${params.aligner}/mergedLibrary/bigwig" }, + { ["${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, - { ["bwa/mergedLibrary/macs2", + { ["${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') } ) From ea4b0cf6b88c887b98557b8270c6d5146b29aa00 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 25 Jul 2022 13:21:37 +0200 Subject: [PATCH 460/538] Fix consensus peaks path for IGV --- workflows/chipseq.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index b18b425bc..9da18df13 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -567,7 +567,9 @@ workflow CHIPSEQ { params.narrow_peak? '/narrowPeak' : '/broadPeak' ].join('') }, { ["${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus', + "/${meta.id}" ].join('') } ) ch_versions = ch_versions.mix(IGV.out.versions) From 190939e985fe62ab9451aa72f75dc2afb6352eeb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Jul 2022 12:02:52 +0200 Subject: [PATCH 461/538] Fix consensus peaks path for IGV --- conf/modules.config | 10 +++------- workflows/chipseq.nf | 3 +-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 36dbe73ec..d16f49edf 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -616,8 +616,7 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus', - "/${meta.id}" + '/consensus' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -630,8 +629,7 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus', - "/${meta.id}" + '/consensus' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -648,8 +646,7 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus', - "/${meta.id}" + '/consensus' ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -673,7 +670,6 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', - "/${meta.id}", '/deseq2' ].join('') }, mode: params.publish_dir_mode, diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 9da18df13..ad47283d4 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -568,8 +568,7 @@ workflow CHIPSEQ { ].join('') }, { ["${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus', - "/${meta.id}" + '/consensus' ].join('') } ) ch_versions = ch_versions.mix(IGV.out.versions) From f3f3a70581cd230f5dc87e20ab48daa9b4bc3828 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Jul 2022 12:28:08 +0200 Subject: [PATCH 462/538] Switch --preset chip by its argument to not include the removal of duplicates --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d16f49edf..42806a6d7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -253,7 +253,7 @@ if (params.aligner == 'chromap') { ] } withName: CHROMAP_CHROMAP { - ext.args = '--preset chip --SAM' + ext.args = '-l 2000 --low-mem --SAM' ext.prefix = { "${meta.id}.Lb" } publishDir = [ path: { "${params.outdir}/${params.aligner}/library" }, From 61ecb07ade32043ebd00018390898abc6cc67acf Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 27 Jul 2022 14:38:22 +0200 Subject: [PATCH 463/538] Add chromap back to ci tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a040e5c3..d968b6343 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,7 +76,7 @@ jobs: matrix: aligner: - "bowtie2" - # - "chromap" + - "chromap" - "star" steps: - name: Check out pipeline code From 4a191aba9cf8d012d927df552adadbaebb8bc9b8 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 29 Jul 2022 16:09:01 +0200 Subject: [PATCH 464/538] Suggested fix for macs --- conf/modules.config | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 42806a6d7..ea54ccf19 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -520,10 +520,11 @@ process { withName: 'MACS2_CALLPEAK' { ext.args = [ '--keep-dup all', - params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", - params.save_macs_pileup ? '--bdg --SPMR' : '', - params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '', - params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '' + params.narrow_peak ? '' : "--broad --broad-cutoff ${params.broad_cutoff}", + params.save_macs_pileup ? '--bdg --SPMR' : '', + params.macs_fdr ? "--qvalue ${params.macs_fdr}" : '', + params.macs_pvalue ? "--pvalue ${params.macs_pvalue}" : '', + params.aligner == "chromap" ? "--format BAM" : '' ].join(' ').trim() publishDir = [ path: { [ From f5e46f647d12361555f68ace9b098f4b99835637 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 2 Aug 2022 18:12:42 +0200 Subject: [PATCH 465/538] Filter paired end data when using chromap --- workflows/chipseq.nf | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index ad47283d4..f9dc2853c 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -206,7 +206,35 @@ workflow CHIPSEQ { PREPARE_GENOME.out.chromap_index, PREPARE_GENOME.out.fasta ) - ch_genome_bam = ALIGN_CHROMAP.out.bam + + // Filter out paired-end reads until the issue below is fixed + // https://github.com/nf-core/chipseq/issues/291 + // ch_genome_bam = ALIGN_CHROMAP.out.bam + ALIGN_CHROMAP + .out + .bam + .branch { + meta, bam -> + single_end: meta.single_end + return [ meta, bam ] + paired_end: !meta.single_end + return [ meta, bam ] + }.set { ch_genome_bam_chromap } + + ch_genome_bam_chromap.paired_end + .collect() + .map { it -> + def count = it.size() + if (count > 0) { + log.warn "=============================================================================\n" + + " Paired-end files produced by chromap can not be used by some downstream tools due the issue below:\n" + + " https://github.com/nf-core/chipseq/issues/291\n" + + " They will be excluded from the analysis. Consider to use a different aligner\n" + + "===================================================================================" + } + } + + ch_genome_bam = ch_genome_bam_chromap.single_end ch_genome_bam_index = ALIGN_CHROMAP.out.bai ch_samtools_stats = ALIGN_CHROMAP.out.stats ch_samtools_flagstat = ALIGN_CHROMAP.out.flagstat From f57d8da964aab4c24d8153dd63fec9a40975c878 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 3 Aug 2022 16:18:52 +0200 Subject: [PATCH 466/538] Fix indexes publication --- conf/modules.config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index ea54ccf19..f1383590b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -54,9 +54,15 @@ process { withName: 'UNTAR_.*' { ext.args2 = '--no-same-owner' + publishDir = [ + path: { "${params.outdir}/genome/index" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + enabled: params.save_reference + ] } - withName: 'UNTAR_.*|BWA_INDEX|BOWTIE2_BUILD|STAR_GENOMEGENERATE' { + withName: 'BWA_INDEX|BOWTIE2_BUILD|STAR_GENOMEGENERATE' { publishDir = [ path: { "${params.outdir}/genome/index" }, mode: params.publish_dir_mode, From 17aac1dbad5d66a79a3c2cb5be4cfdeac6fc23eb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 3 Aug 2022 17:24:55 +0200 Subject: [PATCH 467/538] Change deeptools by deepTools (results dir) --- conf/modules.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f1383590b..7eb7ede2c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -472,7 +472,7 @@ if (!params.skip_plot_profile) { ext.args = 'scale-regions --regionBodyLength 1000 --beforeRegionStartLength 3000 --afterRegionStartLength 3000 --skipZeros --smartLabels' ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deepTools/plotProfile" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -481,7 +481,7 @@ if (!params.skip_plot_profile) { withName: 'DEEPTOOLS_PLOTPROFILE' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deepTools/plotProfile" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -490,7 +490,7 @@ if (!params.skip_plot_profile) { withName: 'DEEPTOOLS_PLOTHEATMAP' { ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotProfile" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deepTools/plotProfile" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -514,7 +514,7 @@ if (!params.skip_plot_fingerprint) { ].join(' ').trim() } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ - path: { "${params.outdir}/${params.aligner}/mergedLibrary/deeptools/plotFingerprint" }, + path: { "${params.outdir}/${params.aligner}/mergedLibrary/deepTools/plotFingerprint" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From a28cd2872bad8941461c73aebefa0d054939acb1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 3 Aug 2022 23:43:54 +0200 Subject: [PATCH 468/538] Add annotate_boolean_peaks process --- conf/modules.config | 12 +++++++++++ modules/local/annotate_boolean_peaks.nf | 28 +++++++++++++++++++++++++ workflows/chipseq.nf | 10 +++++---- 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 modules/local/annotate_boolean_peaks.nf diff --git a/conf/modules.config b/conf/modules.config index 7eb7ede2c..3de687a1f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -581,6 +581,18 @@ if (!params.skip_peak_annotation) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + + withName: 'ANNOTATE_BOOLEAN_PEAKS' { + ext.prefix = { "${meta.id}_peaks" } + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } if (!params.skip_peak_qc) { diff --git a/modules/local/annotate_boolean_peaks.nf b/modules/local/annotate_boolean_peaks.nf new file mode 100644 index 000000000..ba25e7ae9 --- /dev/null +++ b/modules/local/annotate_boolean_peaks.nf @@ -0,0 +1,28 @@ +process ANNOTATE_BOOLEAN_PEAKS { + + label 'process_low' + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" + + input: + tuple val(meta), path(boolean_txt), path(homer_peaks) + + output: + path '*.csv' , emit: csv + path "versions.yml", emit: versions + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + cut -f2- ${homer_peaks} | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt + paste $boolean_txt tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index f9dc2853c..658a8b944 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -68,6 +68,7 @@ include { FRIP_SCORE } from '../modules/local/frip_scor include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc' include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks' include { MACS2_CONSENSUS } from '../modules/local/macs2_consensus' +include { ANNOTATE_BOOLEAN_PEAKS } from '../modules/local/annotate_boolean_peaks' include { DESEQ2_QC } from '../modules/local/deseq2_qc' include { IGV } from '../modules/local/igv' include { MULTIQC } from '../modules/local/multiqc' @@ -541,8 +542,11 @@ workflow CHIPSEQ { PREPARE_GENOME.out.gtf ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) - // cut -f2- ${prefix}.annotatePeaks.txt | awk 'NR==1; NR > 1 {print \$0 | "sort -T '.' -k1,1 -k2,2n"}' | cut -f6- > tmp.txt - // paste $bool tmp.txt > ${prefix}.boolean.annotatePeaks.txt + + ANNOTATE_BOOLEAN_PEAKS ( + MACS2_CONSENSUS.out.boolean_txt.join(HOMER_ANNOTATEPEAKS_CONSENSUS.out.txt, by: [0]), + ) + ch_versions = ch_versions.mix(ANNOTATE_BOOLEAN_PEAKS.out.versions) } // Create channel: [ val(meta), ip_bam ] @@ -602,8 +606,6 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(IGV.out.versions) } - - // // MODULE: Pipeline reporting // From 53f2673b7d9de2dac7b86d9412f90b4f4b67e0e1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 10:21:27 +0200 Subject: [PATCH 469/538] Emit output of annotate_boolean_peaks --- modules/local/annotate_boolean_peaks.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/annotate_boolean_peaks.nf b/modules/local/annotate_boolean_peaks.nf index ba25e7ae9..8d45fe92f 100644 --- a/modules/local/annotate_boolean_peaks.nf +++ b/modules/local/annotate_boolean_peaks.nf @@ -11,8 +11,8 @@ process ANNOTATE_BOOLEAN_PEAKS { tuple val(meta), path(boolean_txt), path(homer_peaks) output: - path '*.csv' , emit: csv - path "versions.yml", emit: versions + path '*.boolean.annotatePeaks.txt', emit: annotate_peaks_txt + path "versions.yml" , emit: versions script: def prefix = task.ext.prefix ?: "${meta.id}" From 0bcdb8482c0358544b730e7041910a0a6cadf31e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 11:26:04 +0200 Subject: [PATCH 470/538] Fix publish folder for annotate_boolean_peaks --- conf/modules.config | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3de687a1f..8e0b8245e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -587,11 +587,13 @@ if (!params.skip_peak_annotation) { publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + } } From b627caa96d6522dc5045f78bff5feb6159afd623 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 15:25:44 +0200 Subject: [PATCH 471/538] Emit rds file form deseq2 --- modules/local/deseq2_qc.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index acc4d595d..bdf5535af 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -15,6 +15,7 @@ process DESEQ2_QC { output: path "*.pdf" , optional:true, emit: pdf path "*.RData" , optional:true, emit: rdata + path "*.rds" , optional:true, emit: rds path "*pca.vals.txt" , optional:true, emit: pca_txt path "*pca.vals_mqc.tsv" , optional:true, emit: pca_multiqc path "*sample.dists.txt" , optional:true, emit: dists_txt From 2aff26ab6492f1bb321a830639201a40abdf2e9b Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 15:53:07 +0200 Subject: [PATCH 472/538] Update docs --- docs/output.md | 38 +++++++++++++++++++++++++------------- docs/usage.md | 8 ++++---- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/docs/output.md b/docs/output.md index 8074696c6..6fde66dec 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,7 +2,13 @@ ## Introduction -This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report generated from the [full-sized test dataset](https://github.com/nf-core/test-datasets/tree/chipseq#full-test-dataset-origin) for the pipeline using a command similar to the one below: + +```console +nextflow run nf-core/chipseq -profile test_full, +``` + +The directories listed below will be created in the output directory after the pipeline has finished. All paths are relative to the top-level results directory. ## Pipeline overview @@ -10,8 +16,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/). See [`main REA See [Illumina website](https://emea.illumina.com/techniques/sequencing/dna-sequencing/chip-seq.html) for more information regarding the ChIP-seq protocol, and for an extensive list of publications. -The directories listed below will be created in the output directory after the pipeline has finished. All paths are relative to the top-level results directory. - ## Library-level analysis The initial QC and alignments are performed at the library-level e.g. if the same library has been sequenced more than once to increase sequencing depth. This has the advantage of being able to assess each library individually, and the ability to process multiple libraries from the same sample in parallel. @@ -70,6 +74,8 @@ Adapter-trimmed reads are mapped to the reference assembly using the aligner set ![MultiQC - SAMtools stats plot](images/mqc_samtools_stats_plot.png) +> **NB:** Currently, paired-end files produced by `Chromap` are excluded from downstream analysis due to [this](https://github.com/nf-core/chipseq/issues/291) issue. Single-end files are processed normally. + #### Unmapped reads The `--save_unaligned` parameter enables to obtain FastQ files containing unmapped reads (only available for STAR and Bowtie2). @@ -116,7 +122,7 @@ The library-level alignments associated with the same sample are merged and subs
-[Picard MergeSamFiles and MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html) are used in combination to merge the alignments, and for the marking of duplicates, respectively. If you only have one library for any given replicate then the merging step isnt carried out because the library-level and merged library-level BAM files will be exactly the same. +[Picard MergeSamFiles and MarkDuplicates](https://broadinstitute.github.io/picard/command-line-overview.html) are used in combination to merge the alignments, and for the marking of duplicates, respectively. If you only have one library for any given replicate then the merging step is not carried out because the library-level and merged library-level BAM files will be exactly the same. ![MultiQC - Picard deduplication stats plot](images/mqc_picard_deduplication_plot.png) @@ -184,15 +190,15 @@ The results from deepTools plotProfile gives you a quick visualisation for the g - `*.xls`, `*.broadPeak` or `*.narrowPeak`, `*.gappedPeak`, `*summits.bed`: MACS2 output files - the files generated will depend on whether MACS2 has been run in _narrowPeak_ or _broadPeak_ mode. - `*.annotatePeaks.txt`: HOMER peak-to-gene annotation file. - `/mergedLibrary/macs2//qc/` - - `macs_peak.plots.pdf`: QC plots for MACS2 peaks. - - `macs_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. - - `*.FRiP_mqc.tsv`, `*.count_mqc.tsv`, `macs_annotatePeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. + - `macs2_peak.plots.pdf`: QC plots for MACS2 peaks. + - `macs2_annotatePeaks.plots.pdf`: QC plots for peak-to-gene feature annotation. + - `*.FRiP_mqc.tsv`, `*.peak_count_mqc.tsv`, `annotatepeaks.summary_mqc.tsv`: MultiQC custom-content files for FRiP score, peak count and peak-to-gene ratios. > **NB:** `` in the directory structure above corresponds to the type of peak that you have specified to call with MACS2 i.e. `broadPeak` or `narrowPeak`. If you so wish, you can call both narrow and broad peaks without redoing the preceding steps in the pipeline such as the alignment and filtering. For example, if you already have broad peaks then just add `--narrow_peak -resume` to the command you used to run the pipeline, and these will be called too! However, resuming the pipeline will only be possible if you have not deleted the `work/` directory generated by the pipeline.
-[MACS2](https://github.com/taoliu/MACS) is one of the most popular peak-calling algorithms for ChIP-seq data. By default, the peaks are called with the MACS2 `--broad` parameter. If, however, you would like to call narrow peaks then please provide the `--narrow_peak` parameter when running the pipeline. See [MACS2 outputs](https://github.com/taoliu/MACS#output-files) for a description of the output files generated by MACS2. +[MACS2](https://github.com/macs3-project/MACS) is one of the most popular peak-calling algorithms for ChIP-seq data. By default, the peaks are called with the MACS2 `--broad` parameter. If, however, you would like to call narrow peaks then please provide the `--narrow_peak` parameter when running the pipeline. See [MACS2 outputs](https://github.com/macs3-project/MACS/blob/master/docs/callpeak.md#output-files) for a description of the output files generated by MACS2. ![MultiQC - MACS2 total peak count plot](images/mqc_macs2_peak_count_plot.png) @@ -209,7 +215,7 @@ Various QC plots per sample including number of peaks, fold-change distribution,
Output files -- `/mergedLibrary/macs2//consensus/` +- `/mergedLibrary/macs2//consensus` - `*.bed`: Consensus peak-set across all samples in BED format. - `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. @@ -237,19 +243,25 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -- `/mergedLibrary/macs2//consensus//deseq2/` +- `/mergedLibrary/macs2//consensus/deseq2/` - `*.sample.dists.txt`: Spreadsheet containing sample-to-sample distance across each consensus peak. - `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - - `*.dds.rld.RData`: File containing R `dds` and `rld` objects generated by DESeq2. + - `*.dds.RData`: File containing R `DESeqDataSet` object generated by DESeq2, with either + an rlog or vst `assay` storing the variance-stabilised data. + - `*.rds`: Alternative version of the RData file suitable for + `readRDS` to give user control of the eventual object name. + - `*pca.vals.txt`: Matrix of values for the first 2 principal components. - `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. - - `/mergedLibrary/macs2//consensus//sizeFactors/` + - `/mergedLibrary/macs2//consensus/deseq2/sizeFactors/` - `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
[DESeq2](https://bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html) is more commonly used to perform differential expression analysis for RNA-seq datasets. However, it can also be used for ChIP-seq differential binding analysis, in which case you can imagine that instead of counts per gene for RNA-seq data we now have counts per bound region. -This pipeline uses a standardised DESeq2 analysis script to get an idea of the reproducibility within the experiment, and to assess the overall differential binding. Please note that this will not suit every experimental design, and if there are other problems with the experiment then it may not work as well as expected. For larger experiments, it may be recommended to use the `vst` transformation instead of the default `rlog` option. You can do this by providing the `--deseq2_vst` parameter to the pipeline. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. +**This pipeline uses a standardised DESeq2 analysis script to get an idea of the reproducibility within the experiment, and to assess the overall differential binding. Please note that this will not suit every experimental design, and if there are other problems with the experiment then it may not work as well as expected.** + +For larger experiments, it may be recommended to use the `vst` transformation instead of the default `rlog` option. You can do this by providing the `--deseq2_vst` parameter to the pipeline. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. ![MultiQC - DESeq2 PCA plot](images/mqc_deseq2_pca_plot.png) diff --git a/docs/usage.md b/docs/usage.md index 971a3c897..73ee535f4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -16,7 +16,7 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will perform the alignments in parallel, and subsequently merge them before further analysis. Below is an example where the samples called `WT_BCATENIN_IP_REP2` and `WT_INPUT_REP2` have been re-sequenced multiple times: -```bash +```console sample,fastq_1,fastq_2,antibody,control WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT @@ -33,13 +33,13 @@ WT_INPUT_REP3,BLA203A31_S21_L003_R1_001.fastq.gz,,, The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 5 columns to match those defined in the table below. -The `antibody` column is required to separate the downstream consensus peak merging and differential analysis for different antibodies. Its not advisable to generate a consensus peak set across different antibodies especially if their binding patterns are inherently different e.g. narrow transcription factors and broad histone marks. +The `antibody` column is required to separate the downstream consensus peak merging for different antibodies. Its not advisable to generate a consensus peak set across different antibodies especially if their binding patterns are inherently different e.g. narrow transcription factors and broad histone marks. The `control` column should be the `sample` identifier for the controls for any given IP. A final design file may look something like the one below. This is for two antibodies and associated controls, where the `WT_BCATENIN_IP_REP2` and `NAIVE_BCATENIN_IP_REP2` samples have been sequenced twice: -```bash +```console sample,fastq_1,fastq_2,antibody,control WT_BCATENIN_IP_REP1,BLA203A1_S27_L006_R1_001.fastq.gz,,BCATENIN,WT_INPUT WT_BCATENIN_IP_REP2,BLA203A25_S16_L001_R1_001.fastq.gz,,BCATENIN,WT_INPUT @@ -143,7 +143,7 @@ nextflow pull nf-core/chipseq It is a good idea to specify a pipeline version when running the pipeline on your data. This ensures that a specific version of the pipeline code and software are used when you run your pipeline. If you keep using the same tag, you'll be running the same version of the pipeline, even if there have been changes to the code since. -First, go to the [nf-core/chipseq releases page](https://github.com/nf-core/chipseq/releases) and find the latest version number - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. +First, go to the [nf-core/chipseq releases page](https://github.com/nf-core/chipseq/releases) and find the latest version number - numeric only (eg. `1.2.2`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.2.2`. This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. From f845951c66bc28f8174921b691d8e42e391b608a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 15:53:19 +0200 Subject: [PATCH 473/538] Update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9b1b4616..3184c3755 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,9 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter - [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. - [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing. -- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` {local module and use `ext.when` instead. +- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead). - Remove `deseq2` differential binding analysis of consensus peaks. - +- Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue. +- Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time). ### Parameters | Old parameter | New parameter | From e309bc1170ad6a92ca2a4c73ecd673db95e2a773 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 15:54:06 +0200 Subject: [PATCH 474/538] Fix indents --- conf/modules.config | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8e0b8245e..9f65d6af7 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -536,7 +536,7 @@ process { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -549,7 +549,7 @@ process { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' - ].join('') }, + ].join('') }, enabled: false ] } @@ -576,7 +576,7 @@ if (!params.skip_peak_annotation) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -619,7 +619,7 @@ if (!params.skip_peak_annotation) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/qc' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -638,7 +638,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -651,7 +651,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -668,7 +668,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -692,7 +692,7 @@ if (!params.skip_consensus_peaks) { params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', '/deseq2' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -708,7 +708,7 @@ if (!params.skip_igv) { path: { [ "${params.outdir}/igv", params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -722,9 +722,9 @@ if (!params.skip_multiqc) { ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' publishDir = [ path: { [ - "${params.outdir}/multiqc", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, + "${params.outdir}/multiqc", + params.narrow_peak? '/narrowPeak' : '/broadPeak' + ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From c31fb69d014456e6be50f30d2ad6817d24fb0c01 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 16:06:32 +0200 Subject: [PATCH 475/538] Make prettier happy --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3184c3755..bbec57434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove `deseq2` differential binding analysis of consensus peaks. - Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue. - Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time). + ### Parameters | Old parameter | New parameter | From 9c5c5ff0335abe4cd63440277fa254a621ce474d Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 16:54:55 +0200 Subject: [PATCH 476/538] Update changelog --- CHANGELOG.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbec57434..b50bf7be5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [1.2.2] - 2022-08-22 ### Enhancements & fixes +- Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) +- All software containers are now exclusively obtained from [Biocontainers](https://biocontainers.pro/#/registry) - Updated pipeline template to [nf-core/tools 2.4.1](https://github.com/nf-core/tools/releases/tag/2.4.1) - [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error @@ -20,11 +22,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[228](https://github.com/nf-core/chipseq/issues/228)] - Update blacklist bed files. - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter - [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. -- [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing. -- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead). +- [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing +- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead) - Remove `deseq2` differential binding analysis of consensus peaks. -- Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue. -- Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time). +- Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue +- Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) ### Parameters From fd59088a9640c7b25182fa7357c5e6b442152b7c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 4 Aug 2022 17:45:24 +0200 Subject: [PATCH 477/538] Update readme and usage --- README.md | 18 ++++++++++-------- docs/usage.md | 10 +++++----- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 91c27e231..c2fa0a60a 100644 --- a/README.md +++ b/README.md @@ -27,14 +27,18 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Raw read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 2. Adapter trimming ([`Trim Galore!`](https://www.bioinformatics.babraham.ac.uk/projects/trim_galore/)) -3. Alignment ([`BWA`](https://sourceforge.net/projects/bio-bwa/files/)) +3. Choice of multiple aligners + 1.([`BWA`](https://sourceforge.net/projects/bio-bwa/files/)) + 2.([`Chromap`](https://github.com/haowenz/chromap)). **For paired-end reads only working until mapping steps, see [here](https://github.com/nf-core/chipseq/issues/291)** + 3.([`Bowtie2`](http://bowtie-bio.sourceforge.net/bowtie2/index.shtml)) + 4.([`STAR`](https://github.com/alexdobin/STAR)) 4. Mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) 5. Merge alignments from multiple libraries of the same sample ([`picard`](https://broadinstitute.github.io/picard/)) 1. Re-mark duplicates ([`picard`](https://broadinstitute.github.io/picard/)) 2. Filtering to remove: - reads mapping to blacklisted regions ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/), [`BEDTools`](https://github.com/arq5x/bedtools2/)) - reads that are marked as duplicates ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - - reads that arent marked as primary alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) + - reads that are not marked as primary alignments ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - reads that are unmapped ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - reads that map to multiple locations ([`SAMtools`](https://sourceforge.net/projects/samtools/files/samtools/)) - reads containing > 4 mismatches ([`BAMTools`](https://github.com/pezmaster31/bamtools)) @@ -47,11 +51,11 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 5. Generate gene-body meta-profile from bigWig files ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotProfile.html)) 6. Calculate genome-wide IP enrichment relative to control ([`deepTools`](https://deeptools.readthedocs.io/en/develop/content/tools/plotFingerprint.html)) 7. Calculate strand cross-correlation peak and ChIP-seq quality measures including NSC and RSC ([`phantompeakqualtools`](https://github.com/kundajelab/phantompeakqualtools)) - 8. Call broad/narrow peaks ([`MACS2`](https://github.com/taoliu/MACS)) + 8. Call broad/narrow peaks ([`MACS2`](https://github.com/macs3-project/MACS)) 9. Annotate peaks relative to gene features ([`HOMER`](http://homer.ucsd.edu/homer/download.html)) 10. Create consensus peakset across all samples and create tabular file to aid in the filtering of the data ([`BEDTools`](https://github.com/arq5x/bedtools2/)) 11. Count reads in consensus peaks ([`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) - 12. Differential binding analysis, PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) + 12. PCA and clustering ([`R`](https://www.r-project.org/), [`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) 6. Create IGV session file containing bigWig tracks, peaks and differential sites for data visualisation ([`IGV`](https://software.broadinstitute.org/software/igv/)). 7. Present QC for raw read, alignment, peak-calling and differential binding results ([`MultiQC`](http://multiqc.info/), [`R`](https://www.r-project.org/)) @@ -63,7 +67,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console + ```bash nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir ``` @@ -76,9 +80,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 4. Start running your own analysis! - - - ```console + ```bash nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile ``` diff --git a/docs/usage.md b/docs/usage.md index 73ee535f4..a0644ffef 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,7 +8,7 @@ You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 5 columns, and a header row as shown in the examples below. -```console +```bash --input '[path to samplesheet file]' ``` @@ -116,7 +116,7 @@ wget -L https://www.encodeproject.org/files/ENCFF356LFX/@@download/ENCFF356LFX.b The typical command for running the pipeline is as follows: -```console +```bash nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` @@ -124,7 +124,7 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: -```console +```bash work # Directory containing the nextflow working files # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow @@ -135,7 +135,7 @@ work # Directory containing the nextflow working files When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```console +```bash nextflow pull nf-core/chipseq ``` @@ -310,6 +310,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```console +```bash NXF_OPTS='-Xms1g -Xmx4g' ``` From 1b9192997a55f297ea8250b80b9d2a318d5b39d6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 5 Aug 2022 14:58:50 +0200 Subject: [PATCH 478/538] Add bytesize talk to readme --- CHANGELOG.md | 2 +- README.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b50bf7be5..83d5a2734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove `deseq2` differential binding analysis of consensus peaks. - Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue - Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) - +- Add bytesize link to readme. ### Parameters | Old parameter | New parameter | diff --git a/README.md b/README.md index c2fa0a60a..7078c2835 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,12 @@ On release, automated continuous integration tests run the pipeline on a [full-s The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! +## Online videos + +A short talk about the history, current status and functionality on offer in this pipeline was given by Jose Espinosa-Carrasco ([@joseespinosa](https://github.com/joseespinosa)) on [26th July 2022](https://nf-co.re/events/2022/bytesize-chipseq) as part of the nf-core/bytesize series. + +You can find numerous talks on the [nf-core events page](https://nf-co.re/events) from various topics including writing pipelines/modules in Nextflow DSL2, using nf-core tooling, running nf-core pipelines as well as more generic content like contributing to Github. Please check them out! + ## Pipeline summary 1. Raw read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) From b87af07ded8b119a4d3c65085bb5d9abc570371f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 5 Aug 2022 15:06:28 +0200 Subject: [PATCH 479/538] Make prettier happy --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83d5a2734..deeef1fe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue - Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) - Add bytesize link to readme. + ### Parameters | Old parameter | New parameter | From 18b8df8e6b3596e82c759312edd2903fbf00e0d9 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 10 Aug 2022 08:27:52 +0200 Subject: [PATCH 480/538] Bump pipeline version to 2.0.0 --- CHANGELOG.md | 4 ++-- nextflow.config | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index deeef1fe4..9421f2301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.2] - 2022-08-22 +## [2.0.0] - 2022-08-11 ### Enhancements & fixes @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing - Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead) - Remove `deseq2` differential binding analysis of consensus peaks. -- Filter paired-end files produced by `chromap` due to [this](https://github.com/nf-core/chipseq/issues/291) issue +- [[280](https://github.com/nf-core/chipseq/issues/291) - Filter paired-end files produced by `chromap` since the resulting `BAM` files can not be processed downstream. - Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) - Add bytesize link to readme. diff --git a/nextflow.config b/nextflow.config index 6e0603d5b..168e90eab 100644 --- a/nextflow.config +++ b/nextflow.config @@ -218,7 +218,7 @@ manifest { description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.3.0dev' + version = '2.0.0' } // Load modules.config for DSL2 module specific options From f1894d1e6aa18ea72a42dcb53c42b8ea985926ac Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 10 Aug 2022 11:54:53 +0200 Subject: [PATCH 481/538] Bump multiqc version to 1.13a --- CHANGELOG.md | 2 +- modules/local/multiqc.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9421f2301..228444dfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,7 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi | `deeptools` | 3.4.3 | 3.5.1 | | `pigz` | 2.3.4 | 2.6 | | `preseq` | 2.0.3 | 3.1.2 | -| `multiqc` | 1.9 | 1.12 | +| `multiqc` | 1.9 | 1.13a | | `r-base` | 3.6.1 | 4.0.3 | | `r-ggplot2` | 3.3.2 | 3.3.3 | | `bioconductor-deseq2` | 1.26.0 | 1.28.0 | diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 4d6fe9f53..9d57e22c4 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + conda (params.enable_conda ? "bioconda::multiqc=1.13a" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.10.1--pyhdfd78af_1': - 'quay.io/biocontainers/multiqc:1.10.1--pyhdfd78af_1' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.13a--pyhdfd78af_1': + 'quay.io/biocontainers/multiqc:1.13a--pyhdfd78af_1' }" input: path multiqc_config From e84f6c517205be4e40b767f19e1e882d8c28e36f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 10 Aug 2022 13:25:27 +0200 Subject: [PATCH 482/538] Add chromap to aws full test --- .github/workflows/awsfulltest.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 43c359a75..5a1c3622d 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,8 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # aligner: ["bwa", "bowtie2", "chromap", "star"] //TODO uncomment when chromap implemented - aligner: ["bwa", "bowtie2", "star"] + aligner: ["bwa", "bowtie2", "chromap", "star"] steps: - name: Launch workflow via tower uses: nf-core/tower-action@v3 From 04459640210e641bf504a161c7f1a09a678109bb Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 10 Aug 2022 15:17:50 +0200 Subject: [PATCH 483/538] Remove duplicated item in version table and fix version --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 228444dfa..e2bb7412b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,8 +52,7 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi | Dependency | Old version | New version | | ----------------------- | ----------- | ----------- | | `samtools` | 1.10 | 1.15.1 | -| `picard` | 2.23.1 | 2.26.10 | -| `picard` | 2.23.1 | 2.26.10 | +| `picard` | 2.23.1 | 2.27.4 | | `bamtools` | 2.5.1 | 2.5.2 | | `pysam` | 0.15.3 | 0.19.0 | | `bedtools` | 2.29.2 | 2.30.0 | From 6601012f0d022164e66379bd1d652580a989f406 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 10 Aug 2022 15:38:12 +0200 Subject: [PATCH 484/538] Add trimgalore new version to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2bb7412b..14e99be91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ Note, since the pipeline is now using Nextflow DSL2, each process will be run wi | `r-base` | 3.6.1 | 4.0.3 | | `r-ggplot2` | 3.3.2 | 3.3.3 | | `bioconductor-deseq2` | 1.26.0 | 1.28.0 | +| `trim-galore` | 0.6.5 | 0.6.7 | | `r-optparse` | - | 1.7.1 | | `chromap` | - | 0.2.1 | | `bowtie2` | - | 2.4.4 | From 2344f276ab3ba5b6cc45ac49b493330b45269ee1 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 12 Aug 2022 12:27:35 +0200 Subject: [PATCH 485/538] Move ANNOTATE_BOOLEAN_PEAKS under skip_peak_annotation --- conf/modules.config | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9f65d6af7..7acf69e2f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -581,20 +581,6 @@ if (!params.skip_peak_annotation) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: 'ANNOTATE_BOOLEAN_PEAKS' { - ext.prefix = { "${meta.id}_peaks" } - publishDir = [ - path: { [ - "${params.outdir}/${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' - ].join('') }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - - } } if (!params.skip_peak_qc) { @@ -673,6 +659,18 @@ if (!params.skip_consensus_peaks) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: 'ANNOTATE_BOOLEAN_PEAKS' { + ext.prefix = { "${meta.id}_peaks" } + publishDir = [ + path: { [ + "${params.outdir}/${params.aligner}/mergedLibrary/macs2", + params.narrow_peak? '/narrowPeak' : '/broadPeak', + '/consensus' + ].join('') }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } } From b61074c51d52aa0ce03aaf4e87bdec03adc5d024 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 12 Aug 2022 13:10:09 +0200 Subject: [PATCH 486/538] Update parameters table --- CHANGELOG.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14e99be91..8b2f3ae66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,15 +31,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters -| Old parameter | New parameter | -| ---------------------- | ------------------ | -| `--clusterOptions` | | -| `--conda` | `--enable_conda` | -| | `--skip_qc` | -| | `--aligner` | -| | `--save_unaligned` | -| `--skip_diff_analysis` | `--skip_deseq2_qc` | -| | `--read_length` | +| Old parameter | New parameter | +| ---------------------- | ----------------------- | +| `--conda` | `--enable_conda` | +| `--skip_diff_analysis` | `--skip_deseq2_qc` | +| | `--skip_qc` | +| | `--aligner` | +| | `--save_unaligned` | +| | `--read_length` | +| | `--multiqc_title` | +| | `--gff` | +| | `--bowtie2_index` | +| | `--chromap_index` | +| | `--star_index` | +| | `--validate_params` | +| | `--show_hidden_params` | +| | `--config_profile_name` | +| `--clusterOptions` | | +| `--single_end` | | +| `--name` | | +| `--hostnames` | | + > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. From 318e0605b9cfe103d62e97fa53a82cdb76d79c3e Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 12 Aug 2022 13:12:08 +0200 Subject: [PATCH 487/538] Make prettier happy --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b2f3ae66..ad159051c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `--name` | | | `--hostnames` | | - > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. > **NB:** Parameter has been **removed** if parameter information isn't present. From 67a9cdc6cdbebdd7ff75362232094e7294b15a75 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 15 Aug 2022 11:34:16 +0100 Subject: [PATCH 488/538] Fix pipeline logo --- docs/images/nf-core-chipseq_logo_dark.png | Bin 73947 -> 73955 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-chipseq_logo_dark.png b/docs/images/nf-core-chipseq_logo_dark.png index cf22a2e865ba247de7727c84ee2e990aa932803e..9f2b30100fd7ed5870367833ae6567d1dd97f407 100644 GIT binary patch delta 23 fcmcb8kmd0~mJLw}91IK!44y8IA)BKT8V>*fZT<+W delta 14 WcmaESkmdG4mJLw}o0Ae64*&o;s|RTS From d83f76fbfd308d13d88c99530a2ae044c2730958 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 16 Aug 2022 23:21:57 +0200 Subject: [PATCH 489/538] Update .gitignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5124c9ac7..1dcfbdcdc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,5 @@ work/ data/ results/ .DS_Store -testing/ testing* *.pyc From b54cdd53f0d5abe6b6075dc505aa82e64800d615 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 16 Aug 2022 23:22:12 +0200 Subject: [PATCH 490/538] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad159051c..3178bb7e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[#128](https://github.com/nf-core/chipseq/issues/128)] - Filter files with no peaks to avoid errors in downstream processes - [[#220](https://github.com/nf-core/chipseq/issues/220)] - Fix `phantompeakqualtools` protection stack overflow error - [[#233](https://github.com/nf-core/chipseq/issues/233)] - Add `chromap` to the available aligners -- Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - Bump minimum Nextflow version from `21.04.0` -> `21.10.3` - Added `python3` shebang to appropriate scripts in `bin/` directory - [[#160](https://github.com/nf-core/chipseq/issues/160)] - Add `bowtie2` and `star` as available aligners, via the `--aligner` parameter From 63ee901ec97211a77fbd4df2e11b47c1cb42f41d Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 16 Aug 2022 23:25:56 +0200 Subject: [PATCH 491/538] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3178bb7e1..98dd839c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [nf-core/tools#1415](https://github.com/nf-core/tools/issues/1415) - Make `--outdir` a mandatory parameter - [[282](https://github.com/nf-core/chipseq/issues/282)] - Fix `genome.fa` publication for IGV. - [[280](https://github.com/nf-core/chipseq/issues/280)] - Update `macs_gsize` in `igenomes.config`, create a new `--read_length` parameter and implement the logic to calculate `--macs_gsize` when the parameter is missing -- Eliminate `if`s conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead) +- Eliminate `if` conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead) - Remove `deseq2` differential binding analysis of consensus peaks. - [[280](https://github.com/nf-core/chipseq/issues/291) - Filter paired-end files produced by `chromap` since the resulting `BAM` files can not be processed downstream. - Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) From bb103d74e3e6a01e88e349cbbbd2f99e6fd86461 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 16 Aug 2022 23:26:41 +0200 Subject: [PATCH 492/538] Update assets/multiqc/deseq2_clustering_header.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- assets/multiqc/deseq2_clustering_header.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/multiqc/deseq2_clustering_header.txt b/assets/multiqc/deseq2_clustering_header.txt index 3dd28211b..f7bb33d8f 100644 --- a/assets/multiqc/deseq2_clustering_header.txt +++ b/assets/multiqc/deseq2_clustering_header.txt @@ -1,6 +1,6 @@ #id: 'deseq2_clustering' #section_name: 'MERGED LIB: DESeq2 sample similarity' -#description: "is generated from clustering the Euclidean distances between +#description: "Matrix is generated from clustering with Euclidean distances between # DESeq2 # rlog values for each sample # in the deseq2_qc.r script." From a05e1aae9ae020150327068f1e7bed6f30a22a41 Mon Sep 17 00:00:00 2001 From: Jose Espinosa-Carrasco Date: Tue, 16 Aug 2022 23:27:02 +0200 Subject: [PATCH 493/538] Update assets/multiqc/deseq2_pca_header.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- assets/multiqc/deseq2_pca_header.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/multiqc/deseq2_pca_header.txt b/assets/multiqc/deseq2_pca_header.txt index 55b0bbadf..250c1cb77 100644 --- a/assets/multiqc/deseq2_pca_header.txt +++ b/assets/multiqc/deseq2_pca_header.txt @@ -1,6 +1,6 @@ #id: 'deseq2_pca' #section_name: 'MERGED LIB: DESeq2 PCA plot' -#description: "PCA plot between samples in the experiment. +#description: "PCA plot of the samples in the experiment. # These values are calculated using DESeq2 # in the deseq2_qc.r script." #plot_type: 'scatter' From 13f0f3e342b70c4b049fc2123e841368ad4f68ff Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 17 Aug 2022 15:37:42 +0200 Subject: [PATCH 494/538] Update citations as suggested in review --- CITATIONS.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index f432375d4..63188ca80 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -26,6 +26,10 @@ > Langmead, B. and Salzberg, S. L. 2012 Fast gapped-read alignment with Bowtie 2. Nature methods, 9(4), p. 357–359. doi: 10.1038/nmeth.1923. +- [Chromap](https://doi.org/10.1038/s41467-021-26865-w) + + > Zhang H, Song L, Wang X, Cheng H, Wang C, Meyer CA, Liu T, Tang M, Aluru S, Yue F, Liu XS and Li H. Fast alignment and preprocessing of chromatin profiles with Chromap. Nature communications. 2021, 12(1), 1-6. doi: 10.1038/s41467-021-26865-w + - [deepTools](https://www.ncbi.nlm.nih.gov/pubmed/27079975/) > Ramírez F, Ryan DP, Grüning B, Bhardwaj V, Kilpert F, Richter AS, Heyne S, Dündar F, Manke T. deepTools2: a next generation web server for deep-sequencing data analysis. Nucleic Acids Res. 2016 Jul 8;44(W1):W160-5. doi: 10.1093/nar/gkw257. Epub 2016 Apr 13. PubMed PMID: 27079975; PubMed Central PMCID: PMC4987876. @@ -83,10 +87,6 @@ > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. -- [vsn](https://bioconductor.org/packages/release/bioc/html/vsn.html) - - > Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka and Martin Vingron. Variance Stabilization Applied to Microarray Data Calibration and to the Quantification of Differential Expression. Bioinformatics 18, S96-S104 (2002). - - [UpSetR](https://CRAN.R-project.org/package=UpSetR) > Nils Gehlenborg (2017). UpSetR: A More Scalable Alternative to Venn and Euler Diagrams for Visualizing Intersecting Sets. @@ -107,10 +107,6 @@ > Raivo Kolde (2018). pheatmap: Pretty Heatmaps. -- [lattice](https://cran.r-project.org/web/packages/lattice/index.html) - - > Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5. - - [RColorBrewer](https://CRAN.R-project.org/package=RColorBrewer) > Erich Neuwirth (2014). RColorBrewer: ColorBrewer Palettes. @@ -119,9 +115,6 @@ > Trevor L Davis (2018). optparse: Command Line Option Parser. -- [xfun](https://CRAN.R-project.org/package=xfun) - > Yihui Xie (2018). xfun: Miscellaneous Functions by 'Yihui Xie'. - ## Software packaging/containerisation tools - [Anaconda](https://anaconda.com) From 676ea1871a603c9e49fed4d7816ddea82f87824a Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 17 Aug 2022 16:02:01 +0200 Subject: [PATCH 495/538] Fix nf-core lint after accepted suggestion --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1dcfbdcdc..5124c9ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ work/ data/ results/ .DS_Store +testing/ testing* *.pyc From 5239e9860283036e5957d1d33dd0cce32dacc497 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 17 Aug 2022 16:34:01 +0200 Subject: [PATCH 496/538] Remove differential analysis options --- nextflow_schema.json | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index ed9cf2007..6d26d9597 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -323,25 +323,6 @@ } } }, - "deseq_qc_options": { - "title": "Differential analysis options", - "type": "object", - "fa_icon": "fas fa-not-equal", - "description": "Options to adjust differential analysis criteria.", - "properties": { - "deseq2_vst": { - "type": "boolean", - "description": "Use vst transformation instead of rlog with DESeq2.", - "help_text": "See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization).", - "fa_icon": "fas fa-dolly" - }, - "skip_deseq2_qc": { - "type": "boolean", - "fa_icon": "fas fa-fast-forward", - "description": "Skip DESeq2 PCA and heatmap plotting." - } - } - }, "process_skipping_options": { "title": "Process skipping options", "type": "object", @@ -363,6 +344,12 @@ "description": "Skip Preseq.", "fa_icon": "fas fa-fast-forward" }, + "deseq2_vst": { + "type": "boolean", + "description": "Use vst transformation instead of rlog with DESeq2.", + "help_text": "See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization).", + "fa_icon": "fas fa-dolly" + }, "skip_plot_profile": { "type": "boolean", "description": "Skip deepTools plotProfile.", @@ -378,6 +365,11 @@ "description": "Skip Phantompeakqualtools.", "fa_icon": "fas fa-fast-forward" }, + "skip_deseq2_qc": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip DESeq2 PCA and heatmap plotting." + }, "skip_igv": { "type": "boolean", "description": "Skip IGV.", From c31ac79853e71c9e18368f74c72a6c7d5db336cc Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 17 Aug 2022 23:30:31 +0200 Subject: [PATCH 497/538] Remove deseq_qc_options key from schema --- nextflow_schema.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6d26d9597..ea0721e1b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -579,9 +579,6 @@ { "$ref": "#/definitions/peak_calling_options" }, - { - "$ref": "#/definitions/deseq_qc_options" - }, { "$ref": "#/definitions/process_skipping_options" }, From dd105182f5cbca8fa61e2faa1c6f16d7b2855bf6 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Wed, 17 Aug 2022 23:40:56 +0200 Subject: [PATCH 498/538] Remove samplesheet.csv --- assets/samplesheet.csv | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 assets/samplesheet.csv diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv deleted file mode 100644 index 5f653ab7b..000000000 --- a/assets/samplesheet.csv +++ /dev/null @@ -1,3 +0,0 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, From c31c2a934d58f415757e4d6a169b779c967873fd Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 26 Aug 2022 19:34:34 +0200 Subject: [PATCH 499/538] Add deseq and fix homer annotate peaks in multiqc --- modules/local/multiqc.nf | 3 +++ workflows/chipseq.nf | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 9d57e22c4..92824f01d 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -44,6 +44,9 @@ process MULTIQC { path ('featurecounts/*') + path ('deseq2/*') + path ('deseq2/*') + output: path "*multiqc_report.html", emit: report path "*_data" , emit: data diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 658a8b944..d22467392 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -582,6 +582,8 @@ workflow CHIPSEQ { ch_deseq2_pca_header, ch_deseq2_clustering_header ) + ch_deseq2_pca_multiqc = DESEQ2_QC.out.pca_multiqc + ch_deseq2_clustering_multiqc = DESEQ2_QC.out.dists_multiqc } } @@ -654,9 +656,10 @@ workflow CHIPSEQ { ch_custompeaks_frip_multiqc.collect{it[1]}.ifEmpty([]), ch_custompeaks_count_multiqc.collect{it[1]}.ifEmpty([]), - ch_plothomerannotatepeaks_multiqc.collect{it[1]}.ifEmpty([]), - ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([])//, - // path ('macs/consensus/*') from ch_macs_consensus_deseq_mqc.collect().ifEmpty([]) + ch_plothomerannotatepeaks_multiqc.collect().ifEmpty([]), + ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([]), + ch_deseq2_pca_multiqc.collect().ifEmpty([]), + ch_deseq2_clustering_multiqc.collect().ifEmpty([]) ) multiqc_report = MULTIQC.out.report.toList() } From f2eabfd563cb2de8a66bd96a360698ba43bb2e97 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 26 Aug 2022 19:39:22 +0200 Subject: [PATCH 500/538] Fix channel declaration --- workflows/chipseq.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index d22467392..da6a58e6a 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -576,6 +576,8 @@ workflow CHIPSEQ { ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) + ch_deseq2_pca_multiqc = Channel.empty() + ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_deseq2_qc) { DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, From 20a25bfbc8ba491b4273a0b01fe62d941c653d9f Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Fri, 26 Aug 2022 19:52:15 +0200 Subject: [PATCH 501/538] Declare channel before skip to avoid error --- workflows/chipseq.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index da6a58e6a..eedccc5d5 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -506,7 +506,9 @@ workflow CHIPSEQ { // // Consensus peaks analysis // - ch_macs2_consensus_bed_lib = Channel.empty() + ch_macs2_consensus_bed_lib = Channel.empty() + ch_deseq2_pca_multiqc = Channel.empty() + ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_consensus_peaks) { // Create channel: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] @@ -576,8 +578,6 @@ workflow CHIPSEQ { ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) - ch_deseq2_pca_multiqc = Channel.empty() - ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_deseq2_qc) { DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, From 4760fc77fa6bfa6b1429fb1df9cfebb6d87d7695 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Tue, 30 Aug 2022 09:54:45 +0200 Subject: [PATCH 502/538] Fix labels for deeptools plotfingerprint --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 7acf69e2f..47784e03d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -510,7 +510,7 @@ if (!params.skip_plot_fingerprint) { ext.args = { [ '--skipZeros', "--numberOfSamples $params.fingerprint_bins", - "--labels $meta.ip $meta.control" + "--labels $meta.id $meta.control" ].join(' ').trim() } ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ From 3e91dcd324876319a27567413d7f24b4772b0c8b Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 30 Aug 2022 13:31:08 +0000 Subject: [PATCH 503/538] Template update for nf-core/tools version 2.5 --- .editorconfig | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 3 +- .github/workflows/ci.yml | 23 ++----- .github/workflows/linting.yml | 38 ++++++++++-- CHANGELOG.md | 2 +- CITATION.cff | 56 ++++++++++++++++++ README.md | 21 +++---- assets/email_template.txt | 1 - bin/check_samplesheet.py | 41 +++++++------ conf/base.config | 5 ++ docs/images/nf-core-chipseq_logo_dark.png | Bin 73947 -> 73955 bytes docs/usage.md | 12 ++-- lib/WorkflowChipseq.groovy | 5 +- lib/WorkflowMain.groovy | 9 ++- main.nf | 2 +- modules.json | 22 ++++--- .../templates/dumpsoftwareversions.py | 14 +++-- nextflow.config | 23 ++++++- 18 files changed, 186 insertions(+), 93 deletions(-) create mode 100644 CITATION.cff diff --git a/.editorconfig b/.editorconfig index b6b319077..b78de6e65 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js}] +[*.{md,yml,yaml,html,css,scss,js,cff}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9595a3a41..8da27af0e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,8 +15,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0596f36fc..cf99db7f7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: env: NXF_ANSI_LOG: false - CAPSULE_LOG: none jobs: test: @@ -20,27 +19,17 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # Nextflow versions - include: - # Test pipeline minimum Nextflow version - - NXF_VER: "21.10.3" - NXF_EDGE: "" - # Test latest edge release of Nextflow - - NXF_VER: "" - NXF_EDGE: "1" + NXF_VER: + - "21.10.3" + - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow - env: - NXF_VER: ${{ matrix.NXF_VER }} - # Uncomment only if the edge release is more recent than the latest stable release - # See https://github.com/nextflow-io/nextflow/issues/2467 - # NXF_EDGE: ${{ matrix.NXF_EDGE }} - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 + with: + version: "${{ matrix.NXF_VER }}" - name: Run pipeline with test data # TODO nf-core: You can customise CI pipeline run tests as required diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 77358dee7..8a5ce69b8 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -35,6 +35,36 @@ jobs: - name: Run Prettier --check run: prettier --check ${GITHUB_WORKSPACE} + PythonBlack: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Check code lints with Black + uses: psf/black@stable + + # If the above check failed, post a comment on the PR explaining the failure + - name: Post PR comment + if: failure() + uses: mshick/add-pr-comment@v1 + with: + message: | + ## Python linting (`black`) is failing + + To keep the code consistent with lots of contributors, we run automated code consistency checks. + To fix this CI test, please run: + + * Install [`black`](https://black.readthedocs.io/en/stable/): `pip install black` + * Fix formatting errors in your pipeline: `black .` + + Once you push these changes the test should pass, and you can hide this comment :+1: + + We highly recommend setting up Black in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + + Thanks again for your contribution! + repo-token: ${{ secrets.GITHUB_TOKEN }} + allow-repeats: false + nf-core: runs-on: ubuntu-latest steps: @@ -42,15 +72,11 @@ jobs: uses: actions/checkout@v2 - name: Install Nextflow - env: - CAPSULE_LOG: none - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + uses: nf-core/setup-nextflow@v1 - uses: actions/setup-python@v3 with: - python-version: "3.6" + python-version: "3.7" architecture: "x64" - name: Install dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index bcbe42c1b..ddd115381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.3.0dev - [date] +## v2.0.0 - [date] Initial release of nf-core/chipseq, created with the [nf-core](https://nf-co.re/) template. diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..4533e2f28 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,56 @@ +cff-version: 1.2.0 +message: "If you use `nf-core tools` in your work, please cite the `nf-core` publication" +authors: + - family-names: Ewels + given-names: Philip + - family-names: Peltzer + given-names: Alexander + - family-names: Fillinger + given-names: Sven + - family-names: Patel + given-names: Harshil + - family-names: Alneberg + given-names: Johannes + - family-names: Wilm + given-names: Andreas + - family-names: Ulysse Garcia + given-names: Maxime + - family-names: Di Tommaso + given-names: Paolo + - family-names: Nahnsen + given-names: Sven +title: "The nf-core framework for community-curated bioinformatics pipelines." +version: 2.4.1 +doi: 10.1038/s41587-020-0439-x +date-released: 2022-05-16 +url: https://github.com/nf-core/tools +prefered-citation: + type: article + authors: + - family-names: Ewels + given-names: Philip + - family-names: Peltzer + given-names: Alexander + - family-names: Fillinger + given-names: Sven + - family-names: Patel + given-names: Harshil + - family-names: Alneberg + given-names: Johannes + - family-names: Wilm + given-names: Andreas + - family-names: Ulysse Garcia + given-names: Maxime + - family-names: Di Tommaso + given-names: Paolo + - family-names: Nahnsen + given-names: Sven + doi: 10.1038/s41587-020-0439-x + journal: nature biotechnology + start: 276 + end: 278 + title: "The nf-core framework for community-curated bioinformatics pipelines." + issue: 3 + volume: 38 + year: 2020 + url: https://dx.doi.org/10.1038/s41587-020-0439-x diff --git a/README.md b/README.md index 45ee3b4fc..095d129ce 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,14 @@ # ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_light.png#gh-light-mode-only) ![nf-core/chipseq](docs/images/nf-core-chipseq_logo_dark.png#gh-dark-mode-only) -[![GitHub Actions CI Status](https://github.com/nf-core/chipseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+CI%22) -[![GitHub Actions Linting Status](https://github.com/nf-core/chipseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/chipseq/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/chipseq/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/chipseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/chipseq) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/chipseq) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23chipseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/chipseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction @@ -25,7 +20,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). +On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources.The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/chipseq/results). ## Pipeline summary @@ -42,7 +37,7 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console + ```bash nextflow run nf-core/chipseq -profile test,YOURPROFILE --outdir ``` @@ -57,7 +52,7 @@ On release, automated continuous integration tests run the pipeline on a full-si - ```console + ```bash nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile ``` diff --git a/assets/email_template.txt b/assets/email_template.txt index 6d35a6974..e1b785260 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -6,7 +6,6 @@ `._,._,' nf-core/chipseq v${version} ---------------------------------------------------- - Run Name: $runName <% if (success){ diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 3652c63c8..9a8b89623 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -11,7 +11,6 @@ from collections import Counter from pathlib import Path - logger = logging.getLogger() @@ -79,13 +78,15 @@ def validate_and_transform(self, row): def _validate_sample(self, row): """Assert that the sample name exists and convert spaces to underscores.""" - assert len(row[self._sample_col]) > 0, "Sample input is required." + if len(row[self._sample_col]) <= 0: + raise AssertionError("Sample input is required.") # Sanitize samples slightly. row[self._sample_col] = row[self._sample_col].replace(" ", "_") def _validate_first(self, row): """Assert that the first FASTQ entry is non-empty and has the right format.""" - assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + if len(row[self._first_col]) <= 0: + raise AssertionError("At least the first FASTQ file is required.") self._validate_fastq_format(row[self._first_col]) def _validate_second(self, row): @@ -97,36 +98,34 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - assert ( - Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] - ), "FASTQ pairs must have the same file extensions." + if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True def _validate_fastq_format(self, filename): """Assert that a given filename has one of the expected FASTQ extensions.""" - assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( - f"The FASTQ file has an unrecognized extension: {filename}\n" - f"It should be one of: {', '.join(self.VALID_FORMATS)}" - ) + if not any(filename.endswith(extension) for extension in self.VALID_FORMATS): + raise AssertionError( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" + ) def validate_unique_samples(self): """ Assert that the combination of sample name and FASTQ filename is unique. - In addition to the validation, also rename the sample if more than one sample, - FASTQ file combination exists. + In addition to the validation, also rename all samples to have a suffix of _T{n}, where n is the + number of times the same sample exist, but with different FASTQ files, e.g., multiple runs per experiment. """ - assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." - if len({pair[0] for pair in self._seen}) < len(self._seen): - counts = Counter(pair[0] for pair in self._seen) - seen = Counter() - for row in self.modified: - sample = row[self._sample_col] - seen[sample] += 1 - if counts[sample] > 1: - row[self._sample_col] = f"{sample}_T{seen[sample]}" + if len(self._seen) != len(self.modified): + raise AssertionError("The pair of sample name and FASTQ must be unique.") + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + row[self._sample_col] = f"{sample}_T{seen[sample]}" def read_head(handle, num_lines=10): diff --git a/conf/base.config b/conf/base.config index 8231c4796..daf12c7c7 100644 --- a/conf/base.config +++ b/conf/base.config @@ -26,6 +26,11 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel:process_single { + cpus = { check_max( 1 , 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 12.GB * task.attempt, 'memory' ) } diff --git a/docs/images/nf-core-chipseq_logo_dark.png b/docs/images/nf-core-chipseq_logo_dark.png index cf22a2e865ba247de7727c84ee2e990aa932803e..9f2b30100fd7ed5870367833ae6567d1dd97f407 100644 GIT binary patch delta 23 fcmcb8kmd0~mJLw}91IK!44y8IA)BKT8V>*fZT<+W delta 14 WcmaESkmdG4mJLw}o0Ae64*&o;s|RTS diff --git a/docs/usage.md b/docs/usage.md index e6dc9daa9..997dfd2ce 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,7 +12,7 @@ You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. -```console +```bash --input '[path to samplesheet file]' ``` @@ -56,7 +56,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: -```console +```bash nextflow run nf-core/chipseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` @@ -64,9 +64,9 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: -```console +```bash work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) + # Finished results in specified location (defined with --outdir) .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -75,7 +75,7 @@ work # Directory containing the nextflow working files When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```console +```bash nextflow pull nf-core/chipseq ``` @@ -251,6 +251,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```console +```bash NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index 547194f75..a5952af0c 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -10,6 +10,7 @@ class WorkflowChipseq { public static void initialise(params, log) { genomeExistsError(params, log) + if (!params.fasta) { log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." System.exit(1) @@ -41,9 +42,7 @@ class WorkflowChipseq { yaml_file_text += "data: |\n" yaml_file_text += "${summary_section}" return yaml_file_text - } - - // + }// // Exit pipeline if incorrect --genome key provided // private static void genomeExistsError(params, log) { diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 0bf58e435..904824ae2 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -59,6 +59,7 @@ class WorkflowMain { } // Print parameter summary log to screen + log.info paramsSummaryLog(workflow, params, log) // Check that a -profile or Nextflow config has been provided to run the pipeline @@ -78,17 +79,15 @@ class WorkflowMain { System.exit(1) } } - // // Get attribute from genome config file e.g. fasta // - public static String getGenomeAttribute(params, attribute) { - def val = '' + public static Object getGenomeAttribute(params, attribute) { if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { if (params.genomes[ params.genome ].containsKey(attribute)) { - val = params.genomes[ params.genome ][ attribute ] + return params.genomes[ params.genome ][ attribute ] } } - return val + return null } } diff --git a/main.nf b/main.nf index cf50b1183..d6adc8513 100644 --- a/main.nf +++ b/main.nf @@ -4,7 +4,7 @@ nf-core/chipseq ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/chipseq - Website: https://nf-co.re/chipseq +Website: https://nf-co.re/chipseq Slack : https://nfcore.slack.com/channels/chipseq ---------------------------------------------------------------------------------------- */ diff --git a/modules.json b/modules.json index 72584e8a4..db8387141 100644 --- a/modules.json +++ b/modules.json @@ -3,14 +3,20 @@ "homePage": "https://github.com/nf-core/chipseq", "repos": { "nf-core/modules": { - "custom/dumpsoftwareversions": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "fastqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "multiqc": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + "git_url": "https://github.com/nf-core/modules.git", + "modules": { + "custom/dumpsoftwareversions": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + }, + "fastqc": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + }, + "multiqc": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d", + "branch": "master" + } } } } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index d13903925..787bdb7b1 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -1,9 +1,10 @@ #!/usr/bin/env python -import yaml import platform from textwrap import dedent +import yaml + def _make_versions_html(versions): html = [ @@ -58,11 +59,12 @@ def _make_versions_html(versions): for process, process_versions in versions_by_process.items(): module = process.split(":")[-1] try: - assert versions_by_module[module] == process_versions, ( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) except KeyError: versions_by_module[module] = process_versions diff --git a/nextflow.config b/nextflow.config index 6c5ab6b95..08da317e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,11 +13,11 @@ params { // Input options input = null + // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes' igenomes_ignore = false - // MultiQC options multiqc_config = null multiqc_title = null @@ -37,6 +37,7 @@ params { schema_ignore_params = 'genomes' enable_conda = false + // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" @@ -45,6 +46,7 @@ params { config_profile_url = null config_profile_name = null + // Max resource options // Defaults only, expecting to be overwritten max_memory = '128.GB' @@ -72,6 +74,7 @@ try { // } + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -82,6 +85,15 @@ profiles { shifter.enabled = false charliecloud.enabled = false } + mamba { + params.enable_conda = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } docker { docker.enabled = true docker.userEmulation = true @@ -119,10 +131,16 @@ profiles { podman.enabled = false shifter.enabled = false } + gitpod { + executor.name = 'local' + executor.cpus = 16 + executor.memory = 60.GB + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } + // Load igenomes.config if required if (!params.igenomes_ignore) { includeConfig 'conf/igenomes.config' @@ -130,6 +148,7 @@ if (!params.igenomes_ignore) { params.genomes = [:] } + // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. @@ -169,7 +188,7 @@ manifest { description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.3.0dev' + version = '2.0.0' } // Load modules.config for DSL2 module specific options From d2d38eea061d496d2d53d2ad9e66a59784399c39 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 1 Sep 2022 13:23:01 +0000 Subject: [PATCH 504/538] Template update for nf-core/tools version 2.5.1 --- bin/check_samplesheet.py | 9 ++++++--- pyproject.toml | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 pyproject.toml diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 9a8b89623..11b155723 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,9 @@ def _validate_pair(self, row): """Assert that read pairs have the same file extension. Report pair status.""" if row[self._first_col] and row[self._second_col]: row[self._single_col] = False - if Path(row[self._first_col]).suffixes[-2:] != Path(row[self._second_col]).suffixes[-2:]: + first_col_suffix = Path(row[self._first_col]).suffixes[-2:] + second_col_suffix = Path(row[self._second_col]).suffixes[-2:] + if first_col_suffix != second_col_suffix: raise AssertionError("FASTQ pairs must have the same file extensions.") else: row[self._single_col] = True @@ -157,7 +159,7 @@ def sniff_format(handle): handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): - logger.critical(f"The given sample sheet does not appear to contain a header.") + logger.critical("The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) return dialect @@ -195,7 +197,8 @@ def check_samplesheet(file_in, file_out): reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) # Validate the existence of the expected header columns. if not required_columns.issubset(reader.fieldnames): - logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + req_cols = ", ".join(required_columns) + logger.critical(f"The sample sheet **must** contain these column headers: {req_cols}.") sys.exit(1) # Validate each row. checker = RowChecker() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..0d62beb6f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +# Config file for Python. Mostly used to configure linting of bin/check_samplesheet.py with Black. +# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. +[tool.black] +line-length = 120 +target_version = ["py37", "py38", "py39", "py310"] + +[tool.isort] +profile = "black" +known_first_party = ["nf_core"] +multi_line_output = 3 From a91436be493dea3067a831534046555b65a152a7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 12:42:58 +0100 Subject: [PATCH 505/538] Fix nf-core lint --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .nf-core.yml | 9 +- LICENSE | 2 +- modules.json | 225 ++++++++++++++++++------------- nextflow.config | 2 +- 5 files changed, 134 insertions(+), 106 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f3dbd188d..8da27af0e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -17,7 +17,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/chip - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/chipseq/tree/master/.github/CONTRIBUTING.md)- [ ] If necessary, also make a PR on the nf-core/chipseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.nf-core.yml b/.nf-core.yml index f1d2ac4ed..b1a7f0e91 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,8 +1 @@ -repository_type: pipeline -lint: - files_unchanged: - - .github/workflows/branch.yml - - .github/workflows/linting_comment.yml - - .github/workflows/linting.yml - - .github/PULL_REQUEST_TEMPLATE.md - - bin/check_samplesheet.py +repository_type: pipeline \ No newline at end of file diff --git a/LICENSE b/LICENSE index e6309f574..9ddb87a26 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Philip Ewels, Jose Espinosa-Carrasco, Harshil Patel +Copyright (c) Espinosa-Carrasco J, Patel H, Wang C, Ewels P Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/modules.json b/modules.json index ad30c80a2..81c94b44a 100644 --- a/modules.json +++ b/modules.json @@ -3,101 +3,136 @@ "homePage": "https://github.com/nf-core/chipseq", "repos": { "nf-core/modules": { - "bowtie2/align": { - "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" - }, - "bowtie2/build": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "bwa/index": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "bwa/mem": { - "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" - }, - "chromap/chromap": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" - }, - "chromap/index": { - "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" - }, - "custom/dumpsoftwareversions": { - "git_sha": "e5b44499efcf6f7fb24874886bac60591c5d94dd" - }, - "custom/getchromsizes": { - "git_sha": "213403187932dbbdd936a04474cc8cd8abae7a08" - }, - "deeptools/computematrix": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "deeptools/plotfingerprint": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "deeptools/plotheatmap": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "deeptools/plotprofile": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "fastqc": { - "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" - }, - "gffread": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "gunzip": { - "git_sha": "fa37e0662690c4ec4260dae282fbce08777503e6" - }, - "homer/annotatepeaks": { - "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" - }, - "khmer/uniquekmers": { - "git_sha": "82fdff4fb4ce6cafcc028a7503da835427f35352" - }, - "macs2/callpeak": { - "git_sha": "f0800157544a82ae222931764483331a81812012" - }, - "phantompeakqualtools": { - "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" - }, - "picard/collectmultiplemetrics": { - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "picard/markduplicates": { - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "picard/mergesamfiles": { - "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" - }, - "preseq/lcextrap": { - "git_sha": "7111e571cc5b6069de4673cd6165af680f17b4d7" - }, - "samtools/flagstat": { - "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" - }, - "samtools/idxstats": { - "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" - }, - "samtools/index": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" - }, - "samtools/sort": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" - }, - "samtools/stats": { - "git_sha": "f48a24770e24358e58de66e9b805a70d77cd154b" - }, - "subread/featurecounts": { - "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" - }, - "trimgalore": { - "git_sha": "85ec13ff1fc2196c5a507ea497de468101baabed" - }, - "ucsc/bedgraphtobigwig": { - "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" - }, - "untar": { - "git_sha": "51be617b1ca9bff973655eb899d591ed6ab253b5" + "git_url": "https://github.com/nf-core/modules.git", + "modules": { + "bowtie2/align": { + "branch": "master", + "git_sha": "848ee9a215d02d80be033bfa60881700f2bd914c" + }, + "bowtie2/build": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "bwa/index": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "bwa/mem": { + "branch": "master", + "git_sha": "4f5274c3de0c9521f5033893ff61057a74c45ba9" + }, + "chromap/chromap": { + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + }, + "chromap/index": { + "branch": "master", + "git_sha": "dbb46c9b635080b132bab4b8d5b9a14f0d1c22e7" + }, + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "e5b44499efcf6f7fb24874886bac60591c5d94dd" + }, + "custom/getchromsizes": { + "branch": "master", + "git_sha": "213403187932dbbdd936a04474cc8cd8abae7a08" + }, + "deeptools/computematrix": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "deeptools/plotfingerprint": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "deeptools/plotheatmap": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "deeptools/plotprofile": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "fastqc": { + "branch": "master", + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" + }, + "gffread": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "gunzip": { + "branch": "master", + "git_sha": "fa37e0662690c4ec4260dae282fbce08777503e6" + }, + "homer/annotatepeaks": { + "branch": "master", + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" + }, + "khmer/uniquekmers": { + "branch": "master", + "git_sha": "82fdff4fb4ce6cafcc028a7503da835427f35352" + }, + "macs2/callpeak": { + "branch": "master", + "git_sha": "f0800157544a82ae222931764483331a81812012" + }, + "phantompeakqualtools": { + "branch": "master", + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" + }, + "picard/collectmultiplemetrics": { + "branch": "master", + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" + }, + "picard/markduplicates": { + "branch": "master", + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" + }, + "picard/mergesamfiles": { + "branch": "master", + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c" + }, + "preseq/lcextrap": { + "branch": "master", + "git_sha": "7111e571cc5b6069de4673cd6165af680f17b4d7" + }, + "samtools/flagstat": { + "branch": "master", + "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" + }, + "samtools/idxstats": { + "branch": "master", + "git_sha": "ecece498f10b47b7c9d06f53a310cea5811b4c5f" + }, + "samtools/index": { + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + }, + "samtools/sort": { + "branch": "master", + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + }, + "samtools/stats": { + "branch": "master", + "git_sha": "f48a24770e24358e58de66e9b805a70d77cd154b" + }, + "subread/featurecounts": { + "branch": "master", + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "trimgalore": { + "branch": "master", + "git_sha": "85ec13ff1fc2196c5a507ea497de468101baabed" + }, + "ucsc/bedgraphtobigwig": { + "branch": "master", + "git_sha": "233fa70811a03a4cecb2ece483b5c8396e2cee1d" + }, + "untar": { + "branch": "master", + "git_sha": "51be617b1ca9bff973655eb899d591ed6ab253b5" + } } } } diff --git a/nextflow.config b/nextflow.config index 58cea5bfa..c2e329b6f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -230,7 +230,7 @@ dag { manifest { name = 'nf-core/chipseq' - author = 'Jose Espinosa-Carrasco, Harshil Patel, Philip Ewels' + author = 'Espinosa-Carrasco J, Patel H, Wang C, Ewels P' homePage = 'https://github.com/nf-core/chipseq' description = 'ChIP-seq peak-calling and differential analysis pipeline.' mainScript = 'main.nf' From 4e83d3d524fbede21417e6ce829e7a19231d04d8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 12:44:19 +0100 Subject: [PATCH 506/538] Fix Black --- bin/bampe_rm_orphan.py | 62 ++++++++++------- bin/check_samplesheet.py | 21 ++---- bin/igv_files_to_session.py | 105 ++++++++++++++++++++--------- bin/macs2_merged_expand.py | 129 +++++++++++++++++++++++++----------- 4 files changed, 207 insertions(+), 110 deletions(-) diff --git a/bin/bampe_rm_orphan.py b/bin/bampe_rm_orphan.py index 5de45ea65..4ab9935b8 100755 --- a/bin/bampe_rm_orphan.py +++ b/bin/bampe_rm_orphan.py @@ -17,17 +17,25 @@ ############################################ ############################################ -Description = 'Remove singleton reads from paired-end BAM file i.e if read1 is present in BAM file without read 2 and vice versa.' +Description = ( + "Remove singleton reads from paired-end BAM file i.e if read1 is present in BAM file without read 2 and vice versa." +) Epilog = """Example usage: bampe_rm_orphan.py """ argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) ## REQUIRED PARAMETERS -argParser.add_argument('BAM_INPUT_FILE', help="Input BAM file sorted by name.") -argParser.add_argument('BAM_OUTPUT_FILE', help="Output BAM file sorted by name.") +argParser.add_argument("BAM_INPUT_FILE", help="Input BAM file sorted by name.") +argParser.add_argument("BAM_OUTPUT_FILE", help="Output BAM file sorted by name.") ## OPTIONAL PARAMETERS -argParser.add_argument('-fr', '--only_fr_pairs', dest="ONLY_FR_PAIRS", help="Only keeps pairs that are in FR orientation on same chromosome.",action='store_true') +argParser.add_argument( + "-fr", + "--only_fr_pairs", + dest="ONLY_FR_PAIRS", + help="Only keeps pairs that are in FR orientation on same chromosome.", + action="store_true", +) args = argParser.parse_args() ############################################ @@ -36,6 +44,7 @@ ############################################ ############################################ + def makedir(path): if not len(path) == 0: @@ -45,20 +54,25 @@ def makedir(path): if exception.errno != errno.EEXIST: raise + ############################################ ############################################ ## MAIN FUNCTION ############################################ ############################################ -def bampe_rm_orphan(BAMIn,BAMOut,onlyFRPairs=False): + +def bampe_rm_orphan(BAMIn, BAMOut, onlyFRPairs=False): ## SETUP DIRECTORY/FILE STRUCTURE OutDir = os.path.dirname(BAMOut) makedir(OutDir) ## COUNT VARIABLES - totalReads = 0; totalOutputPairs = 0; totalSingletons = 0; totalImproperPairs = 0 + totalReads = 0 + totalOutputPairs = 0 + totalSingletons = 0 + totalImproperPairs = 0 ## ITERATE THROUGH BAM FILE EOF = 0 @@ -69,7 +83,8 @@ def bampe_rm_orphan(BAMIn,BAMOut,onlyFRPairs=False): for read in iter: totalReads += 1 if currRead.qname == read.qname: - pair1 = currRead; pair2 = read + pair1 = currRead + pair2 = read ## FILTER FOR READS ON SAME CHROMOSOME IN FR ORIENTATION if onlyFRPairs: @@ -125,30 +140,31 @@ def bampe_rm_orphan(BAMIn,BAMOut,onlyFRPairs=False): SAMFin.close() SAMFout.close() - LogFile = os.path.join(OutDir,'%s_bampe_rm_orphan.log' % (os.path.basename(BAMOut[:-4]))) - SamLogFile = open(LogFile,'w') - SamLogFile.write('\n##############################\n') - SamLogFile.write('FILES/DIRECTORIES') - SamLogFile.write('\n##############################\n\n') - SamLogFile.write('Input File: ' + BAMIn + '\n') - SamLogFile.write('Output File: ' + BAMOut + '\n') - SamLogFile.write('\n##############################\n') - SamLogFile.write('OVERALL COUNTS') - SamLogFile.write('\n##############################\n\n') - SamLogFile.write('Total Input Reads = ' + str(totalReads) + '\n') - SamLogFile.write('Total Output Pairs = ' + str(totalOutputPairs) + '\n') - SamLogFile.write('Total Singletons Excluded = ' + str(totalSingletons) + '\n') - SamLogFile.write('Total Improper Pairs Excluded = ' + str(totalImproperPairs) + '\n') - SamLogFile.write('\n##############################\n') + LogFile = os.path.join(OutDir, "%s_bampe_rm_orphan.log" % (os.path.basename(BAMOut[:-4]))) + SamLogFile = open(LogFile, "w") + SamLogFile.write("\n##############################\n") + SamLogFile.write("FILES/DIRECTORIES") + SamLogFile.write("\n##############################\n\n") + SamLogFile.write("Input File: " + BAMIn + "\n") + SamLogFile.write("Output File: " + BAMOut + "\n") + SamLogFile.write("\n##############################\n") + SamLogFile.write("OVERALL COUNTS") + SamLogFile.write("\n##############################\n\n") + SamLogFile.write("Total Input Reads = " + str(totalReads) + "\n") + SamLogFile.write("Total Output Pairs = " + str(totalOutputPairs) + "\n") + SamLogFile.write("Total Singletons Excluded = " + str(totalSingletons) + "\n") + SamLogFile.write("Total Improper Pairs Excluded = " + str(totalImproperPairs) + "\n") + SamLogFile.write("\n##############################\n") SamLogFile.close() + ############################################ ############################################ ## RUN FUNCTION ############################################ ############################################ -bampe_rm_orphan(BAMIn=args.BAM_INPUT_FILE,BAMOut=args.BAM_OUTPUT_FILE,onlyFRPairs=args.ONLY_FR_PAIRS) +bampe_rm_orphan(BAMIn=args.BAM_INPUT_FILE, BAMOut=args.BAM_OUTPUT_FILE, onlyFRPairs=args.ONLY_FR_PAIRS) ############################################ ############################################ diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 1cc8a5939..eaf0d24c8 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -55,9 +55,7 @@ def check_samplesheet(file_in, file_out): HEADER = ["sample", "fastq_1", "fastq_2", "antibody", "control"] header = [x.strip('"') for x in fin.readline().strip().split(",")] if header[: len(HEADER)] != HEADER: - print( - f"ERROR: Please check samplesheet header -> {','.join(header)} != {','.join(HEADER)}" - ) + print(f"ERROR: Please check samplesheet header -> {','.join(header)} != {','.join(HEADER)}") sys.exit(1) ## Check sample entries @@ -82,9 +80,7 @@ def check_samplesheet(file_in, file_out): ## Check sample name entries sample, fastq_1, fastq_2, antibody, control = lspl[: len(HEADER)] if sample.find(" ") != -1: - print( - f"WARNING: Spaces have been replaced by underscores for sample: {sample}" - ) + print(f"WARNING: Spaces have been replaced by underscores for sample: {sample}") sample = sample.replace(" ", "_") if not sample: print_error("Sample entry has not been specified!", "Line", line) @@ -104,9 +100,7 @@ def check_samplesheet(file_in, file_out): ## Check antibody and control columns have valid values if antibody: if antibody.find(" ") != -1: - print( - f"WARNING: Spaces have been replaced by underscores for antibody: {antibody}" - ) + print(f"WARNING: Spaces have been replaced by underscores for antibody: {antibody}") antibody = antibody.replace(" ", "_") if not control: print_error( @@ -116,9 +110,7 @@ def check_samplesheet(file_in, file_out): ) if control: if control.find(" ") != -1: - print( - f"WARNING: Spaces have been replaced by underscores for control: {control}" - ) + print(f"WARNING: Spaces have been replaced by underscores for control: {control}") control = control.replace(" ", "_") if not antibody: print_error( @@ -166,10 +158,7 @@ def check_samplesheet(file_in, file_out): for sample in sorted(sample_mapping_dict.keys()): ## Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end - if not all( - x[0] == sample_mapping_dict[sample][0][0] - for x in sample_mapping_dict[sample] - ): + if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): print_error( f"Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end!", "Sample", diff --git a/bin/igv_files_to_session.py b/bin/igv_files_to_session.py index adfe8f7e2..ce1fac70f 100755 --- a/bin/igv_files_to_session.py +++ b/bin/igv_files_to_session.py @@ -22,12 +22,23 @@ argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) ## REQUIRED PARAMETERS -argParser.add_argument('XML_OUT', help="XML output file.") -argParser.add_argument('LIST_FILE', help="Tab-delimited file containing two columns i.e. file_name\tcolour. Header isnt required.") -argParser.add_argument('GENOME', help="Full path to genome fasta file or shorthand for genome available in IGV e.g. hg19.") +argParser.add_argument("XML_OUT", help="XML output file.") +argParser.add_argument( + "LIST_FILE", help="Tab-delimited file containing two columns i.e. file_name\tcolour. Header isnt required." +) +argParser.add_argument( + "GENOME", help="Full path to genome fasta file or shorthand for genome available in IGV e.g. hg19." +) ## OPTIONAL PARAMETERS -argParser.add_argument('-pp', '--path_prefix', type=str, dest="PATH_PREFIX", default='', help="Path prefix to be added at beginning of all files in input list file.") +argParser.add_argument( + "-pp", + "--path_prefix", + type=str, + dest="PATH_PREFIX", + default="", + help="Path prefix to be added at beginning of all files in input list file.", +) args = argParser.parse_args() ############################################ @@ -36,6 +47,7 @@ ############################################ ############################################ + def makedir(path): if not len(path) == 0: @@ -45,76 +57,103 @@ def makedir(path): if exception.errno != errno.EEXIST: raise + ############################################ ############################################ ## MAIN FUNCTION ############################################ ############################################ -def igv_files_to_session(XMLOut,ListFile,Genome,PathPrefix=''): + +def igv_files_to_session(XMLOut, ListFile, Genome, PathPrefix=""): makedir(os.path.dirname(XMLOut)) fileList = [] - fin = open(ListFile,'r') + fin = open(ListFile, "r") while True: line = fin.readline() if line: - ifile,colour = line.strip().split('\t') + ifile, colour = line.strip().split("\t") if len(colour.strip()) == 0: - colour = '0,0,178' - fileList.append((PathPrefix.strip()+ifile,colour)) + colour = "0,0,178" + fileList.append((PathPrefix.strip() + ifile, colour)) else: break fout.close() ## ADD RESOURCES SECTION - XMLStr = '\n' + XMLStr = '\n' XMLStr += '\n' % (Genome) - XMLStr += '\t\n' - for ifile,colour in fileList: + XMLStr += "\t\n" + for ifile, colour in fileList: XMLStr += '\t\t\n' % (ifile) - XMLStr += '\t\n' + XMLStr += "\t\n" ## ADD PANEL SECTION XMLStr += '\t\n' - for ifile,colour in fileList: + for ifile, colour in fileList: extension = os.path.splitext(ifile)[1].lower() - if extension in ['.bed','.broadpeak','.narrowpeak']: - XMLStr += '\t\t\n' + % (ifile, os.path.basename(ifile)) + ) + elif extension in [".bw", ".bigwig", ".tdf"]: + XMLStr += ( + '\t\t\n' + % (ifile, os.path.basename(ifile)) + ) XMLStr += '\t\t\t\n' - XMLStr += '\t\t\n' - elif extension in ['.gtf']: - XMLStr += '\t\t\n' + % (ifile, os.path.basename(ifile)) + ) + elif extension in [".bam"]: pass else: - XMLStr += '\t\t\n' + % (ifile, os.path.basename(ifile)) + ) + + XMLStr += "\t\n" + # XMLStr += '\t\n\t\t\n\t\t\n\t\t\n\t\n' + XMLStr += "" + XMLOut = open(XMLOut, "w") XMLOut.write(XMLStr) XMLOut.close() + ############################################ ############################################ ## RUN FUNCTION ############################################ ############################################ -igv_files_to_session(XMLOut=args.XML_OUT,ListFile=args.LIST_FILE,Genome=args.GENOME,PathPrefix=args.PATH_PREFIX) +igv_files_to_session(XMLOut=args.XML_OUT, ListFile=args.LIST_FILE, Genome=args.GENOME, PathPrefix=args.PATH_PREFIX) ############################################ ############################################ diff --git a/bin/macs2_merged_expand.py b/bin/macs2_merged_expand.py index 0aa184757..aa401123f 100755 --- a/bin/macs2_merged_expand.py +++ b/bin/macs2_merged_expand.py @@ -16,19 +16,35 @@ ############################################ ############################################ -Description = 'Add sample boolean files and aggregate columns from merged MACS narrow or broad peak file.' +Description = "Add sample boolean files and aggregate columns from merged MACS narrow or broad peak file." Epilog = """Example usage: python macs2_merged_expand.py --is_narrow_peak --min_replicates 1""" argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) ## REQUIRED PARAMETERS -argParser.add_argument('MERGED_INTERVAL_FILE', help="Merged MACS2 interval file created using linux sort and mergeBed.") -argParser.add_argument('SAMPLE_NAME_LIST', help="Comma-separated list of sample names as named in individual MACS2 broadPeak/narrowPeak output file e.g. SAMPLE_R1 for SAMPLE_R1_peak_1.") -argParser.add_argument('OUTFILE', help="Full path to output directory.") +argParser.add_argument("MERGED_INTERVAL_FILE", help="Merged MACS2 interval file created using linux sort and mergeBed.") +argParser.add_argument( + "SAMPLE_NAME_LIST", + help="Comma-separated list of sample names as named in individual MACS2 broadPeak/narrowPeak output file e.g. SAMPLE_R1 for SAMPLE_R1_peak_1.", +) +argParser.add_argument("OUTFILE", help="Full path to output directory.") ## OPTIONAL PARAMETERS -argParser.add_argument('-in', '--is_narrow_peak', dest="IS_NARROW_PEAK", help="Whether merged interval file was generated from narrow or broad peak files (default: False).",action='store_true') -argParser.add_argument('-mr', '--min_replicates', type=int, dest="MIN_REPLICATES", default=1, help="Minumum number of replicates per sample required to contribute to merged peak (default: 1).") +argParser.add_argument( + "-in", + "--is_narrow_peak", + dest="IS_NARROW_PEAK", + help="Whether merged interval file was generated from narrow or broad peak files (default: False).", + action="store_true", +) +argParser.add_argument( + "-mr", + "--min_replicates", + type=int, + dest="MIN_REPLICATES", + default=1, + help="Minumum number of replicates per sample required to contribute to merged peak (default: 1).", +) args = argParser.parse_args() ############################################ @@ -37,6 +53,7 @@ ############################################ ############################################ + def makedir(path): if not len(path) == 0: @@ -46,6 +63,7 @@ def makedir(path): if exception.errno != errno.EEXIST: raise + ############################################ ############################################ ## MAIN FUNCTION @@ -58,36 +76,50 @@ def makedir(path): ## 2) narrowPeak ## sort -k1,1 -k2,2n | mergeBed -c 2,3,4,5,6,7,8,9,10 -o collapse,collapse,collapse,collapse,collapse,collapse,collapse,collapse,collapse > merged_peaks.txt -def macs2_merged_expand(MergedIntervalTxtFile,SampleNameList,OutFile,isNarrow=False,minReplicates=1): + +def macs2_merged_expand(MergedIntervalTxtFile, SampleNameList, OutFile, isNarrow=False, minReplicates=1): makedir(os.path.dirname(OutFile)) combFreqDict = {} totalOutIntervals = 0 SampleNameList = sorted(SampleNameList) - fin = open(MergedIntervalTxtFile,'r') - fout = open(OutFile,'w') - oFields = ['chr','start','end','interval_id','num_peaks','num_samples'] + [x+'.bool' for x in SampleNameList] + [x+'.fc' for x in SampleNameList] + [x+'.qval' for x in SampleNameList] + [x+'.pval' for x in SampleNameList] + [x+'.start' for x in SampleNameList] + [x+'.end' for x in SampleNameList] + fin = open(MergedIntervalTxtFile, "r") + fout = open(OutFile, "w") + oFields = ( + ["chr", "start", "end", "interval_id", "num_peaks", "num_samples"] + + [x + ".bool" for x in SampleNameList] + + [x + ".fc" for x in SampleNameList] + + [x + ".qval" for x in SampleNameList] + + [x + ".pval" for x in SampleNameList] + + [x + ".start" for x in SampleNameList] + + [x + ".end" for x in SampleNameList] + ) if isNarrow: - oFields += [x+'.summit' for x in SampleNameList] - fout.write('\t'.join(oFields) + '\n') + oFields += [x + ".summit" for x in SampleNameList] + fout.write("\t".join(oFields) + "\n") while True: line = fin.readline() if line: - lspl = line.strip().split('\t') - - chromID = lspl[0]; mstart = int(lspl[1]); mend = int(lspl[2]); - starts = [int(x) for x in lspl[3].split(',')]; ends = [int(x) for x in lspl[4].split(',')] - names = lspl[5].split(','); fcs = [float(x) for x in lspl[8].split(',')] - pvals = [float(x) for x in lspl[9].split(',')]; qvals = [float(x) for x in lspl[10].split(',')] + lspl = line.strip().split("\t") + + chromID = lspl[0] + mstart = int(lspl[1]) + mend = int(lspl[2]) + starts = [int(x) for x in lspl[3].split(",")] + ends = [int(x) for x in lspl[4].split(",")] + names = lspl[5].split(",") + fcs = [float(x) for x in lspl[8].split(",")] + pvals = [float(x) for x in lspl[9].split(",")] + qvals = [float(x) for x in lspl[10].split(",")] summits = [] if isNarrow: - summits = [int(x) for x in lspl[11].split(',')] + summits = [int(x) for x in lspl[11].split(",")] ## GROUP SAMPLES BY REMOVING TRAILING *_R* groupDict = {} - for sID in ['_'.join(x.split('_')[:-2]) for x in names]: - gID = '_'.join(sID.split('_')[:-1]) + for sID in ["_".join(x.split("_")[:-2]) for x in names]: + gID = "_".join(sID.split("_")[:-1]) if gID not in groupDict: groupDict[gID] = [] if sID not in groupDict[gID]: @@ -95,14 +127,19 @@ def macs2_merged_expand(MergedIntervalTxtFile,SampleNameList,OutFile,isNarrow=Fa ## GET SAMPLES THAT PASS REPLICATE THRESHOLD passRepThreshList = [] - for gID,sIDs in groupDict.items(): + for gID, sIDs in groupDict.items(): if len(sIDs) >= minReplicates: passRepThreshList += sIDs ## GET VALUES FROM INDIVIDUAL PEAK SETS - fcDict = {}; qvalDict = {}; pvalDict = {}; startDict = {}; endDict = {}; summitDict = {} + fcDict = {} + qvalDict = {} + pvalDict = {} + startDict = {} + endDict = {} + summitDict = {} for idx in range(len(names)): - sample = '_'.join(names[idx].split('_')[:-2]) + sample = "_".join(names[idx].split("_")[:-2]) if sample in passRepThreshList: if sample not in fcDict: fcDict[sample] = [] @@ -127,16 +164,25 @@ def macs2_merged_expand(MergedIntervalTxtFile,SampleNameList,OutFile,isNarrow=Fa samples = sorted(fcDict.keys()) if samples != []: numSamples = len(samples) - boolList = ['TRUE' if x in samples else 'FALSE' for x in SampleNameList] - fcList = [';'.join(fcDict[x]) if x in samples else 'NA' for x in SampleNameList] - qvalList = [';'.join(qvalDict[x]) if x in samples else 'NA' for x in SampleNameList] - pvalList = [';'.join(pvalDict[x]) if x in samples else 'NA' for x in SampleNameList] - startList = [';'.join(startDict[x]) if x in samples else 'NA' for x in SampleNameList] - endList = [';'.join(endDict[x]) if x in samples else 'NA' for x in SampleNameList] - oList = [str(x) for x in [chromID,mstart,mend,'Interval_'+str(totalOutIntervals+1),len(names),numSamples]+boolList+fcList+qvalList+pvalList+startList+endList] + boolList = ["TRUE" if x in samples else "FALSE" for x in SampleNameList] + fcList = [";".join(fcDict[x]) if x in samples else "NA" for x in SampleNameList] + qvalList = [";".join(qvalDict[x]) if x in samples else "NA" for x in SampleNameList] + pvalList = [";".join(pvalDict[x]) if x in samples else "NA" for x in SampleNameList] + startList = [";".join(startDict[x]) if x in samples else "NA" for x in SampleNameList] + endList = [";".join(endDict[x]) if x in samples else "NA" for x in SampleNameList] + oList = [ + str(x) + for x in [chromID, mstart, mend, "Interval_" + str(totalOutIntervals + 1), len(names), numSamples] + + boolList + + fcList + + qvalList + + pvalList + + startList + + endList + ] if isNarrow: - oList += [';'.join(summitDict[x]) if x in samples else 'NA' for x in SampleNameList] - fout.write('\t'.join(oList) + '\n') + oList += [";".join(summitDict[x]) if x in samples else "NA" for x in SampleNameList] + fout.write("\t".join(oList) + "\n") tsamples = tuple(sorted(samples)) if tsamples not in combFreqDict: @@ -151,19 +197,26 @@ def macs2_merged_expand(MergedIntervalTxtFile,SampleNameList,OutFile,isNarrow=Fa ## WRITE FILE FOR INTERVAL INTERSECT ACROSS SAMPLES. ## COMPATIBLE WITH UPSETR PACKAGE. - fout = open(OutFile[:-4]+'.intersect.txt','w') - combFreqItems = sorted([(combFreqDict[x],x) for x in combFreqDict.keys()],reverse=True) - for k,v in combFreqItems: - fout.write('%s\t%s\n' % ('&'.join(v),k)) + fout = open(OutFile[:-4] + ".intersect.txt", "w") + combFreqItems = sorted([(combFreqDict[x], x) for x in combFreqDict.keys()], reverse=True) + for k, v in combFreqItems: + fout.write("%s\t%s\n" % ("&".join(v), k)) fout.close() + ############################################ ############################################ ## RUN FUNCTION ############################################ ############################################ -macs2_merged_expand(MergedIntervalTxtFile=args.MERGED_INTERVAL_FILE,SampleNameList=args.SAMPLE_NAME_LIST.split(','),OutFile=args.OUTFILE,isNarrow=args.IS_NARROW_PEAK,minReplicates=args.MIN_REPLICATES) +macs2_merged_expand( + MergedIntervalTxtFile=args.MERGED_INTERVAL_FILE, + SampleNameList=args.SAMPLE_NAME_LIST.split(","), + OutFile=args.OUTFILE, + isNarrow=args.IS_NARROW_PEAK, + minReplicates=args.MIN_REPLICATES, +) ############################################ ############################################ From c82f2f7f7f04215929d141256934ea5efb050251 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 12:49:01 +0100 Subject: [PATCH 507/538] Fix Prettier --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index b1a7f0e91..3805dc81c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1 @@ -repository_type: pipeline \ No newline at end of file +repository_type: pipeline From 023c1be3cd3c90767505ff0f61a846ebe5eaa0e1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 13:29:50 +0100 Subject: [PATCH 508/538] Fix indent in main.nf --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 969542d9e..9baf7cb86 100755 --- a/main.nf +++ b/main.nf @@ -4,7 +4,7 @@ nf-core/chipseq ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/chipseq -Website: https://nf-co.re/chipseq + Website: https://nf-co.re/chipseq Slack : https://nfcore.slack.com/channels/chipseq ---------------------------------------------------------------------------------------- */ From 1d469ce5dc389c28f095b1bbbae7e096f26e5aa5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 15:04:55 +0100 Subject: [PATCH 509/538] Remove new lines --- nextflow.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index c2e329b6f..801b0c2f6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,6 @@ params { fingerprint_bins = 500000 read_length = null - // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes' @@ -88,7 +87,6 @@ params { schema_ignore_params = 'genomes' enable_conda = false - // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" @@ -97,7 +95,6 @@ params { config_profile_url = null config_profile_name = null - // Max resource options // Defaults only, expecting to be overwritten max_memory = '128.GB' From c1b8bc8af775a517226257d4da40ba1ebb4b49a9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 15:07:51 +0100 Subject: [PATCH 510/538] Fix channels for GUNZIP processes --- subworkflows/local/prepare_genome.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 9c8615993..3e90cff5b 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -38,7 +38,7 @@ workflow PREPARE_GENOME { // ch_fasta = Channel.empty() if (params.fasta.endsWith('.gz')) { - ch_fasta = GUNZIP_FASTA ( [:], params.fasta ).gunzip.map{ it[1] } + ch_fasta = GUNZIP_FASTA ( [ [:], params.fasta ] ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } else { ch_fasta = file(params.fasta) @@ -55,14 +55,14 @@ workflow PREPARE_GENOME { // if (params.gtf) { if (params.gtf.endsWith('.gz')) { - ch_gtf = GUNZIP_GTF ( [:], params.gtf ).gunzip.map{ it[1] } + ch_gtf = GUNZIP_GTF ( [ [:], params.gtf ] ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } else { ch_gtf = file(params.gtf) } } else if (params.gff) { if (params.gff.endsWith('.gz')) { - ch_gff = GUNZIP_GFF ( [:], params.gff ).gunzip.map{ it[1] } + ch_gff = GUNZIP_GFF ( [ [:], params.gff ] ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GFF.out.versions) } else { ch_gff = file(params.gff) @@ -77,7 +77,7 @@ workflow PREPARE_GENOME { ch_blacklist = Channel.empty() if (params.blacklist) { if (params.blacklist.endsWith('.gz')) { - ch_blacklist = GUNZIP_BLACKLIST ( [:], params.blacklist ).gunzip.map{ it[1] } + ch_blacklist = GUNZIP_BLACKLIST ( [ [:], params.blacklist ] ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_BLACKLIST.out.versions) } else { ch_blacklist = Channel.fromPath(file(params.blacklist)) @@ -104,7 +104,7 @@ workflow PREPARE_GENOME { ch_versions = ch_versions.mix(GTF2BED.out.versions) } else { if (params.gene_bed.endsWith('.gz')) { - ch_gene_bed = GUNZIP_GENE_BED ( [:], params.gene_bed ).gunzip.map{ it[1] } + ch_gene_bed = GUNZIP_GENE_BED ( [ [:], params.gene_bed ] ).gunzip.map{ it[1] } ch_versions = ch_versions.mix(GUNZIP_GENE_BED.out.versions) } else { ch_gene_bed = file(params.gene_bed) From 9204c7d1e404bf5abf5dca7a8bd1c4750c9754d9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 12 Sep 2022 15:09:33 +0100 Subject: [PATCH 511/538] Fix channels for UNTAR processes --- subworkflows/local/prepare_genome.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 3e90cff5b..9b6422c6a 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -137,7 +137,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bwa') { if (params.bwa_index) { if (params.bwa_index.endsWith('.tar.gz')) { - ch_bwa_index = UNTAR_BWA_INDEX ( [:], params.bwa_index ).untar.map{ it[1] } + ch_bwa_index = UNTAR_BWA_INDEX ( [ [:], params.bwa_index ] ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_BWA_INDEX.out.versions) } else { ch_bwa_index = file(params.bwa_index) @@ -155,7 +155,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'bowtie2') { if (params.bowtie2_index) { if (params.bowtie2_index.endsWith('.tar.gz')) { - ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [:], params.bowtie2_index ).untar.map{ it[1] } + ch_bowtie2_index = UNTAR_BOWTIE2_INDEX ( [ [:], params.bowtie2_index ] ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_BOWTIE2_INDEX.out.versions) } else { ch_bowtie2_index = file(params.bowtie2_index) @@ -173,7 +173,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'chromap') { if (params.chromap_index) { if (params.chromap_index.endsWith('.tar.gz')) { - ch_chromap_index = UNTAR_CHROMAP_INDEX ( [:], params.chromap_index ).untar.map{ it[1] } + ch_chromap_index = UNTAR_CHROMAP_INDEX ( [ [:], params.chromap_index ] ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR.out.versions) } else { ch_chromap_index = file(params.chromap_index) @@ -191,7 +191,7 @@ workflow PREPARE_GENOME { if (prepare_tool_index == 'star') { if (params.star_index) { if (params.star_index.endsWith('.tar.gz')) { - ch_star_index = UNTAR_STAR_INDEX ( [:], params.star_index ).untar.map{ it[1] } + ch_star_index = UNTAR_STAR_INDEX ( [ [:], params.star_index ] ).untar.map{ it[1] } ch_versions = ch_versions.mix(UNTAR_STAR_INDEX.out.versions) } else { ch_star_index = file(params.star_index) From 7b444219f9d74f950139c07a9ecbb7a14575e5e4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 14 Sep 2022 14:45:34 +0100 Subject: [PATCH 512/538] Fix or reword bits in the pipeline --- conf/modules.config | 23 +++++++++++++++-------- conf/test.config | 8 ++++---- conf/test_full.config | 2 +- lib/WorkflowChipseq.groovy | 4 ++-- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 47784e03d..729c7734e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -396,7 +396,6 @@ process { withName: 'PHANTOMPEAKQUALTOOLS' { ext.args2 = { "-p=$task.cpus" } - ext.prefix = { "${meta.id}.mLb.clN" } publishDir = [ path: { "${params.outdir}/${params.aligner}/mergedLibrary/phantompeakqualtools" }, mode: params.publish_dir_mode, @@ -599,7 +598,8 @@ if (!params.skip_peak_annotation) { } withName: 'PLOT_HOMER_ANNOTATEPEAKS' { - ext.args = '-o ./ -p macs2_annotatePeaks' + ext.args = '-o ./' + ext.prefix = 'macs2_annotatePeaks' publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", @@ -623,7 +623,8 @@ if (!params.skip_consensus_peaks) { path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -632,11 +633,13 @@ if (!params.skip_consensus_peaks) { withName: 'SUBREAD_FEATURECOUNTS' { ext.args = '-F SAF -O --fracOverlap 0.2' + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -648,24 +651,27 @@ if (!params.skip_consensus_peaks) { process { withName: 'HOMER_ANNOTATEPEAKS_CONSENSUS' { ext.args = '-gid' - ext.prefix = 'consensus_peaks' + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: 'ANNOTATE_BOOLEAN_PEAKS' { - ext.prefix = { "${meta.id}_peaks" } + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' + '/consensus', + "/${meta.id}" ].join('') }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -689,6 +695,7 @@ if (!params.skip_consensus_peaks) { "${params.outdir}/${params.aligner}/mergedLibrary/macs2", params.narrow_peak? '/narrowPeak' : '/broadPeak', '/consensus', + "/${meta.id}", '/deseq2' ].join('') }, mode: params.publish_dir_mode, diff --git a/conf/test.config b/conf/test.config index 2fad3bc87..9b24bc9af 100644 --- a/conf/test.config +++ b/conf/test.config @@ -11,13 +11,13 @@ */ params { - config_profile_name = 'Test profile' + config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 6.h + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_test.csv' diff --git a/conf/test_full.config b/conf/test_full.config index f47445a54..d25c37d79 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -17,7 +17,7 @@ params { // Input data for full size test input = 'https://raw.githubusercontent.com/nf-core/test-datasets/chipseq/samplesheet/v2.0/samplesheet_full.csv' - // Used to get macs_gsize + // Used to calculate --macs_gsize read_length = 50 // Genome references diff --git a/lib/WorkflowChipseq.groovy b/lib/WorkflowChipseq.groovy index b46f9362b..dfae806fc 100755 --- a/lib/WorkflowChipseq.groovy +++ b/lib/WorkflowChipseq.groovy @@ -12,7 +12,7 @@ class WorkflowChipseq { if (!params.fasta) { - log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." + log.error "Genome fasta file not specified with e.g. '--fasta' or via a detectable config file." System.exit(1) } @@ -98,7 +98,7 @@ class WorkflowChipseq { log.warn "=============================================================================\n" + " --macs_gsize parameter has not been provided.\n" + " It will be auto-calculated by 'khmer unique-kmers.py' using the '--read_length' parameter.\n" + - " Explicitly provide '--macs_gsize macs2_genome_size' to change this behaviour.\n" + + " Explicitly provide '--macs_gsize' to change this behaviour.\n" + "===================================================================================" } From 377489fda2d6ff12f8ef6c46cad34b1e879b4e84 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 14 Sep 2022 14:45:54 +0100 Subject: [PATCH 513/538] Add prefix to homer module --- modules/local/plot_homer_annotatepeaks.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 2cb38a373..11ed3daba 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -19,13 +19,15 @@ process PLOT_HOMER_ANNOTATEPEAKS { script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "annotatepeaks" """ plot_homer_annotatepeaks.r \\ -i ${annos.join(',')} \\ -s ${annos.join(',').replaceAll("${suffix}","")} \\ + -p $prefix \\ $args - find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > annotatepeaks.summary_mqc.tsv + find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > ${prefix}.summary_mqc.tsv cat <<-END_VERSIONS > versions.yml "${task.process}": From ea942635985e3dbe5d9273e137fb175d333e59cd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 14 Sep 2022 16:54:39 +0100 Subject: [PATCH 514/538] Fix missing tools in MultiQC report --- assets/multiqc_config.yml | 2 +- modules/local/multiqc.nf | 5 +++-- workflows/chipseq.nf | 16 +++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 1a55a16cb..4493905e5 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -72,7 +72,7 @@ module_order: anchor: "mlib_featurecounts" info: "This section of the report shows featureCounts results for the number of reads assigned to merged library consensus peaks." path_filters: - - "./macs/consensus/*.summary" + - "./macs2/featurecounts/*.summary" report_section_order: peak_count: diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 92824f01d..702b239f4 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -31,8 +31,10 @@ process MULTIQC { path ('alignment/mergedLibrary/filtered/picard_metrics/*') path ('preseq/*') + path ('deeptools/*') path ('deeptools/*') + path ('phantompeakqualtools/*') path ('phantompeakqualtools/*') path ('phantompeakqualtools/*') @@ -41,8 +43,7 @@ process MULTIQC { path ('macs2/peaks/*') path ('macs2/peaks/*') path ('macs2/annotation/*') - - path ('featurecounts/*') + path ('macs2/featurecounts/*') path ('deseq2/*') path ('deseq2/*') diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index eedccc5d5..387ed32a7 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -228,9 +228,9 @@ workflow CHIPSEQ { def count = it.size() if (count > 0) { log.warn "=============================================================================\n" + - " Paired-end files produced by chromap can not be used by some downstream tools due the issue below:\n" + + " Paired-end files produced by chromap cannot be used by some downstream tools due to the issue below:\n" + " https://github.com/nf-core/chipseq/issues/291\n" + - " They will be excluded from the analysis. Consider to use a different aligner\n" + + " They will be excluded from the analysis. Consider using a different aligner\n" + "===================================================================================" } } @@ -268,7 +268,8 @@ workflow CHIPSEQ { ch_genome_bam .map { meta, bam -> - def fmeta = meta.findAll { it.key != 'read_group' } + def fmeta = meta.clone() + fmeta.remove('read_group') fmeta.id = fmeta.id.split('_')[0..-2].join('_') [ fmeta, bam ] } .groupTuple(by: [0]) @@ -294,7 +295,6 @@ workflow CHIPSEQ { FILTER_BAM_BAMTOOLS ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), PREPARE_GENOME.out.filtered_bed.first(), - ch_bamtools_filter_se_config, ch_bamtools_filter_pe_config ) @@ -414,7 +414,7 @@ workflow CHIPSEQ { DEEPTOOLS_PLOTFINGERPRINT ( ch_ip_control_bam_bai ) - ch_deeptools_plotfingerprintmultiqc = DEEPTOOLS_PLOTFINGERPRINT.out.matrix + ch_deeptoolsplotfingerprint_multiqc = DEEPTOOLS_PLOTFINGERPRINT.out.matrix ch_versions = ch_versions.mix(DEEPTOOLS_PLOTFINGERPRINT.out.versions.first()) } @@ -426,7 +426,6 @@ workflow CHIPSEQ { ch_custompeaks_count_multiqc = Channel.empty() ch_plothomerannotatepeaks_multiqc = Channel.empty() ch_subreadfeaturecounts_multiqc = Channel.empty() - ch_macs_gsize = params.macs_gsize if (!params.macs_gsize) { KHMER_UNIQUEKMERS ( @@ -649,8 +648,10 @@ workflow CHIPSEQ { ch_picardcollectmultiplemetrics_multiqc.collect{it[1]}.ifEmpty([]), ch_preseq_multiqc.collect{it[1]}.ifEmpty([]), + ch_deeptoolsplotprofile_multiqc.collect{it[1]}.ifEmpty([]), ch_deeptoolsplotfingerprint_multiqc.collect{it[1]}.ifEmpty([]), + PHANTOMPEAKQUALTOOLS.out.spp.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.nsc.collect{it[1]}.ifEmpty([]), MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS.out.rsc.collect{it[1]}.ifEmpty([]), @@ -660,10 +661,11 @@ workflow CHIPSEQ { ch_custompeaks_count_multiqc.collect{it[1]}.ifEmpty([]), ch_plothomerannotatepeaks_multiqc.collect().ifEmpty([]), ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([]), + ch_deseq2_pca_multiqc.collect().ifEmpty([]), ch_deseq2_clustering_multiqc.collect().ifEmpty([]) ) - multiqc_report = MULTIQC.out.report.toList() + multiqc_report = MULTIQC.out.report.toList() } } From bd1dd009bc3ca3e2881a3080a4cfac47d820f87e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 14 Sep 2022 17:14:18 +0100 Subject: [PATCH 515/538] Print versions for correct process --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 387ed32a7..698f97e1f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -373,7 +373,7 @@ workflow CHIPSEQ { DEEPTOOLS_COMPUTEMATRIX.out.matrix ) ch_deeptoolsplotprofile_multiqc = DEEPTOOLS_PLOTPROFILE.out.table - ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) + ch_versions = ch_versions.mix(DEEPTOOLS_PLOTPROFILE.out.versions.first()) DEEPTOOLS_PLOTHEATMAP ( DEEPTOOLS_COMPUTEMATRIX.out.matrix From ef3637bad4bff71fbec8a20c234444ceccb23b83 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 14 Sep 2022 20:22:12 +0100 Subject: [PATCH 516/538] Fix FRiP score being printed twice to file --- modules/local/frip_score.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/frip_score.nf b/modules/local/frip_score.nf index e8fdbcc91..337b18c53 100644 --- a/modules/local/frip_score.nf +++ b/modules/local/frip_score.nf @@ -20,7 +20,7 @@ process FRIP_SCORE { """ READS_IN_PEAKS=\$(intersectBed -a $bam -b $peak $args | awk -F '\t' '{sum += \$NF} END {print sum}') samtools flagstat $bam > ${bam}.flagstat - grep 'mapped (' ${bam}.flagstat | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt + grep 'mapped (' ${bam}.flagstat | grep -v "primary" | awk -v a="\$READS_IN_PEAKS" -v OFS='\t' '{print "${prefix}", a/\$1}' > ${prefix}.FRiP.txt cat <<-END_VERSIONS > versions.yml "${task.process}": From f518dd8dd240eec8d48908d616360b462c7feaf2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 11:32:43 +0100 Subject: [PATCH 517/538] Re-factor channel joining for ip and control --- workflows/chipseq.nf | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 698f97e1f..3ed9eb118 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -268,10 +268,10 @@ workflow CHIPSEQ { ch_genome_bam .map { meta, bam -> - def fmeta = meta.clone() - fmeta.remove('read_group') - fmeta.id = fmeta.id.split('_')[0..-2].join('_') - [ fmeta, bam ] } + def meta_clone = meta.clone() + meta_clone.remove('read_group') + meta_clone.id = meta_clone.id.split('_')[0..-2].join('_') + [ meta_clone, bam ] } .groupTuple(by: [0]) .map { it -> [ it[0], it[1].flatten() ] } .set { ch_sort_bam } @@ -387,25 +387,17 @@ workflow CHIPSEQ { FILTER_BAM_BAMTOOLS .out .bam - .join (FILTER_BAM_BAMTOOLS.out.bai, by: [0]) - .map { - meta, bam, bai -> - meta.control ? null : [ meta.id, [ bam ] , [ bai ] ] - } - .set { ch_control_bam_bai } - - FILTER_BAM_BAMTOOLS - .out - .bam - .join (FILTER_BAM_BAMTOOLS.out.bai, by: [0]) - .map { - meta, bam, bai -> - meta.control ? [ meta.control, meta, [ bam ], [ bai ] ] : null + .join(FILTER_BAM_BAMTOOLS.out.bai, by: [0]) + .set { ch_genome_bam_bai } + + ch_genome_bam_bai + .combine(ch_genome_bam_bai) + .map { + meta1, bam1, bai1, meta2, bam2, bai2 -> + meta1.control == meta2.id ? [ meta1, [ bam1, bam2 ], [ bai1, bai2 ] ] : null } - .combine(ch_control_bam_bai, by: 0) - .map { it -> [ it[1] , it[2] + it[4], it[3] + it[5] ] } .set { ch_ip_control_bam_bai } - + // // plotFingerprint for IP and control together // From 6f17b333af13937fe00800706b240b2e3f20a810 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 11:47:54 +0100 Subject: [PATCH 518/538] Add meta.id tag where missing to local modules --- modules/local/annotate_boolean_peaks.nf | 2 +- modules/local/multiqc_custom_peaks.nf | 2 +- modules/local/multiqc_custom_phantompeakqualtools.nf | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/local/annotate_boolean_peaks.nf b/modules/local/annotate_boolean_peaks.nf index 8d45fe92f..ab2dfbed3 100644 --- a/modules/local/annotate_boolean_peaks.nf +++ b/modules/local/annotate_boolean_peaks.nf @@ -1,5 +1,5 @@ process ANNOTATE_BOOLEAN_PEAKS { - + tag "$meta.id" label 'process_low' conda (params.enable_conda ? "conda-forge::sed=4.7" : null) diff --git a/modules/local/multiqc_custom_peaks.nf b/modules/local/multiqc_custom_peaks.nf index 1ca41d4ce..ebef7b13a 100644 --- a/modules/local/multiqc_custom_peaks.nf +++ b/modules/local/multiqc_custom_peaks.nf @@ -1,5 +1,5 @@ process MULTIQC_CUSTOM_PEAKS { - + tag "$meta.id" conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : diff --git a/modules/local/multiqc_custom_phantompeakqualtools.nf b/modules/local/multiqc_custom_phantompeakqualtools.nf index 706af4fc0..4878e2c27 100644 --- a/modules/local/multiqc_custom_phantompeakqualtools.nf +++ b/modules/local/multiqc_custom_phantompeakqualtools.nf @@ -1,4 +1,5 @@ process MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS { + tag "$meta.id" conda (params.enable_conda ? "conda-forge::r-base=3.5.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/r-base:3.5.1': From 474e226ff821617b8bb0a505ac6ec7a16bb9f130 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:01:07 +0100 Subject: [PATCH 519/538] Re-factor channel joining for featurecounts --- workflows/chipseq.nf | 142 ++++++++++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 55 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 3ed9eb118..9a06c666c 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -224,15 +224,16 @@ workflow CHIPSEQ { ch_genome_bam_chromap.paired_end .collect() - .map { it -> - def count = it.size() - if (count > 0) { - log.warn "=============================================================================\n" + - " Paired-end files produced by chromap cannot be used by some downstream tools due to the issue below:\n" + - " https://github.com/nf-core/chipseq/issues/291\n" + - " They will be excluded from the analysis. Consider using a different aligner\n" + - "===================================================================================" - } + .map { + it -> + def count = it.size() + if (count > 0) { + log.warn "=============================================================================\n" + + " Paired-end files produced by chromap cannot be used by some downstream tools due to the issue below:\n" + + " https://github.com/nf-core/chipseq/issues/291\n" + + " They will be excluded from the analysis. Consider using a different aligner\n" + + "===================================================================================" + } } ch_genome_bam = ch_genome_bam_chromap.single_end @@ -271,9 +272,13 @@ workflow CHIPSEQ { def meta_clone = meta.clone() meta_clone.remove('read_group') meta_clone.id = meta_clone.id.split('_')[0..-2].join('_') - [ meta_clone, bam ] } + [ meta_clone, bam ] + } .groupTuple(by: [0]) - .map { it -> [ it[0], it[1].flatten() ] } + .map { + it -> + [ it[0], it[1].flatten() ] + } .set { ch_sort_bam } PICARD_MERGESAMFILES ( @@ -309,7 +314,7 @@ workflow CHIPSEQ { MARK_DUPLICATES_PICARD.out.bam ) ch_preseq_multiqc = PRESEQ_LCEXTRAP.out.lc_extrap - ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) + ch_versions = ch_versions.mix(PRESEQ_LCEXTRAP.out.versions.first()) } // @@ -382,7 +387,7 @@ workflow CHIPSEQ { } // - // Refactor channels: [ val(meta), [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // Refactor channels: [ meta, [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] // FILTER_BAM_BAMTOOLS .out @@ -427,9 +432,12 @@ workflow CHIPSEQ { ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { it.text.trim() } } - // Create channel: [ val(meta), ip_bam, control_bam ] + // Create channel: [ meta, ip_bam, control_bam ] ch_ip_control_bam_bai - .map { meta, bams, bais -> [ meta , bams[0], bams[1] ] } + .map { + meta, bams, bais -> + [ meta , bams[0], bams[1] ] + } .set { ch_ip_control_bam } MACS2_CALLPEAK ( @@ -447,23 +455,31 @@ workflow CHIPSEQ { .filter { meta, peaks -> peaks.size() > 0 } .set { ch_macs2_peaks } + // Create channel: [ meta, ip_bam, peaks ] ch_ip_control_bam .join(ch_macs2_peaks, by: [0]) - .map { it -> [ it[0], it[1], it[3] ] } - .set { ch_ip_peak } + .map { + it -> + [ it[0], it[1], it[3] ] + } + .set { ch_ip_bam_peaks } FRIP_SCORE ( - ch_ip_peak + ch_ip_bam_peaks ) ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) - ch_ip_peak + // Create channel: [ meta, peaks, frip ] + ch_ip_bam_peaks .join(FRIP_SCORE.out.txt, by: [0]) - .map { it -> [ it[0], it[2], it[3] ] } - .set { ch_ip_peak_frip } + .map { + it -> + [ it[0], it[2], it[3] ] + } + .set { ch_ip_peaks_frip } MULTIQC_CUSTOM_PEAKS ( - ch_ip_peak_frip, + ch_ip_peaks_frip, ch_peak_count_header, ch_frip_score_header ) @@ -502,9 +518,12 @@ workflow CHIPSEQ { ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_consensus_peaks) { // Create channel: [ meta , [ peaks ] ] - // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] + // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] ch_macs2_peaks - .map { meta, peak -> [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] } + .map { + meta, peak -> + [ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ] + } .groupTuple() .map { antibody, groups, peaks -> @@ -512,21 +531,23 @@ workflow CHIPSEQ { antibody, groups.groupBy().collectEntries { [(it.key) : it.value.size()] }, peaks - ] } + ] + } .map { antibody, groups, peaks -> - def meta = [:] - meta.id = antibody - meta.multiple_groups = groups.size() > 1 - meta.replicates_exist = groups.max { groups.value }.value > 1 - [ meta, peaks ] } + def meta_new = [:] + meta_new.id = antibody + meta_new.multiple_groups = groups.size() > 1 + meta_new.replicates_exist = groups.max { groups.value }.value > 1 + [ meta_new, peaks ] + } .set { ch_antibody_peaks } MACS2_CONSENSUS ( ch_antibody_peaks ) ch_macs2_consensus_bed_lib = MACS2_CONSENSUS.out.bed - ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) + ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { HOMER_ANNOTATEPEAKS_CONSENSUS ( @@ -542,29 +563,32 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(ANNOTATE_BOOLEAN_PEAKS.out.versions) } - // Create channel: [ val(meta), ip_bam ] + // Create channel: [ antibody, [ ip_bams ] ] + ch_ip_control_bam + .map { + meta, ip_bam, control_bam -> + [ meta.antibody, ip_bam ] + } + .groupTuple() + .set { ch_antibody_bams } + + // Create channel: [ meta, [ ip_bams ], saf ] MACS2_CONSENSUS .out .saf - .map { meta, saf -> [ meta.id, meta, saf ] } - .set { ch_ip_saf } - - ch_ip_control_bam - .map { meta, ip_bam, control_bam -> [ meta.antibody, meta, ip_bam ] } - .groupTuple() - .map { it -> [ it[0], it[1][0], it[2].flatten().sort() ] } - .join(ch_ip_saf) + .map { + meta, saf -> + [ meta.id, meta, saf ] + } + .join(ch_antibody_bams) .map { - it -> - def fmeta = it[1] - fmeta['id'] = it[3]['id'] - fmeta['replicates_exist'] = it[3]['replicates_exist'] - fmeta['multiple_groups'] = it[3]['multiple_groups'] - [ fmeta, it[2], it[4] ] } - .set { ch_ip_bam } + antibody, meta, saf, bams -> + [ meta, bams.flatten().sort(), saf ] + } + .set { ch_saf_bams } SUBREAD_FEATURECOUNTS ( - ch_ip_bam + ch_saf_bams ) ch_subreadfeaturecounts_multiqc = SUBREAD_FEATURECOUNTS.out.summary ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) @@ -590,13 +614,21 @@ workflow CHIPSEQ { ch_macs2_peaks.collect{it[1]}.ifEmpty([]), ch_macs2_consensus_bed_lib.collect{it[1]}.ifEmpty([]), { "${params.aligner}/mergedLibrary/bigwig" }, - { ["${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak' - ].join('') }, - { ["${params.aligner}/mergedLibrary/macs2", - params.narrow_peak? '/narrowPeak' : '/broadPeak', - '/consensus' - ].join('') } + { + [ + "${params.aligner}/mergedLibrary/macs2", + params.narrow_peak ? '/narrowPeak' : '/broadPeak' + ] + .join('') + }, + { + [ + "${params.aligner}/mergedLibrary/macs2", + params.narrow_peak ? '/narrowPeak' : '/broadPeak', + '/consensus' + ] + .join('') + } ) ch_versions = ch_versions.mix(IGV.out.versions) } From 3e1857d103aaef72f22a2e1cfbc62cb90b225e46 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:01:31 +0100 Subject: [PATCH 520/538] Remove antibody variable reference in DESeq2 module --- conf/modules.config | 1 + modules/local/deseq2_qc.nf | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 729c7734e..b46fec836 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -690,6 +690,7 @@ if (!params.skip_consensus_peaks) { '--count_col 7', params.deseq2_vst ? '--vst TRUE' : '' ].join(' ').trim() + ext.prefix = { "${meta.id}.consensus_peaks" } publishDir = [ path: { [ "${params.outdir}/${params.aligner}/mergedLibrary/macs2", diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index bdf5535af..7fc5a9f2a 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -27,8 +27,7 @@ process DESEQ2_QC { script: def args = task.ext.args ?: '' def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' - def antibody = meta.antibody - def prefix = "${antibody}.consensus_peaks" + def prefix = task.ext.prefix ?: "${meta.id}" """ deseq2_qc.r \\ --count_file $counts \\ @@ -38,11 +37,11 @@ process DESEQ2_QC { $args sed 's/deseq2_pca/deseq2_pca_${task.index}/g' <$deseq2_pca_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + sed -i -e 's/DESeq2 /${meta.id} DESeq2 /g' tmp.txt cat tmp.txt ${prefix}.pca.vals.txt > ${prefix}.pca.vals_mqc.tsv sed 's/deseq2_clustering/deseq2_clustering_${task.index}/g' <$deseq2_clustering_header >tmp.txt - sed -i -e 's/DESeq2 /${antibody} DESeq2 /g' tmp.txt + sed -i -e 's/DESeq2 /${meta.id} DESeq2 /g' tmp.txt cat tmp.txt ${prefix}.sample.dists.txt > ${prefix}.sample.dists_mqc.tsv cat <<-END_VERSIONS > versions.yml From d984c095fab3c7cdbf64585ab812652917f0a570 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:04:11 +0100 Subject: [PATCH 521/538] Switch deseq2_vst to true by default --- docs/output.md | 2 +- nextflow.config | 2 +- nextflow_schema.json | 31 ++++++++++++++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/docs/output.md b/docs/output.md index 6fde66dec..9dd852ebb 100644 --- a/docs/output.md +++ b/docs/output.md @@ -261,7 +261,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co **This pipeline uses a standardised DESeq2 analysis script to get an idea of the reproducibility within the experiment, and to assess the overall differential binding. Please note that this will not suit every experimental design, and if there are other problems with the experiment then it may not work as well as expected.** -For larger experiments, it may be recommended to use the `vst` transformation instead of the default `rlog` option. You can do this by providing the `--deseq2_vst` parameter to the pipeline. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. +For larger experiments, it is recommended to use the `vst` transformation instead of the default `rlog` option. This is the default behaviour and can be controlled with the `--deseq2_vst` parameter. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. ![MultiQC - DESeq2 PCA plot](images/mqc_deseq2_pca_plot.png) diff --git a/nextflow.config b/nextflow.config index 801b0c2f6..e7c2b71d1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -50,7 +50,7 @@ params { skip_consensus_peaks = false // Options: DESeq2 QC - deseq2_vst = false + deseq2_vst = true skip_deseq2_qc = false // Options: QC diff --git a/nextflow_schema.json b/nextflow_schema.json index ea0721e1b..839dc19e8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,9 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["outdir"], + "required": [ + "outdir" + ], "properties": { "input": { "type": "string", @@ -37,7 +39,13 @@ "type": "integer", "description": "Read length used to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", "fa_icon": "fas fa-chart-area", - "enum": [50, 75, 100, 150, 200] + "enum": [ + 50, + 75, + 100, + 150, + 200 + ] }, "outdir": { "type": "string", @@ -221,7 +229,12 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": ["bwa", "bowtie2", "chromap", "star"] + "enum": [ + "bwa", + "bowtie2", + "chromap", + "star" + ] }, "keep_dups": { "type": "boolean", @@ -348,7 +361,8 @@ "type": "boolean", "description": "Use vst transformation instead of rlog with DESeq2.", "help_text": "See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization).", - "fa_icon": "fas fa-dolly" + "fa_icon": "fas fa-dolly", + "default": true }, "skip_plot_profile": { "type": "boolean", @@ -489,7 +503,14 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], "hidden": true }, "fingerprint_bins": { From 3ea01409813f555735106fe73eca778cc15d9743 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:27:16 +0100 Subject: [PATCH 522/538] Add missing header comments to all modules/subworkflows --- workflows/chipseq.nf | 94 ++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 9a06c666c..01ec3eb90 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -182,7 +182,7 @@ workflow CHIPSEQ { } // - // SUBWORKFLOW: Alignment with BOWTIE2 & BAM QC + // SUBWORKFLOW: Alignment with Bowtie2 & BAM QC // if (params.aligner == 'bowtie2') { ALIGN_BOWTIE2 ( @@ -199,7 +199,7 @@ workflow CHIPSEQ { } // - // SUBWORKFLOW: Alignment with CHROMAP & BAM QC + // SUBWORKFLOW: Alignment with Chromap & BAM QC // if (params.aligner == 'chromap') { ALIGN_CHROMAP ( @@ -210,7 +210,7 @@ workflow CHIPSEQ { // Filter out paired-end reads until the issue below is fixed // https://github.com/nf-core/chipseq/issues/291 - // ch_genome_bam = ALIGN_CHROMAP.out.bam + // ch_genome_bam = ALIGN_CHROMAP.out.bam ALIGN_CHROMAP .out .bam @@ -220,9 +220,11 @@ workflow CHIPSEQ { return [ meta, bam ] paired_end: !meta.single_end return [ meta, bam ] - }.set { ch_genome_bam_chromap } + } + .set { ch_genome_bam_chromap } - ch_genome_bam_chromap.paired_end + ch_genome_bam_chromap + .paired_end .collect() .map { it -> @@ -264,7 +266,7 @@ workflow CHIPSEQ { } // - // SUBWORKFLOW: Merge resequenced BAM files + // MODULE: Merge resequenced BAM files // ch_genome_bam .map { @@ -306,7 +308,7 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(FILTER_BAM_BAMTOOLS.out.versions.first().ifEmpty(null)) // - // MODULE: Library coverage + // MODULE: Preseq coverage analysis // ch_preseq_multiqc = Channel.empty() if (!params.skip_preseq) { @@ -318,7 +320,7 @@ workflow CHIPSEQ { } // - // MODULE: Post alignment QC + // MODULE: Picard post alignment QC // ch_picardcollectmultiplemetrics_multiqc = Channel.empty() if (!params.skip_picard_metrics) { @@ -332,13 +334,16 @@ workflow CHIPSEQ { } // - // MODULE: Strand cross-correlation + // MODULE: Phantompeaktools strand cross-correlation and QC metrics // PHANTOMPEAKQUALTOOLS ( FILTER_BAM_BAMTOOLS.out.bam ) ch_versions = ch_versions.mix(PHANTOMPEAKQUALTOOLS.out.versions.first()) + // + // MODULE: MultiQC custom content for Phantompeaktools + // MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS ( PHANTOMPEAKQUALTOOLS.out.spp.join(PHANTOMPEAKQUALTOOLS.out.rdata, by: [0]), ch_spp_nsc_header, @@ -347,7 +352,7 @@ workflow CHIPSEQ { ) // - // MODULE: Coverage tracks + // MODULE: BedGraph coverage tracks // BEDTOOLS_GENOMECOV ( FILTER_BAM_BAMTOOLS.out.bam.join(FILTER_BAM_BAMTOOLS.out.flagstat, by: [0]) @@ -355,7 +360,7 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV.out.versions.first()) // - // MODULE: Coverage tracks + // MODULE: BigWig coverage tracks // UCSC_BEDGRAPHTOBIGWIG ( BEDTOOLS_GENOMECOV.out.bedgraph, @@ -363,23 +368,29 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions.first()) - // - // MODULE: Coverage plots - // ch_deeptoolsplotprofile_multiqc = Channel.empty() if (!params.skip_plot_profile) { + // + // MODULE: deepTools matrix generation for plotting + // DEEPTOOLS_COMPUTEMATRIX ( UCSC_BEDGRAPHTOBIGWIG.out.bigwig, PREPARE_GENOME.out.gene_bed ) ch_versions = ch_versions.mix(DEEPTOOLS_COMPUTEMATRIX.out.versions.first()) + // + // MODULE: deepTools profile plots + // DEEPTOOLS_PLOTPROFILE ( DEEPTOOLS_COMPUTEMATRIX.out.matrix ) ch_deeptoolsplotprofile_multiqc = DEEPTOOLS_PLOTPROFILE.out.table ch_versions = ch_versions.mix(DEEPTOOLS_PLOTPROFILE.out.versions.first()) + // + // MODULE: deepTools heatmaps + // DEEPTOOLS_PLOTHEATMAP ( DEEPTOOLS_COMPUTEMATRIX.out.matrix ) @@ -387,7 +398,7 @@ workflow CHIPSEQ { } // - // Refactor channels: [ meta, [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] + // Create channels: [ meta, [ ip_bam, control_bam ] [ ip_bai, control_bai ] ] // FILTER_BAM_BAMTOOLS .out @@ -404,7 +415,7 @@ workflow CHIPSEQ { .set { ch_ip_control_bam_bai } // - // plotFingerprint for IP and control together + // MODULE: deepTools plotFingerprint joint QC for IP and control // ch_deeptoolsplotfingerprint_multiqc = Channel.empty() if (!params.skip_plot_fingerprint) { @@ -416,7 +427,7 @@ workflow CHIPSEQ { } // - // Call peaks + // MODULE: Calculute genome size with khmer // ch_macs_gsize = Channel.empty() ch_custompeaks_frip_multiqc = Channel.empty() @@ -432,7 +443,7 @@ workflow CHIPSEQ { ch_macs_gsize = KHMER_UNIQUEKMERS.out.kmers.map { it.text.trim() } } - // Create channel: [ meta, ip_bam, control_bam ] + // Create channels: [ meta, ip_bam, control_bam ] ch_ip_control_bam_bai .map { meta, bams, bais -> @@ -440,6 +451,9 @@ workflow CHIPSEQ { } .set { ch_ip_control_bam } + // + // MODULE: Call peaks with MACS2 + // MACS2_CALLPEAK ( ch_ip_control_bam, ch_macs_gsize @@ -447,7 +461,7 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first()) // - // Filter for MACS2 files without peaks + // Filter out samples with 0 MACS2 peaks called // MACS2_CALLPEAK .out @@ -455,7 +469,7 @@ workflow CHIPSEQ { .filter { meta, peaks -> peaks.size() > 0 } .set { ch_macs2_peaks } - // Create channel: [ meta, ip_bam, peaks ] + // Create channels: [ meta, ip_bam, peaks ] ch_ip_control_bam .join(ch_macs2_peaks, by: [0]) .map { @@ -464,12 +478,15 @@ workflow CHIPSEQ { } .set { ch_ip_bam_peaks } + // + // MODULE: Calculate FRiP score + // FRIP_SCORE ( ch_ip_bam_peaks ) ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first()) - // Create channel: [ meta, peaks, frip ] + // Create channels: [ meta, peaks, frip ] ch_ip_bam_peaks .join(FRIP_SCORE.out.txt, by: [0]) .map { @@ -478,6 +495,9 @@ workflow CHIPSEQ { } .set { ch_ip_peaks_frip } + // + // MODULE: FRiP score custom content for MultiQC + // MULTIQC_CUSTOM_PEAKS ( ch_ip_peaks_frip, ch_peak_count_header, @@ -487,6 +507,9 @@ workflow CHIPSEQ { ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count if (!params.skip_peak_annotation) { +| // + // MODULE: Annotate peaks with MACS2 + // HOMER_ANNOTATEPEAKS_MACS2 ( ch_macs2_peaks, PREPARE_GENOME.out.fasta, @@ -495,11 +518,17 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first()) if (!params.skip_peak_qc) { + // + // MODULE: MACS2 QC plots with R + // PLOT_MACS2_QC ( ch_macs2_peaks.collect{it[1]} ) ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions) + // + // MODULE: Peak annotation QC plots with R + // PLOT_HOMER_ANNOTATEPEAKS ( HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]}, ch_peak_annotation_header, @@ -517,7 +546,7 @@ workflow CHIPSEQ { ch_deseq2_pca_multiqc = Channel.empty() ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_consensus_peaks) { - // Create channel: [ meta , [ peaks ] ] + // Create channels: [ meta , [ peaks ] ] // Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ] ch_macs2_peaks .map { @@ -543,6 +572,9 @@ workflow CHIPSEQ { } .set { ch_antibody_peaks } + // + // MODULE: Generate consensus peaks across samples + // MACS2_CONSENSUS ( ch_antibody_peaks ) @@ -550,6 +582,9 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { + // + // MODULE: Annotate consensus peaks + // HOMER_ANNOTATEPEAKS_CONSENSUS ( MACS2_CONSENSUS.out.bed, PREPARE_GENOME.out.fasta, @@ -557,13 +592,16 @@ workflow CHIPSEQ { ) ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_CONSENSUS.out.versions) + // + // MODULE: Add boolean fields to annotated consensus peaks to aid filtering + // ANNOTATE_BOOLEAN_PEAKS ( MACS2_CONSENSUS.out.boolean_txt.join(HOMER_ANNOTATEPEAKS_CONSENSUS.out.txt, by: [0]), ) ch_versions = ch_versions.mix(ANNOTATE_BOOLEAN_PEAKS.out.versions) } - // Create channel: [ antibody, [ ip_bams ] ] + // Create channels: [ antibody, [ ip_bams ] ] ch_ip_control_bam .map { meta, ip_bam, control_bam -> @@ -572,7 +610,7 @@ workflow CHIPSEQ { .groupTuple() .set { ch_antibody_bams } - // Create channel: [ meta, [ ip_bams ], saf ] + // Create channels: [ meta, [ ip_bams ], saf ] MACS2_CONSENSUS .out .saf @@ -587,6 +625,9 @@ workflow CHIPSEQ { } .set { ch_saf_bams } + // + // MODULE: Quantify peaks across samples with featureCounts + // SUBREAD_FEATURECOUNTS ( ch_saf_bams ) @@ -594,6 +635,9 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(SUBREAD_FEATURECOUNTS.out.versions.first()) if (!params.skip_deseq2_qc) { + // + // MODULE: Generate QC plots with DESeq2 + // DESEQ2_QC ( SUBREAD_FEATURECOUNTS.out.counts, ch_deseq2_pca_header, @@ -605,7 +649,7 @@ workflow CHIPSEQ { } // - // Create IGV session + // MODULE: Create IGV session // if (!params.skip_igv) { IGV ( From 42feb6f2e431a783af265943f9c8ef6de259f663 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:35:17 +0100 Subject: [PATCH 523/538] Fix bug --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 01ec3eb90..db6699e4d 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -507,7 +507,7 @@ workflow CHIPSEQ { ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count if (!params.skip_peak_annotation) { -| // + // // MODULE: Annotate peaks with MACS2 // HOMER_ANNOTATEPEAKS_MACS2 ( From 9e83c05e193cb508df03d02d7070128cfd0411af Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 13:38:27 +0100 Subject: [PATCH 524/538] Fix prettier --- nextflow_schema.json | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 839dc19e8..2a5f445c9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,9 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "outdir" - ], + "required": ["outdir"], "properties": { "input": { "type": "string", @@ -39,13 +37,7 @@ "type": "integer", "description": "Read length used to calculate MACS2 genome size for peak calling if `--macs_gsize` isn't provided.", "fa_icon": "fas fa-chart-area", - "enum": [ - 50, - 75, - 100, - 150, - 200 - ] + "enum": [50, 75, 100, 150, 200] }, "outdir": { "type": "string", @@ -229,12 +221,7 @@ "default": "bwa", "description": "Specifies the alignment algorithm to use - available options are 'bwa', 'bowtie2' and 'star'.", "fa_icon": "fas fa-map-signs", - "enum": [ - "bwa", - "bowtie2", - "chromap", - "star" - ] + "enum": ["bwa", "bowtie2", "chromap", "star"] }, "keep_dups": { "type": "boolean", @@ -503,14 +490,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "fingerprint_bins": { From e7c55164d3b0f51c70dfe7e629fba41c68c7e29e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Sep 2022 15:19:31 +0100 Subject: [PATCH 525/538] Update docs/output.md Co-authored-by: Jose Espinosa-Carrasco --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 9dd852ebb..b2c9bd0d9 100644 --- a/docs/output.md +++ b/docs/output.md @@ -261,7 +261,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co **This pipeline uses a standardised DESeq2 analysis script to get an idea of the reproducibility within the experiment, and to assess the overall differential binding. Please note that this will not suit every experimental design, and if there are other problems with the experiment then it may not work as well as expected.** -For larger experiments, it is recommended to use the `vst` transformation instead of the default `rlog` option. This is the default behaviour and can be controlled with the `--deseq2_vst` parameter. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. +For larger experiments, it is recommended to use the `vst` transformation instead of the `rlog` option. This is the default behaviour and can be controlled with the `--deseq2_vst` parameter. See [DESeq2 docs](http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization) for a more detailed explanation. ![MultiQC - DESeq2 PCA plot](images/mqc_deseq2_pca_plot.png) From a32cef82c21e914cec065bc2515863fd76d64eec Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Thu, 15 Sep 2022 16:55:30 +0200 Subject: [PATCH 526/538] Add missing ending tag --- docs/output.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/output.md b/docs/output.md index b2c9bd0d9..604310b57 100644 --- a/docs/output.md +++ b/docs/output.md @@ -97,6 +97,8 @@ The `--save_unaligned` parameter enables to obtain FastQ files containing unmapp - `*.Log.final.out`: STAR alignment report containing the mapping results summary. - `*.Log.out` and `*.Log.progress.out`: STAR log files containing detailed information about the run. Typically only useful for debugging purposes. +
+ ## Merged library-level analysis The library-level alignments associated with the same sample are merged and subsequently used for the downstream analyses. From ce0ed8d5250cc97a3b11d80a89ba70739b2746fe Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 16 Sep 2022 12:08:06 +0100 Subject: [PATCH 527/538] Remove redundanct comment --- workflows/chipseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index db6699e4d..06b95b37f 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -297,7 +297,7 @@ workflow CHIPSEQ { ch_versions = ch_versions.mix(MARK_DUPLICATES_PICARD.out.versions) // - // SUBWORKFLOW: Fix getting name sorted BAM here for PE/SE + // SUBWORKFLOW: Filter BAM file with BamTools // FILTER_BAM_BAMTOOLS ( MARK_DUPLICATES_PICARD.out.bam.join(MARK_DUPLICATES_PICARD.out.bai, by: [0]), From bcc970266308a4ae98edad252cfdeb2a61a4feab Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 16 Sep 2022 12:08:21 +0100 Subject: [PATCH 528/538] Change find command to be more specific --- modules/local/plot_homer_annotatepeaks.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/plot_homer_annotatepeaks.nf b/modules/local/plot_homer_annotatepeaks.nf index 11ed3daba..3375349a1 100644 --- a/modules/local/plot_homer_annotatepeaks.nf +++ b/modules/local/plot_homer_annotatepeaks.nf @@ -27,7 +27,7 @@ process PLOT_HOMER_ANNOTATEPEAKS { -p $prefix \\ $args - find ./ -type f -name "*.txt" -exec cat {} \\; | cat $mqc_header - > ${prefix}.summary_mqc.tsv + find ./ -type f -name "*summary.txt" -exec cat {} \\; | cat $mqc_header - > ${prefix}.summary_mqc.tsv cat <<-END_VERSIONS > versions.yml "${task.process}": From 255992d467e6519b1ea76bfa5d2ccfd82152f704 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 16 Sep 2022 12:22:41 +0100 Subject: [PATCH 529/538] Add tower.yml to render Reports for main files on Tower --- tower.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 tower.yml diff --git a/tower.yml b/tower.yml new file mode 100644 index 000000000..5b1f5f906 --- /dev/null +++ b/tower.yml @@ -0,0 +1,19 @@ +reports: + multiqc_report.html: + display: "MultiQC HTML report" + macs2_peak.plots.pdf: + display: "All samples MACS2 peak QC PDF plots" + macs2_annotatePeaks.plots.pdf: + display: "All samples HOMER annotatePeaks.pl QC PDF plots" + "*.consensus_peaks.plots.pdf": + display: "Consensus peaks DESeq2 QC PDF plots" + "*.consensus_peaks.boolean.intersect.plot.pdf": + display: "Consensus peaks UpSetR intersection PDF plots" + "*.consensus_peaks.boolean.annotatePeaks.txt": + display: "Consensus peaks annotated by HOMER" + "*.plotHeatmap.pdf": + display: "Per-sample deepTools plotHeatmap PDF plots" + "*_peaks.broadPeak": + display: "Per-sample MACS2 broadPeak file" + "*_peaks.narrowPeak": + display: "Per-sample MACS2 narrowPeak file" From 3ed06fa0c0fe9d868ec04c5bd4ff689cce4f81d7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 00:44:06 +0100 Subject: [PATCH 530/538] Remove pinning for R packages used in DESeq2 script --- modules/local/deseq2_qc.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/local/deseq2_qc.nf b/modules/local/deseq2_qc.nf index 7fc5a9f2a..84ff0d5f0 100644 --- a/modules/local/deseq2_qc.nf +++ b/modules/local/deseq2_qc.nf @@ -2,7 +2,9 @@ process DESEQ2_QC { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "conda-forge::r-base=4.0 bioconda::bioconductor-deseq2=1.28.0 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" : null) + // (Bio)conda packages have intentionally not been pinned to a specific version + // This was to avoid the pipeline failing due to package conflicts whilst creating the environment when using -profile conda + conda (params.enable_conda ? "conda-forge::r-base bioconda::bioconductor-deseq2 bioconda::bioconductor-biocparallel bioconda::bioconductor-tximport bioconda::bioconductor-complexheatmap conda-forge::r-optparse conda-forge::r-ggplot2 conda-forge::r-rcolorbrewer conda-forge::r-pheatmap" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' : 'quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' }" From 09ca349448aaeaa97ff5abb3c3cdc752872fcb98 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 00:48:48 +0100 Subject: [PATCH 531/538] Add antibody directory to consensus peaks in IGV session --- modules/local/igv.nf | 23 +++++++++++++---------- modules/local/macs2_consensus.nf | 4 +++- workflows/chipseq.nf | 21 +++++---------------- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/modules/local/igv.nf b/modules/local/igv.nf index 8578092b4..a500072c0 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -9,28 +9,31 @@ process IGV { 'quay.io/biocontainers/python:3.8.3' }" input: + val aligner_dir + val peak_dir path fasta - path ("${bigwig_publish_dir}/*") - path ("${peak_publish_dir}/*") - path ("${consensus_publish_dir}/*") - val bigwig_publish_dir - val peak_publish_dir - val consensus_publish_dir - + path ("${aligner_dir}/mergedLibrary/bigwig/*") + path ("${aligner_dir}/mergedLibrary/macs2/${peak_dir}/*") + path ("${aligner_dir}/mergedLibrary/macs2/${peak_dir}/consensus/*") + path ("mappings/*") + output: path "*files.txt" , emit: txt path "*.xml" , emit: xml path "versions.yml", emit: versions script: // scripts are bundled with the pipeline in nf-core/chipseq/bin/ + def consensus_dir = "${aligner_dir}/mergedLibrary/macs2/${peak_dir}/consensus/*" """ find * -type l -name "*.bigWig" -exec echo -e ""{}"\\t0,0,178" \\; > bigwig.igv.txt find * -type l -name "*Peak" -exec echo -e ""{}"\\t0,0,178" \\; > peaks.igv.txt # Avoid error when consensus not produced - find * -type l -name "*.bed" -exec echo -e ""{}"\\t0,0,178" \\; | { grep "^$consensus_publish_dir" || test \$? = 1; } > bed.igv.txt + find * -type l -name "*.bed" -exec echo -e ""{}"\\t0,0,178" \\; | { grep "^$consensus_dir" || test \$? = 1; } > consensus.igv.txt + + cat mappings/* > replace_paths.txt - cat *.txt > igv_files.txt - igv_files_to_session.py igv_session.xml igv_files.txt ../../genome/${fasta.getName()} --path_prefix '../../' + cat *.igv.txt > igv_files_orig.txt + igv_files_to_session.py igv_session.xml igv_files_orig.txt replace_paths.txt ../../genome/${fasta.getName()} --path_prefix '../../' cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/macs2_consensus.nf b/modules/local/macs2_consensus.nf index f28dc732e..ab9ef93a2 100644 --- a/modules/local/macs2_consensus.nf +++ b/modules/local/macs2_consensus.nf @@ -17,6 +17,7 @@ process MACS2_CONSENSUS { tuple val(meta), path("*.bed") , emit: bed tuple val(meta), path("*.saf") , emit: saf tuple val(meta), path("*.pdf") , emit: pdf + tuple val(meta), path("*.antibody.txt") , emit: txt tuple val(meta), path("*.boolean.txt") , emit: boolean_txt tuple val(meta), path("*.intersect.txt"), emit: intersect_txt path "versions.yml" , emit: versions @@ -25,7 +26,6 @@ process MACS2_CONSENSUS { task.ext.when == null || task.ext.when script: // This script is bundled with the pipeline, in nf-core/chipseq/bin/ - def prefix = task.ext.prefix ?: "${meta.id}" def peak_type = params.narrow_peak ? 'narrowPeak' : 'broadPeak' def mergecols = params.narrow_peak ? (2..10).join(',') : (2..9).join(',') @@ -49,6 +49,8 @@ process MACS2_CONSENSUS { plot_peak_intersect.r -i ${prefix}.boolean.intersect.txt -o ${prefix}.boolean.intersect.plot.pdf + echo "${prefix}.bed\t${meta.id}/${prefix}.bed" > ${prefix}.antibody.txt + cat <<-END_VERSIONS > versions.yml "${task.process}": python: \$(python --version | sed 's/Python //g') diff --git a/workflows/chipseq.nf b/workflows/chipseq.nf index 06b95b37f..ffe995186 100644 --- a/workflows/chipseq.nf +++ b/workflows/chipseq.nf @@ -543,6 +543,7 @@ workflow CHIPSEQ { // Consensus peaks analysis // ch_macs2_consensus_bed_lib = Channel.empty() + ch_macs2_consensus_txt_lib = Channel.empty() ch_deseq2_pca_multiqc = Channel.empty() ch_deseq2_clustering_multiqc = Channel.empty() if (!params.skip_consensus_peaks) { @@ -579,6 +580,7 @@ workflow CHIPSEQ { ch_antibody_peaks ) ch_macs2_consensus_bed_lib = MACS2_CONSENSUS.out.bed + ch_macs2_consensus_txt_lib = MACS2_CONSENSUS.out.txt ch_versions = ch_versions.mix(MACS2_CONSENSUS.out.versions) if (!params.skip_peak_annotation) { @@ -653,26 +655,13 @@ workflow CHIPSEQ { // if (!params.skip_igv) { IGV ( + params.aligner, + params.narrow_peak ? 'narrowPeak' : 'broadPeak', PREPARE_GENOME.out.fasta, UCSC_BEDGRAPHTOBIGWIG.out.bigwig.collect{it[1]}.ifEmpty([]), ch_macs2_peaks.collect{it[1]}.ifEmpty([]), ch_macs2_consensus_bed_lib.collect{it[1]}.ifEmpty([]), - { "${params.aligner}/mergedLibrary/bigwig" }, - { - [ - "${params.aligner}/mergedLibrary/macs2", - params.narrow_peak ? '/narrowPeak' : '/broadPeak' - ] - .join('') - }, - { - [ - "${params.aligner}/mergedLibrary/macs2", - params.narrow_peak ? '/narrowPeak' : '/broadPeak', - '/consensus' - ] - .join('') - } + ch_macs2_consensus_txt_lib.collect{it[1]}.ifEmpty([]) ) ch_versions = ch_versions.mix(IGV.out.versions) } From 80fd01c0b2f3c929fe90ef573456248fd6c5c242 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 00:49:44 +0100 Subject: [PATCH 532/538] Update date in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 289c062c2..1f475919c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[2.0.0](https://github.com/nf-core/chipseq/releases/tag/2.0.0)] - 2022-09-30 +## [[2.0.0](https://github.com/nf-core/chipseq/releases/tag/2.0.0)] - 2022-10-03 ### Enhancements & fixes From 40db9a5504d2a9f925175f92d10b4f43d0060aa9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 01:06:35 +0100 Subject: [PATCH 533/538] Update igv_files_to_session.py script --- bin/igv_files_to_session.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/bin/igv_files_to_session.py b/bin/igv_files_to_session.py index ce1fac70f..f10453eec 100755 --- a/bin/igv_files_to_session.py +++ b/bin/igv_files_to_session.py @@ -26,6 +26,9 @@ argParser.add_argument( "LIST_FILE", help="Tab-delimited file containing two columns i.e. file_name\tcolour. Header isnt required." ) +argParser.add_argument( + "REPLACE_FILE", help="Tab-delimited file containing two columns i.e. file_name\treplacement_file_name. Header isnt required." +) argParser.add_argument( "GENOME", help="Full path to genome fasta file or shorthand for genome available in IGV e.g. hg19." ) @@ -65,10 +68,21 @@ def makedir(path): ############################################ -def igv_files_to_session(XMLOut, ListFile, Genome, PathPrefix=""): +def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): makedir(os.path.dirname(XMLOut)) + replaceFileDict = {} + fin = open(ReplaceFile, "r") + while True: + line = fin.readline() + if line: + ofile, rfile = line.strip().split("\t") + replaceFileDict[ofile] = rfile + else: + break + fin.close() + fileList = [] fin = open(ListFile, "r") while True: @@ -77,10 +91,18 @@ def igv_files_to_session(XMLOut, ListFile, Genome, PathPrefix=""): ifile, colour = line.strip().split("\t") if len(colour.strip()) == 0: colour = "0,0,178" + for ofile,rfile in replaceFileDict.items(): + if ofile in ifile: + ifile = ifile.replace(ofile, rfile) fileList.append((PathPrefix.strip() + ifile, colour)) else: break - fout.close() + fin.close() + + fout = open('igv_files.txt', "w") + for ifile, colour in fileList: + fout.write(ifile + '\n') + fout.close() ## ADD RESOURCES SECTION XMLStr = '\n' @@ -153,7 +175,7 @@ def igv_files_to_session(XMLOut, ListFile, Genome, PathPrefix=""): ############################################ ############################################ -igv_files_to_session(XMLOut=args.XML_OUT, ListFile=args.LIST_FILE, Genome=args.GENOME, PathPrefix=args.PATH_PREFIX) +igv_files_to_session(XMLOut=args.XML_OUT, ListFile=args.LIST_FILE, ReplaceFile=args.REPLACE_FILE, Genome=args.GENOME, PathPrefix=args.PATH_PREFIX) ############################################ ############################################ From 6f8a372b6fb9c70c2846a3fb40af84174867c09f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 09:29:21 +0100 Subject: [PATCH 534/538] Fix if no consensus peaks are provided --- modules/local/igv.nf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/local/igv.nf b/modules/local/igv.nf index a500072c0..137abbb4b 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -30,8 +30,11 @@ process IGV { # Avoid error when consensus not produced find * -type l -name "*.bed" -exec echo -e ""{}"\\t0,0,178" \\; | { grep "^$consensus_dir" || test \$? = 1; } > consensus.igv.txt - cat mappings/* > replace_paths.txt - + touch replace_paths.txt + if [ -d "mappings" ]; then + cat mappings/* > replace_paths.txt + fi + cat *.igv.txt > igv_files_orig.txt igv_files_to_session.py igv_session.xml igv_files_orig.txt replace_paths.txt ../../genome/${fasta.getName()} --path_prefix '../../' From 6428b3f9a18f75a711716d364c2f88f80e9ccf36 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 09:31:06 +0100 Subject: [PATCH 535/538] Black --- bin/igv_files_to_session.py | 39 ++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/bin/igv_files_to_session.py b/bin/igv_files_to_session.py index f10453eec..08e5adf98 100755 --- a/bin/igv_files_to_session.py +++ b/bin/igv_files_to_session.py @@ -17,20 +17,25 @@ ############################################ Description = 'Create IGV session file from a list of files and associated colours - ".bed", ".bw", ".bigwig", ".tdf", ".gtf" files currently supported.' -Epilog = """Example usage: python igv_files_to_session.py """ +Epilog = ( + """Example usage: python igv_files_to_session.py """ +) argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) ## REQUIRED PARAMETERS argParser.add_argument("XML_OUT", help="XML output file.") argParser.add_argument( - "LIST_FILE", help="Tab-delimited file containing two columns i.e. file_name\tcolour. Header isnt required." + "LIST_FILE", + help="Tab-delimited file containing two columns i.e. file_name\tcolour. Header isnt required.", ) argParser.add_argument( - "REPLACE_FILE", help="Tab-delimited file containing two columns i.e. file_name\treplacement_file_name. Header isnt required." + "REPLACE_FILE", + help="Tab-delimited file containing two columns i.e. file_name\treplacement_file_name. Header isnt required.", ) argParser.add_argument( - "GENOME", help="Full path to genome fasta file or shorthand for genome available in IGV e.g. hg19." + "GENOME", + help="Full path to genome fasta file or shorthand for genome available in IGV e.g. hg19.", ) ## OPTIONAL PARAMETERS @@ -82,7 +87,6 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): else: break fin.close() - fileList = [] fin = open(ListFile, "r") while True: @@ -91,22 +95,24 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): ifile, colour = line.strip().split("\t") if len(colour.strip()) == 0: colour = "0,0,178" - for ofile,rfile in replaceFileDict.items(): + for ofile, rfile in replaceFileDict.items(): if ofile in ifile: ifile = ifile.replace(ofile, rfile) fileList.append((PathPrefix.strip() + ifile, colour)) else: break fin.close() - - fout = open('igv_files.txt', "w") + fout = open("igv_files.txt", "w") for ifile, colour in fileList: - fout.write(ifile + '\n') + fout.write(ifile + "\n") fout.close() ## ADD RESOURCES SECTION XMLStr = '\n' - XMLStr += '\n' % (Genome) + XMLStr += ( + '\n' + % (Genome) + ) XMLStr += "\t\n" for ifile, colour in fileList: XMLStr += '\t\t\n' % (ifile) @@ -143,7 +149,9 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): '\t\t\n' % (ifile, os.path.basename(ifile)) @@ -160,7 +168,6 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): 'id="%s" name="%s" renderer="BASIC_FEATURE" sortable="false" visible="true" windowFunction="count"/>\n' % (ifile, os.path.basename(ifile)) ) - XMLStr += "\t\n" # XMLStr += '\t\n\t\t\n\t\t\n\t\t\n\t\n' XMLStr += "" @@ -175,7 +182,13 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): ############################################ ############################################ -igv_files_to_session(XMLOut=args.XML_OUT, ListFile=args.LIST_FILE, ReplaceFile=args.REPLACE_FILE, Genome=args.GENOME, PathPrefix=args.PATH_PREFIX) +igv_files_to_session( + XMLOut=args.XML_OUT, + ListFile=args.LIST_FILE, + ReplaceFile=args.REPLACE_FILE, + Genome=args.GENOME, + PathPrefix=args.PATH_PREFIX, +) ############################################ ############################################ From ed10bb9d2ad4c758b7157b25a16d157cfbc6259d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 2 Oct 2022 11:48:10 +0100 Subject: [PATCH 536/538] Fix linting --- bin/igv_files_to_session.py | 13 +++---------- modules/local/igv.nf | 4 ++-- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/bin/igv_files_to_session.py b/bin/igv_files_to_session.py index 08e5adf98..629e6cc91 100755 --- a/bin/igv_files_to_session.py +++ b/bin/igv_files_to_session.py @@ -17,9 +17,7 @@ ############################################ Description = 'Create IGV session file from a list of files and associated colours - ".bed", ".bw", ".bigwig", ".tdf", ".gtf" files currently supported.' -Epilog = ( - """Example usage: python igv_files_to_session.py """ -) +Epilog = """Example usage: python igv_files_to_session.py """ argParser = argparse.ArgumentParser(description=Description, epilog=Epilog) @@ -109,10 +107,7 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): ## ADD RESOURCES SECTION XMLStr = '\n' - XMLStr += ( - '\n' - % (Genome) - ) + XMLStr += '\n' % (Genome) XMLStr += "\t\n" for ifile, colour in fileList: XMLStr += '\t\t\n' % (ifile) @@ -149,9 +144,7 @@ def igv_files_to_session(XMLOut, ListFile, ReplaceFile, Genome, PathPrefix=""): '\t\t\n' % (ifile, os.path.basename(ifile)) diff --git a/modules/local/igv.nf b/modules/local/igv.nf index 137abbb4b..213904b3e 100644 --- a/modules/local/igv.nf +++ b/modules/local/igv.nf @@ -16,7 +16,7 @@ process IGV { path ("${aligner_dir}/mergedLibrary/macs2/${peak_dir}/*") path ("${aligner_dir}/mergedLibrary/macs2/${peak_dir}/consensus/*") path ("mappings/*") - + output: path "*files.txt" , emit: txt path "*.xml" , emit: xml @@ -34,7 +34,7 @@ process IGV { if [ -d "mappings" ]; then cat mappings/* > replace_paths.txt fi - + cat *.igv.txt > igv_files_orig.txt igv_files_to_session.py igv_session.xml igv_files_orig.txt replace_paths.txt ../../genome/${fasta.getName()} --path_prefix '../../' From f62ea83333b998fc544a746be8a18f276babb35c Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Sun, 2 Oct 2022 23:29:55 +0200 Subject: [PATCH 537/538] Add back antibody to consensus paths in output description --- docs/output.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/output.md b/docs/output.md index 604310b57..b31985543 100644 --- a/docs/output.md +++ b/docs/output.md @@ -217,7 +217,7 @@ Various QC plots per sample including number of peaks, fold-change distribution,
Output files -- `/mergedLibrary/macs2//consensus` +- `/mergedLibrary/macs2//consensus//` - `*.bed`: Consensus peak-set across all samples in BED format. - `*.saf`: Consensus peak-set across all samples in SAF format. Required by featureCounts for read quantification. - `*.featureCounts.txt`: Read counts across all samples relative to consensus peak-set. @@ -245,7 +245,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co
Output files -- `/mergedLibrary/macs2//consensus/deseq2/` +- `/mergedLibrary/macs2//consensus//deseq2/` - `*.sample.dists.txt`: Spreadsheet containing sample-to-sample distance across each consensus peak. - `*.plots.pdf`: File containing PCA and hierarchical clustering plots. - `*.dds.RData`: File containing R `DESeqDataSet` object generated by DESeq2, with either @@ -254,7 +254,7 @@ The [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) tool is used to co `readRDS` to give user control of the eventual object name. - `*pca.vals.txt`: Matrix of values for the first 2 principal components. - `R_sessionInfo.log`: File containing information about R, the OS and attached or loaded packages. - - `/mergedLibrary/macs2//consensus/deseq2/sizeFactors/` + - `/mergedLibrary/macs2//consensus//sizeFactors/` - `*.txt`, `*.RData`: Files containing DESeq2 sizeFactors per sample.
From f96dfd688068aa0036cfe9af3b6cb2093a7eda89 Mon Sep 17 00:00:00 2001 From: JoseEspinosa Date: Mon, 3 Oct 2022 16:41:28 +0200 Subject: [PATCH 538/538] Update changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f475919c..ea9b46068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Eliminate `if` conditions from `deseq2_qc` and `macs2_consensus` (local module and use `ext.when` instead) - Remove `deseq2` differential binding analysis of consensus peaks. - [[280](https://github.com/nf-core/chipseq/issues/291) - Filter paired-end files produced by `chromap` since the resulting `BAM` files can not be processed downstream. -- Remove from the macs2 consensus publish directory since it can not be referred as input from the IGV process (meta.id not resolved at execution time) - Add bytesize link to readme. ### Parameters
\n" + for (param in group_params.keySet()) { + summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" + } + summary_section += "
\n" + for (param in group_params.keySet()) { + summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" + } + summary_section += "