Skip to content

Commit a7a9f83

Browse files
Bjorn LangerBjorn Langer
Bjorn Langer
authored and
Bjorn Langer
committed
use subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer from nf-core/atacsec
1 parent 53c152c commit a7a9f83

File tree

2 files changed

+173
-100
lines changed

2 files changed

+173
-100
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
//
2+
// Call peaks with MACS2, annotate with HOMER and perform downstream QC
3+
//
4+
5+
include { MACS2_CALLPEAK } from '../../modules/nf-core/macs2/callpeak/main'
6+
include { HOMER_ANNOTATEPEAKS } from '../../modules/nf-core/homer/annotatepeaks/main'
7+
8+
include { FRIP_SCORE } from '../../modules/local/frip_score'
9+
include { MULTIQC_CUSTOM_PEAKS } from '../../modules/local/multiqc_custom_peaks'
10+
include { PLOT_MACS2_QC } from '../../modules/local/plot_macs2_qc'
11+
include { PLOT_HOMER_ANNOTATEPEAKS } from '../../modules/local/plot_homer_annotatepeaks'
12+
13+
workflow BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER {
14+
take:
15+
ch_bam // channel: [ val(meta), [ ip_bam ], [ control_bam ] ]
16+
ch_fasta // channel: [ fasta ]
17+
ch_gtf // channel: [ gtf ]
18+
macs_gsize // integer: value for --macs_gsize parameter
19+
annotate_peaks_suffix // string: suffix for input HOMER annotate peaks files to be trimmed off
20+
ch_peak_count_header_multiqc // channel: [ header_file ]
21+
ch_frip_score_multiqc // channel: [ header_file ]
22+
ch_peak_annotation_header_multiqc // channel: [ header_file ]
23+
is_narrow_peak // boolean: true/false
24+
skip_peak_annotation // boolean: true/false
25+
skip_peak_qc // boolean: true/false
26+
27+
main:
28+
29+
ch_versions = Channel.empty()
30+
31+
//
32+
// Call peaks with MACS2
33+
//
34+
MACS2_CALLPEAK (
35+
ch_bam,
36+
macs_gsize
37+
)
38+
ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first())
39+
40+
//
41+
// Filter out samples with 0 MACS2 peaks called
42+
//
43+
MACS2_CALLPEAK
44+
.out
45+
.peak
46+
.filter {
47+
meta, peaks ->
48+
peaks.size() > 0
49+
}
50+
.set { ch_macs2_peaks }
51+
52+
// Create channels: [ meta, ip_bam, peaks ]
53+
ch_bam
54+
.join(ch_macs2_peaks, by: [0])
55+
.map {
56+
meta, ip_bam, control_bam, peaks ->
57+
[ meta, ip_bam, peaks ]
58+
}
59+
.set { ch_bam_peaks }
60+
61+
//
62+
// Calculate FRiP score
63+
//
64+
FRIP_SCORE (
65+
ch_bam_peaks
66+
)
67+
ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first())
68+
69+
// Create channels: [ meta, peaks, frip ]
70+
ch_bam_peaks
71+
.join(FRIP_SCORE.out.txt, by: [0])
72+
.map {
73+
meta, ip_bam, peaks, frip ->
74+
[ meta, peaks, frip ]
75+
}
76+
.set { ch_bam_peak_frip }
77+
78+
//
79+
// FRiP score custom content for MultiQC
80+
//
81+
MULTIQC_CUSTOM_PEAKS (
82+
ch_bam_peak_frip,
83+
ch_peak_count_header_multiqc,
84+
ch_frip_score_multiqc
85+
)
86+
ch_versions = ch_versions.mix(MULTIQC_CUSTOM_PEAKS.out.versions.first())
87+
88+
ch_homer_annotatepeaks = Channel.empty()
89+
ch_plot_macs2_qc_txt = Channel.empty()
90+
ch_plot_macs2_qc_pdf = Channel.empty()
91+
ch_plot_homer_annotatepeaks_txt = Channel.empty()
92+
ch_plot_homer_annotatepeaks_pdf = Channel.empty()
93+
ch_plot_homer_annotatepeaks_tsv = Channel.empty()
94+
if (!skip_peak_annotation) {
95+
//
96+
// Annotate peaks with HOMER
97+
//
98+
HOMER_ANNOTATEPEAKS (
99+
ch_macs2_peaks,
100+
ch_fasta,
101+
ch_gtf
102+
)
103+
ch_homer_annotatepeaks = HOMER_ANNOTATEPEAKS.out.txt
104+
ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS.out.versions.first())
105+
106+
if (!skip_peak_qc) {
107+
//
108+
// MACS2 QC plots with R
109+
//
110+
PLOT_MACS2_QC (
111+
ch_macs2_peaks.collect{it[1]},
112+
is_narrow_peak
113+
)
114+
ch_plot_macs2_qc_txt = PLOT_MACS2_QC.out.txt
115+
ch_plot_macs2_qc_pdf = PLOT_MACS2_QC.out.pdf
116+
ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions)
117+
118+
//
119+
// Peak annotation QC plots with R
120+
//
121+
PLOT_HOMER_ANNOTATEPEAKS (
122+
HOMER_ANNOTATEPEAKS.out.txt.collect{it[1]},
123+
ch_peak_annotation_header_multiqc,
124+
annotate_peaks_suffix
125+
)
126+
ch_plot_homer_annotatepeaks_txt = PLOT_HOMER_ANNOTATEPEAKS.out.txt
127+
ch_plot_homer_annotatepeaks_pdf = PLOT_HOMER_ANNOTATEPEAKS.out.pdf
128+
ch_plot_homer_annotatepeaks_tsv = PLOT_HOMER_ANNOTATEPEAKS.out.tsv
129+
ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions)
130+
}
131+
}
132+
133+
emit:
134+
peaks = ch_macs2_peaks // channel: [ val(meta), [ peaks ] ]
135+
xls = MACS2_CALLPEAK.out.xls // channel: [ val(meta), [ xls ] ]
136+
gapped_peaks = MACS2_CALLPEAK.out.gapped // channel: [ val(meta), [ gapped_peak ] ]
137+
bed = MACS2_CALLPEAK.out.bed // channel: [ val(meta), [ bed ] ]
138+
bedgraph = MACS2_CALLPEAK.out.bdg // channel: [ val(meta), [ bedgraph ] ]
139+
140+
frip_txt = FRIP_SCORE.out.txt // channel: [ val(meta), [ txt ] ]
141+
142+
frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip // channel: [ val(meta), [ frip ] ]
143+
peak_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count // channel: [ val(meta), [ counts ] ]
144+
145+
homer_annotatepeaks = ch_homer_annotatepeaks // channel: [ val(meta), [ txt ] ]
146+
147+
plot_macs2_qc_txt = ch_plot_macs2_qc_txt // channel: [ txt ]
148+
plot_macs2_qc_pdf = ch_plot_macs2_qc_pdf // channel: [ pdf ]
149+
150+
plot_homer_annotatepeaks_txt = ch_plot_homer_annotatepeaks_txt // channel: [ txt ]
151+
plot_homer_annotatepeaks_pdf = ch_plot_homer_annotatepeaks_pdf // channel: [ pdf ]
152+
plot_homer_annotatepeaks_tsv = ch_plot_homer_annotatepeaks_tsv // channel: [ tsv ]
153+
154+
versions = ch_versions // channel: [ versions.yml ]
155+
}

workflows/chipseq.nf

+18-100
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@
77
//
88
// MODULE: Loaded from modules/local/
99
//
10-
include { FRIP_SCORE } from '../modules/local/frip_score'
11-
include { PLOT_MACS2_QC } from '../modules/local/plot_macs2_qc'
12-
include { PLOT_HOMER_ANNOTATEPEAKS } from '../modules/local/plot_homer_annotatepeaks'
1310
include { MACS2_CONSENSUS } from '../modules/local/macs2_consensus'
1411
include { ANNOTATE_BOOLEAN_PEAKS } from '../modules/local/annotate_boolean_peaks'
1512
include { DESEQ2_QC } from '../modules/local/deseq2_qc'
1613
include { IGV } from '../modules/local/igv'
1714
include { MULTIQC } from '../modules/local/multiqc'
1815
include { MULTIQC_CUSTOM_PHANTOMPEAKQUALTOOLS } from '../modules/local/multiqc_custom_phantompeakqualtools'
19-
include { MULTIQC_CUSTOM_PEAKS } from '../modules/local/multiqc_custom_peaks'
2016

2117
//
2218
// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules
@@ -29,6 +25,7 @@ include { INPUT_CHECK } from '../subworkflows/local/i
2925
include { ALIGN_STAR } from '../subworkflows/local/align_star'
3026
include { BAM_FILTER_BAMTOOLS } from '../subworkflows/local/bam_filter_bamtools'
3127
include { BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC } from '../subworkflows/local/bam_bedgraph_bigwig_bedtools_ucsc'
28+
include { BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER } from '../subworkflows/local/bam_peaks_call_qc_annotate_macs2_homer.nf'
3229

3330
/*
3431
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -49,10 +46,8 @@ include { DEEPTOOLS_PLOTPROFILE } from '../modules/nf-core/deeptools/plo
4946
include { DEEPTOOLS_PLOTHEATMAP } from '../modules/nf-core/deeptools/plotheatmap/main'
5047
include { DEEPTOOLS_PLOTFINGERPRINT } from '../modules/nf-core/deeptools/plotfingerprint/main'
5148
include { KHMER_UNIQUEKMERS } from '../modules/nf-core/khmer/uniquekmers/main'
52-
include { MACS2_CALLPEAK } from '../modules/nf-core/macs2/callpeak/main'
5349
include { SUBREAD_FEATURECOUNTS } from '../modules/nf-core/subread/featurecounts/main'
5450

55-
include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_MACS2 } from '../modules/nf-core/homer/annotatepeaks/main'
5651
include { HOMER_ANNOTATEPEAKS as HOMER_ANNOTATEPEAKS_CONSENSUS } from '../modules/nf-core/homer/annotatepeaks/main'
5752

5853
//
@@ -437,9 +432,6 @@ workflow CHIPSEQ {
437432
//
438433
// TODO move to prepare genome
439434
ch_macs_gsize = Channel.empty()
440-
ch_custompeaks_frip_multiqc = Channel.empty()
441-
ch_custompeaks_count_multiqc = Channel.empty()
442-
ch_plothomerannotatepeaks_multiqc = Channel.empty()
443435
ch_subreadfeaturecounts_multiqc = Channel.empty()
444436
ch_macs_gsize = params.macs_gsize
445437
if (!params.macs_gsize) {
@@ -459,96 +451,22 @@ workflow CHIPSEQ {
459451
.set { ch_ip_control_bam }
460452

461453
//
462-
// MODULE: Call peaks with MACS2
454+
// SUBWORKFLOW: Call peaks with MACS2, annotate with HOMER and perform downstream QC
463455
//
464-
MACS2_CALLPEAK (
456+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER (
465457
ch_ip_control_bam,
466-
ch_macs_gsize
467-
)
468-
ch_versions = ch_versions.mix(MACS2_CALLPEAK.out.versions.first())
469-
470-
//
471-
// Filter out samples with 0 MACS2 peaks called
472-
//
473-
MACS2_CALLPEAK
474-
.out
475-
.peak
476-
.filter {
477-
meta, peaks ->
478-
peaks.size() > 0
479-
}
480-
.set { ch_macs2_peaks }
481-
482-
// Create channels: [ meta, ip_bam, peaks ]
483-
ch_ip_control_bam
484-
.join(ch_macs2_peaks, by: [0])
485-
.map {
486-
it ->
487-
[ it[0], it[1], it[3] ]
488-
}
489-
.set { ch_ip_bam_peaks }
490-
491-
//
492-
// MODULE: Calculate FRiP score
493-
//
494-
FRIP_SCORE (
495-
ch_ip_bam_peaks
496-
)
497-
ch_versions = ch_versions.mix(FRIP_SCORE.out.versions.first())
498-
499-
// Create channels: [ meta, peaks, frip ]
500-
ch_ip_bam_peaks
501-
.join(FRIP_SCORE.out.txt, by: [0])
502-
.map {
503-
it ->
504-
[ it[0], it[2], it[3] ]
505-
}
506-
.set { ch_ip_peaks_frip }
507-
508-
//
509-
// MODULE: FRiP score custom content for MultiQC
510-
//
511-
MULTIQC_CUSTOM_PEAKS (
512-
ch_ip_peaks_frip,
458+
ch_fasta,
459+
ch_gtf,
460+
ch_macs_gsize,
461+
"_peaks.annotatePeaks.txt",
513462
ch_peak_count_header,
514-
ch_frip_score_header
463+
ch_frip_score_header,
464+
ch_peak_annotation_header,
465+
params.narrow_peak,
466+
params.skip_peak_annotation,
467+
params.skip_peak_qc
515468
)
516-
ch_custompeaks_frip_multiqc = MULTIQC_CUSTOM_PEAKS.out.frip
517-
ch_custompeaks_count_multiqc = MULTIQC_CUSTOM_PEAKS.out.count
518-
519-
if (!params.skip_peak_annotation) {
520-
//
521-
// MODULE: Annotate peaks with MACS2
522-
//
523-
HOMER_ANNOTATEPEAKS_MACS2 (
524-
ch_macs2_peaks,
525-
ch_fasta,
526-
ch_gtf
527-
)
528-
ch_versions = ch_versions.mix(HOMER_ANNOTATEPEAKS_MACS2.out.versions.first())
529-
530-
if (!params.skip_peak_qc) {
531-
//
532-
// MODULE: MACS2 QC plots with R
533-
//
534-
PLOT_MACS2_QC (
535-
ch_macs2_peaks.collect{it[1]},
536-
params.narrow_peak
537-
)
538-
ch_versions = ch_versions.mix(PLOT_MACS2_QC.out.versions)
539-
540-
//
541-
// MODULE: Peak annotation QC plots with R
542-
//
543-
PLOT_HOMER_ANNOTATEPEAKS (
544-
HOMER_ANNOTATEPEAKS_MACS2.out.txt.collect{it[1]},
545-
ch_peak_annotation_header,
546-
"_peaks.annotatePeaks.txt"
547-
)
548-
ch_plothomerannotatepeaks_multiqc = PLOT_HOMER_ANNOTATEPEAKS.out.tsv
549-
ch_versions = ch_versions.mix(PLOT_HOMER_ANNOTATEPEAKS.out.versions)
550-
}
551-
}
469+
ch_versions = ch_versions.mix(MERGED_LIBRARY_CALL_ANNOTATE_PEAKS.out.versions)
552470

553471
//
554472
// Consensus peaks analysis
@@ -560,7 +478,7 @@ workflow CHIPSEQ {
560478
if (!params.skip_consensus_peaks) {
561479
// Create channels: [ meta , [ peaks ] ]
562480
// Where meta = [ id:antibody, multiple_groups:true/false, replicates_exist:true/false ]
563-
ch_macs2_peaks
481+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER.out.peaks
564482
.map {
565483
meta, peak ->
566484
[ meta.antibody, meta.id.split('_')[0..-2].join('_'), peak ]
@@ -671,7 +589,7 @@ workflow CHIPSEQ {
671589
params.narrow_peak ? 'narrow_peak' : 'broad_peak',
672590
ch_fasta,
673591
BAM_BEDGRAPH_BIGWIG_BEDTOOLS_UCSC.out.bigwig.collect{it[1]}.ifEmpty([]),
674-
ch_macs2_peaks.collect{it[1]}.ifEmpty([]),
592+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER.out.peaks.collect{it[1]}.ifEmpty([]),
675593
ch_macs2_consensus_bed_lib.collect{it[1]}.ifEmpty([]),
676594
ch_macs2_consensus_txt_lib.collect{it[1]}.ifEmpty([])
677595
)
@@ -731,9 +649,9 @@ workflow CHIPSEQ {
731649
ch_multiqc_phantompeakqualtools_rsc_multiqc.collect{it[1]}.ifEmpty([]),
732650
ch_multiqc_phantompeakqualtools_correlation_multiqc.collect{it[1]}.ifEmpty([]),
733651

734-
ch_custompeaks_frip_multiqc.collect{it[1]}.ifEmpty([]),
735-
ch_custompeaks_count_multiqc.collect{it[1]}.ifEmpty([]),
736-
ch_plothomerannotatepeaks_multiqc.collect().ifEmpty([]),
652+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER.out.frip_multiqc.collect{it[1]}.ifEmpty([]),
653+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER.out.peak_count_multiqc.collect{it[1]}.ifEmpty([]),
654+
BAM_PEAKS_CALL_QC_ANNOTATE_MACS2_HOMER.out.plot_homer_annotatepeaks_tsv.collect().ifEmpty([]),
737655
ch_subreadfeaturecounts_multiqc.collect{it[1]}.ifEmpty([]),
738656

739657
ch_deseq2_pca_multiqc.collect().ifEmpty([]),

0 commit comments

Comments
 (0)