Skip to content

Commit 2d2c534

Browse files
tpshea2claude
andcommitted
Add HvpMagsPipeline WDL and supporting task files
Introduces full MAG/binning workflow: JgiDepth → MetaBAT2 + MaxBin2 + SemiBin2 → DAS_Tool → CheckM2 + Skani → SkaniAnnotate → BinSummary → MagSummary. Registers HvpMagsPipeline in .dockstore.yml for auto-sync to Dockstore/Terra. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 633b33e commit 2d2c534

7 files changed

Lines changed: 1255 additions & 0 deletions

File tree

.dockstore.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,22 @@ workflows:
9898
- /tshea\/.*/
9999
tags:
100100
- /.*/
101+
102+
- name: HvpMagsPipeline
103+
subclass: WDL
104+
primaryDescriptorPath: /wdl/pipelines/PacBio/Metagenomics/HvpMagsPipeline.wdl
105+
readMePath: /README.md
106+
authors:
107+
- name: Terrance Shea
108+
orcid: 0000-0002-6586-9298
109+
affiliation: Broad Institute
110+
- name: Jonn Smith
111+
orcid: 0000-0002-4279-8220
112+
affiliation: Broad Institute
113+
filters:
114+
branches:
115+
- main
116+
- /jts_.*/
117+
- /tshea\/.*/
118+
tags:
119+
- /.*/
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
version 1.0
2+
3+
import "../../../tasks/Binning/Binning.wdl" as BinningTasks
4+
import "../../../tasks/Binning/DASTool.wdl" as DASToolTasks
5+
import "../../../tasks/MAG/CheckM2.wdl" as CheckM2Tasks
6+
import "../../../tasks/MAG/Skani.wdl" as SkaniTasks
7+
import "../../../tasks/MAG/MagSummary.wdl" as SumTasks
8+
9+
workflow HvpMagsPipeline {
10+
11+
meta {
12+
description: "Single-sample HVP metagenome-assembled genome (MAG) pipeline. Accepts the primary assembly FASTA and a sorted BAM from HvpAssembly, bins contigs with MetaBAT2, MaxBin2, and SemiBin2 in parallel, refines bins with DAS_Tool, assesses quality with CheckM2 and skani taxonomy with GTDB r226, and produces per-bin and per-sample aggregate outputs for the Terra data table."
13+
14+
allowNestedInputs: true
15+
16+
outputs: {
17+
dastool_eval_tsv: "DAS_Tool per-bin score summary (completeness, contamination, size, N50)",
18+
checkm2_quality_tsv: "CheckM2 quality_report.tsv: per-bin completeness, contamination, coding density, contig N50, genome size",
19+
skani_results_tsv: "skani search output TSV: per-bin best hits with ANI and alignment fractions",
20+
skani_annotated_tsv: "skani results TSV with appended GTDB r226 gtdb_taxonomy column",
21+
bin_summary_tsv: "Per-bin combined summary: MIMAG quality tier, GTDB taxonomy, CheckM2 and skani metrics",
22+
mag_stats_tsv: "Single-row TSV of all assembly and bin aggregate metrics for the sample",
23+
total_bins: "Total number of DAS_Tool-refined bins",
24+
n_high_quality: "Bins with completeness >= 90 and contamination < 5 (MIMAG HQ)",
25+
n_medium_quality: "Bins with completeness >= 50 and contamination < 10 (MIMAG MQ)",
26+
n_single_contig: "Bins composed of a single contig (potential complete circular MAG with HiFi)",
27+
pct_assembly_bases_binned: "Percentage of assembly bases captured in any bin",
28+
n_distinct_species_hq: "Number of distinct GTDB species-level assignments among HQ bins"
29+
}
30+
}
31+
32+
parameter_meta {
33+
assembly_primary_fa: "Primary assembly contigs FASTA from HvpAssembly (uncompressed or .gz)"
34+
sorted_bam: "Sorted BAM of reads aligned to primary assembly from HvpAssembly"
35+
sorted_bam_bai: "BAI index for sorted_bam"
36+
asm_stats_tsv: "Assembly seqkit stats TSV from HvpAssembly (this.asm_stats_tsv)"
37+
sample_name: "Sample identifier used as output file prefix (e.g. bc2097)"
38+
semibin_environment: "Pretrained SemiBin2 environment model (human_gut, human_oral, dog_gut, cat_gut, mouse_gut, pig_gut, ocean, soil, built_environment, wastewater, chicken_caecum, global)"
39+
skani_db_tgz: "Skani GTDB r226 sketch database as tar.zst archive"
40+
skani_taxonomy_tsv: "GTDB r226 combined taxonomy TSV (gtdb_r226_combined_taxonomy.tsv)"
41+
checkm2_db_dmnd: "CheckM2 diamond database (uniref100.KO.1.dmnd)"
42+
das_tool_score_threshold: "Minimum DAS_Tool score for a bin to be retained (default 0.6)"
43+
}
44+
45+
input {
46+
File assembly_primary_fa
47+
File sorted_bam
48+
File sorted_bam_bai
49+
File asm_stats_tsv
50+
String sample_name
51+
String semibin_environment
52+
53+
File skani_db_tgz
54+
File skani_taxonomy_tsv
55+
File checkm2_db_dmnd
56+
57+
Float das_tool_score_threshold = 0.6
58+
}
59+
60+
# Compute per-contig depth once — shared by MetaBAT2 and MaxBin2
61+
call BinningTasks.JgiDepth as t_01_JgiDepth {
62+
input:
63+
contigs_fa = assembly_primary_fa,
64+
sorted_bam = sorted_bam,
65+
sorted_bam_bai = sorted_bam_bai,
66+
sample_name = sample_name
67+
}
68+
69+
# Three binners run in parallel using the same depth and contigs
70+
call BinningTasks.MetaBAT2 as t_02_MetaBAT2 {
71+
input:
72+
contigs_fa = assembly_primary_fa,
73+
depth_txt = t_01_JgiDepth.depth_txt,
74+
sample_name = sample_name
75+
}
76+
77+
call BinningTasks.MaxBin2 as t_03_MaxBin2 {
78+
input:
79+
contigs_fa = assembly_primary_fa,
80+
depth_txt = t_01_JgiDepth.depth_txt,
81+
sample_name = sample_name
82+
}
83+
84+
call BinningTasks.SemiBin2 as t_04_SemiBin2 {
85+
input:
86+
contigs_fa = assembly_primary_fa,
87+
sorted_bam = sorted_bam,
88+
semibin_environment = semibin_environment,
89+
sample_name = sample_name
90+
}
91+
92+
# DAS_Tool dereplicates and refines bins from all three binners
93+
call DASToolTasks.DASTool as t_05_DASTool {
94+
input:
95+
contigs_fa = assembly_primary_fa,
96+
metabat2_bins = t_02_MetaBAT2.bins,
97+
maxbin2_bins = t_03_MaxBin2.bins,
98+
semibin2_bins = t_04_SemiBin2.bins,
99+
sample_name = sample_name,
100+
score_threshold = das_tool_score_threshold
101+
}
102+
103+
# CheckM2 and skani run in parallel on the DAS_Tool-refined bins
104+
call CheckM2Tasks.CheckM2 as t_06_CheckM2 {
105+
input:
106+
bins = t_05_DASTool.bins,
107+
checkm2_db_dmnd = checkm2_db_dmnd,
108+
sample_name = sample_name
109+
}
110+
111+
call SkaniTasks.Skani as t_07_Skani {
112+
input:
113+
bins = t_05_DASTool.bins,
114+
skani_db_tgz = skani_db_tgz,
115+
sample_name = sample_name
116+
}
117+
118+
# Annotate skani hits with GTDB r226 taxonomy
119+
call SkaniTasks.SkaniAnnotate as t_08_SkaniAnnotate {
120+
input:
121+
skani_results_tsv = t_07_Skani.results_tsv,
122+
taxonomy_tsv = skani_taxonomy_tsv,
123+
sample_name = sample_name
124+
}
125+
126+
# Per-bin combined summary (CheckM2 + skani taxonomy)
127+
call SumTasks.BinSummary as t_09_BinSummary {
128+
input:
129+
checkm2_quality_tsv = t_06_CheckM2.quality_report_tsv,
130+
skani_annotated_tsv = t_08_SkaniAnnotate.annotated_tsv,
131+
sample_name = sample_name
132+
}
133+
134+
# Aggregate to per-sample scalars for the Terra data table
135+
call SumTasks.MagSummary as t_10_MagSummary {
136+
input:
137+
bin_summary_tsv = t_09_BinSummary.bin_summary_tsv,
138+
asm_stats_tsv = asm_stats_tsv,
139+
sample_name = sample_name
140+
}
141+
142+
output {
143+
File dastool_eval_tsv = t_05_DASTool.eval_tsv
144+
File checkm2_quality_tsv = t_06_CheckM2.quality_report_tsv
145+
File skani_results_tsv = t_07_Skani.results_tsv
146+
File skani_annotated_tsv = t_08_SkaniAnnotate.annotated_tsv
147+
File bin_summary_tsv = t_09_BinSummary.bin_summary_tsv
148+
File mag_stats_tsv = t_10_MagSummary.mag_stats_tsv
149+
Int total_bins = t_10_MagSummary.total_bins
150+
Int n_high_quality = t_10_MagSummary.n_high_quality
151+
Int n_medium_quality = t_10_MagSummary.n_medium_quality
152+
Int n_single_contig = t_10_MagSummary.n_single_contig
153+
Float pct_assembly_bases_binned = t_10_MagSummary.pct_assembly_bases_binned
154+
Int n_distinct_species_hq = t_10_MagSummary.n_distinct_species_hq
155+
}
156+
}

0 commit comments

Comments
 (0)