Skip to content

Genome assembly QC

Several genome assemblies and their annotations compared: contiguity, foreign and adaptor sequence, BUSCO completeness, a karyotype of conserved genes and telomeric repeats, repeat content, gene models, and the orthogroups the genomes share.

Experimental
Pipeline version latest

The genomeqc template follows an nf-core/genomeqc run from the assemblies as they are to the genes the genomes share:

  • Overview: the run in four key figures, live findings and four figures, each linked to the tab that explains it
  • Data & QC: the MultiQC report, how contiguous each assembly is, and whether it carries foreign or adaptor sequence
  • Genomes: BUSCO completeness, a karyotype of conserved genes and telomeric repeats, repeat content, gene models, and the orthogroups the genomes share

The persistent Sample filters (the group and the genome) sit in the left panel and narrow every tab through the genome hub, one row per assembly.

The design table is optional

The samplesheet is not published and has no design column, so the design is a table you pass (METADATA_FILE: the assembly name in a sample column, every other column a factor such as a family). Without it the group filters and the group split fall away and the scatters draw in one colour.


Quick start

depictio ingest /path/to/genomeqc_results \
  --template nf-core/genomeqc/latest \
  --var METADATA_FILE=/path/to/genome_design.tsv

The results directory is the only required value.

Variable Default Role
METADATA_FILE unset design table, one row per assembly; without it the group filter, colours and splits fall away
GROUP_COL first factor column of the design table column the dashboard groups and filters genomes by
GROUP_COL_DISPLAY title-cased GROUP_COL reader-facing label of GROUP_COL in filters and cards
depictio config nextflow --install     # once per machine
nextflow run nf-core/genomeqc -r 1.0.1 -profile docker --outdir results

No depictio ingest, and no template named: the pipeline ingests its own output directory when it finishes and resolves this template from its own manifest. See Nextflow trigger. The trigger passes no --var, so the run has no design table.


Reference

The template reads the summary tables of each step: QUAST, BUSCO (assembly and proteins), tidk, AGAT, the pipeline's gene overlap counts, OrthoFinder's statistics, FCS-GX, FCS-adaptor, Tiara, RepeatMasker, and the native MultiQC report, which holds QUAST only. It never reads the masked FASTAs, the RepeatMasker .out tables or the tens of thousands of per-orthogroup files OrthoFinder writes. QUAST and MultiQC label an assembly after its FASTA, every other tool after the assembly name, and the hub joins the two.

Every tool collection but QUAST is optional, and a tool that did not run drops what depends on it:

Run What goes
No annotation in the samplesheet the Annotation and Orthology tabs, with the Annotate and Compare steps
--skip_tidk the Karyotype tab (sequence lengths come from tidk)
No FCS-GX database the Contamination tab and the Screen step
No --te repeatmasker the Repeats tab and the Mask step
--skip_busco the Completeness and Karyotype tabs

Self-adapting layout

The dashboard adapts to whatever the run actually produced: components bound to pruned or unparsed data collections are hidden, tabs left with no real visualizations are dropped entirely, and the remaining components are re-packed so there are no empty rows.

Pipeline nf-core/genomeqc 1.0.1 Template 1.1.0 Updated 1 Nov 2026

Template variables

Variables you provide when running the template: DATA_ROOT is the results directory given to depictio ingest, the others are set with --var NAME=value:

Variable Required Description
DATA_ROOT ✓ Root directory of one genomeqc run (quast/, busco/, tidk/, agat/, orthofinder/, decontamination/, multiqc/, pipeline_info/).
METADATA_FILE — Optional design table (TSV): assembly name in a column named sample (or in the first column), one column per factor such as a family or a clade. Joined into the genome hub: enables the design filters, the group colours and the group splits.
METADATA_ID_COL — Design table assembly-name column. Auto-detected as the first column; defaults to 'sample'.
GROUP_COL — Design column the dashboards group and filter genomes by. Auto-detected as the first factor column of METADATA_FILE.

Auto-detected (set from the run's metadata / params.json; the route flags drive Conditional routes below): GROUP_COL_DISPLAY, ANNOTATION_COLS

Data collections

25 data collections — 5 required 20 optional · 18 direct 7 derived.

Origin tells you whether a collection is real pipeline data or a reshape of it: direct = a pipeline output (scanned, or a recipe that reads raw files); derived = a recipe that reshapes one or more direct collections into the layout a visualization needs (no new measurement). Reads shows what produces it: a recipe .py transform, or a raw file scanned off disk. (A direct collection can still have a recipe — one that merely parses/cleans the raw file; derived means the recipe reshapes another collection.)

Tag Origin Type Reads Status
metadata direct Table file {METADATA_FILE} optional
multiqc_data direct MultiQC MultiQC file (?:.*/)?multiqc(?:/[^/]+)?/multiqc_data/multiqc\.parquet$ required
quast_assembly_raw direct Table file ^transposed_report\.tsv$ required
quast_assembly_report derived Table recipe quast/assembly_report.py required
quast_length_ladder derived Table recipe quast/length_ladder.py required
busco_batch_raw direct Table file ^.+-busco\.batch_summary\.txt$ optional
busco_batch_summary derived Table recipe busco/batch_summary.py optional
busco_composition derived Table recipe busco/composition.py optional
tidk_search_windows direct Table recipe tidk/search_windows.py optional
busco_karyotype derived Table recipe nf-core/genomeqc/busco_karyotype.py optional
agat_statistics direct Table recipe agat/statistics.py optional
agat_gene_models direct Table recipe agat/gene_models.py optional
gene_overlaps direct Table recipe nf-core/genomeqc/gene_overlaps.py optional
orthofinder_species_stats direct Table recipe orthofinder/species_stats.py optional
orthofinder_orthogroup_matrix direct Table recipe orthofinder/orthogroup_matrix.py optional
orthofinder_orthologue_matrix direct Table recipe orthofinder/orthologue_matrix.py optional
ortho_seq_count direct Table file ^species_ortho_seq_count\.tsv$ optional
fcsgx_contamination direct Table file ^fcs_table\.tsv$ optional
fcsgx_actions direct Table recipe fcsgx/actions.py optional
fcsadaptor_actions direct Table recipe fcsadaptor/actions.py optional
tiara_classifications direct Table recipe tiara/classifications.py optional
tiara_class_counts derived Table recipe nf-core/genomeqc/tiara_class_counts.py optional
repeatmasker_repeat_classes direct Table recipe repeatmasker/repeat_classes.py optional
repeatmasker_masking_summary direct Table recipe repeatmasker/masking_summary.py optional
genomes derived Table recipe nf-core/genomeqc/genomes.py required

Conditional routes

Rows are data collections; columns are the variables you set or params.json flags auto-detected from the run. Each filled cell is the effect of setting that variable; an empty cell means that variable leaves the collection unchanged. (24 collections are unaffected by any variable — present on every run.)

+ included− removed⇄ repointed

Data collection METADATA_FILE
metadata +

26 links — selecting a value in the source collection filters the target. The join column is shown after the source.

Recipes

Each recipe reshapes raw pipeline output into a tidy table. The name links to its source; Output lists the validated OUTPUT_SCHEMA columns.

Recipe Transforms Output
agat/gene_models.py The gene models of each annotation, one row per assembly and feature type. genome, feature_type, genes, transcripts, transcripts_per_gene, exons, exons_per_transcript, single_exon_genes, single_exon_gene_pct, overlapping_genes, mean_gene_length, median_gene_length, mean_transcript_length, mean_exon_length, mean_intron_length, mean_cds_length, total_gene_length
agat/statistics.py Every number of an AGAT agat_sp_statistics.pl report, as a long table. genome, feature_type, isoforms, metric, value, metric_order
busco/batch_summary.py One row per assessed assembly, from BUSCO's batch_summary.txt. assembly_id, input_file, lineage, busco_mode, complete_pct, single_pct, duplicated_pct, fragmented_pct, missing_pct, n_markers, stop_codon_pct, scaffold_n50, contig_n50, percent_gaps, n_scaffolds
busco/composition.py BUSCO scores as four classes per assembly, for a composition bar. assembly_id, lineage, busco_mode, run_id, busco_class, rank, class_order, percent
fcsadaptor/actions.py Adaptor and vector calls of FCS-adaptor, from its *.fcs_adaptor_report.txt. genome, seq_id, seq_len, action, start, end, flagged_bp, adaptor, source_type
fcsgx/actions.py Contamination calls of FCS-GX, from its *.fcs_gx_report.txt. genome, seq_id, start, end, seq_len, action, division, division_group, contaminant_cov, top_taxon, flagged_bp
nf-core/genomeqc/busco_karyotype.py Complete BUSCOs per sequence, drawn to scale: the nf-core/genomeqc karyotype. genome, busco_mode, sequence, start, end, sequence_length, complete_buscos, buscos_per_mb, busco_share_pct, sequence_rank
nf-core/genomeqc/gene_overlaps.py Overlapping genes per annotation, from nf-core/genomeqc's GENEOVERLAPS step. genome, total_genes, unresolved_strand_genes, contained_same_strand, contained_opposite_strand, overlapping_genes, overlapping_pct, contained_same_strand_pct, not_overlapping_genes, overlapping_not_nested
nf-core/genomeqc/genomes.py The nf-core/genomeqc genome hub: one row per assembly, every per-genome number. genome, assembly_label, total_length, n_contigs, largest_contig, n50, n90, l50, l90, gc_percent, ns_per_100_kbp, busco_lineage, busco_complete_pct, busco_single_pct, busco_duplicated_pct, busco_fragmented_pct, busco_missing_pct, protein_complete_pct, protein_duplicated_pct, protein_missing_pct, sequences_with_busco, repeat_unit, genes, transcripts, transcripts_per_gene, exons_per_transcript, single_exon_gene_pct, mean_gene_length, mean_cds_length, overlapping_pct, contained_same_strand, genes_in_orthogroups_pct, unassigned_genes, species_specific_orthogroups, syntenic_sequences, contaminant_pct, gx_flagged_ranges, gx_flagged_bp, adaptor_ranges, tiara_sequences, prokaryotic_sequences, unknown_sequences, masked_pct, interspersed_pct
nf-core/genomeqc/tiara_class_counts.py Sequences per Tiara class and assembly, from the per-sequence Tiara table. genome, tiara_class, sequences, share_pct
orthofinder/orthogroup_matrix.py Which genomes each orthogroup reaches, from Orthogroups.GeneCount.tsv. orthogroup, n_genomes, total_genes, copy_class, sharing
orthofinder/orthologue_matrix.py One-to-one orthologues between every pair of species, as a square matrix. genome
orthofinder/species_stats.py How much of each proteome OrthoFinder placed, from Statistics_PerSpecies.tsv. genome, genes, genes_in_orthogroups, unassigned_genes, genes_in_orthogroups_pct, unassigned_genes_pct, orthogroups, orthogroups_pct, species_specific_orthogroups, genes_in_species_specific, genes_in_species_specific_pct, genes_in_shared_orthogroups
quast/assembly_report.py One row per assembly, from QUAST's transposed report. assembly_id, assembler, sample, n_contigs, total_length, largest_contig, n50, n75, l50, l75, gc_percent, ns_per_100_kbp, predicted_rrna_genes, contigs_over_1kb, length_over_1kb
quast/length_ladder.py The contig-length ladder of each assembly, one row per length threshold. assembly_id, assembler, sample, min_contig_length, n_contigs, total_length, length_fraction
repeatmasker/masking_summary.py How much of each assembly RepeatMasker masked, from the header of its .tbl. genome, sequences, total_length, length_excl_n, gc_pct, masked_bp, masked_pct, interspersed_pct, retroelements_pct, dna_transposons_pct, unclassified_pct, simple_repeats_pct
repeatmasker/repeat_classes.py Repeat classes and families of each assembly, from RepeatMasker's .tbl. genome, repeat_class, parent_class, rank, class_order, elements, length_bp, genome_pct
tiara/classifications.py Tiara's class for every sequence of an assembly. genome, stage, sequence, class_fst_stage, class_snd_stage, tiara_class, is_eukaryotic
tidk/search_windows.py Telomeric repeats per window along every sequence, from tidk search. genome, sequence, start, end, forward_repeats, reverse_repeats, repeats, repeat_unit, search, sequence_length

Dashboard tabs

One dashboard: the Overview, then eight child tabs in two groups, read as a funnel from the assemblies to the genes the genomes share. Each tab below carries the same icon and colour the dashboard gives it, so the page and the app read alike.

Group Tabs
Data & QC MultiQC, Assembly, Contamination
Genomes Completeness, Karyotype, Repeats, Annotation, Orthology

Each child tab opens with a short intro and a strip of four cards, then at most three open sections; tables follow, collapsed. The Sample sheet (the genome hub) is pinned, collapsed, to the bottom of every child tab.

Genome assembly and annotation quality, from contiguity to the orthogroups the genomes share.

Overview dashboard

Overview dashboard

The run lists the genome count, the BUSCO lineage, the annotation validator, the OrthoFinder version and the repeat annotation, and Pipeline walks six steps (measure, screen, mask, complete, annotate, compare), each linked to its parameters and its tab. Four key figures: the genomes, the N50, the complete BUSCOs and the N bases per 100 kb. The findings are live rows plus four figures: contiguity, the BUSCO classes, the gene models and each genome's genes by orthogroup.

Data & QC · What does the MultiQC report say about the assemblies?

MultiQC dashboard

MultiQC dashboard

MultiQC panels only: QUAST's assembly statistics, the sequences in QUAST's length bins and the general statistics. A Report scope filter narrows the panels to report rows, and the pinned genome filters reach them through the FASTA label.

Data & QC · How contiguous is each assembly?

Assembly dashboard

Assembly dashboard

The N50, the L50, the assembly length and the GC content. Then the sequences against the N50 of every assembly on log axes, sized by length and coloured by group, with the record of the picked genome beside it, and the share of each assembly kept above QUAST's minimum lengths. Filters: N50 and sequence count.

Data & QC · Does any assembly carry foreign or adaptor sequence?

Contamination dashboard

Contamination dashboard

The highest foreign share FCS-GX reports, the bases it flags, the adaptor bases and the sequences Tiara classified. Then the foreign share per genome beside Tiara's classes per genome, both stacked bars whose axis starts near the smallest bottom share (a // marks the cut; the Zoom switch shows the whole bar). The FCS-GX, FCS-adaptor and Tiara tables are collapsed.

Genomes · How much of the conserved gene set does each genome hold?

Completeness dashboard

Completeness dashboard

The complete BUSCOs in the assembly (a threshold at 95%) and in the proteins, the duplicated ones and the four classes summed. Then one stacked bar per BUSCO run, each assembly beside its proteins, and the assembly score against the protein score per genome. Filter: complete BUSCOs.

Genomes · Where do the conserved genes and telomeric repeats sit?

Karyotype dashboard

Karyotype dashboard

The sequences holding a BUSCO, the BUSCOs placed, the BUSCOs per Mb and the 10 kb windows holding the tidk repeat. Then two ideograms, one karyotype per genome each, the 24 longest sequences drawn to their length: the first shaded by complete BUSCOs per Mb, the second by copies of the searched repeat per 10 kb window. A genome picker sits above the chart, and a click on a bar opens it zoomed. genomeqc publishes no gene positions, so a whole sequence is shaded, not single genes.

Genomes · How much of each genome is repeats, and of which kinds?

Repeats dashboard

Repeats dashboard

The masked share, the interspersed share, the simple repeats and the elements found. Then the share of each assembly that every repeat class takes; the rank switch opens the families. The masking summary and every class and family line are collapsed. Filter: repeat class.

Genomes · How many genes does each annotation hold, and how are they built?

Annotation dashboard

Annotation dashboard

The protein-coding genes, the exons per mRNA, the single-exon genes and the overlapping genes. Then every transcript type of every annotation by genes and exons per transcript, and the genes per type beside each annotation's genes split by overlap (none, another gene, nested on the opposite or the same strand). The gene models per type and every AGAT statistic are collapsed.

Genomes · Which orthogroups do the genomes share?

Orthology dashboard

Orthology dashboard

The orthogroups by copy class, the core every genome shares, the share of genes placed for the genome with the fewest, and the orthogroups of one genome. Then each genome's genes in shared, genome-specific or no orthogroups, an UpSet of the genomes each orthogroup reaches, and the one-to-one orthologues of every pair of genomes. Filter: copy class.

A pick on a genome reaches every per-genome collection through the project links.


Running the pipeline

Depictio reads the output of nf-core/genomeqc, it does not run the pipeline. Run the pipeline first:

nextflow run nf-core/genomeqc -r 1.0.1 \
  --input samplesheet.csv \
  --te repeatmasker \
  --outdir results \
  -profile docker

A tool that did not run leaves its tab out (see the table above): the Contamination tab needs the FCS-GX database (--gxdb and --gxdb_manifest) and the Repeats tab needs --te repeatmasker. Then point Depictio at the results:

depictio ingest results/ \
  --template nf-core/genomeqc/latest \
  --var METADATA_FILE=genome_design.tsv

See nf-co.re/genomeqc/usage for full pipeline documentation.


Required data structure

Point depictio ingest at the directory holding the pipeline output. Depictio scans recursively and matches on file name.

<DATA_ROOT>/
├── input/genome_metadata.tsv                   # --var METADATA_FILE (optional design table)
├── pipeline_info/
├── multiqc/multiqc_data/multiqc.parquet        # QUAST only
├── quast/<a>/<a>.quast/transposed_report.tsv   # required
├── busco/{genome,protein}/<a>/stats/*-busco.batch_summary.txt
├── busco/<mode>/<a>/ideogram/*.csv
├── tidk/<a>/search/<kind>/<a>.tsv
├── agat/<a>/stats/<a>.stats.txt
├── gene_overlaps/<a>.counts.tsv
├── orthofinder/                                # summary tables only
├── ortho_seq_count/species_ortho_seq_count.tsv
├── fcsgx/fcs_table.tsv
├── decontamination/{fcs-gx,fcs-adaptor,tiara}/
└── repeatmasker/<a>/<a>.tbl

Validation runs

The repository ships download_test_data.sh, which fetches the subset of nf-core's AWS megatest run that the template needs (files over 50 MB are skipped) and copies the vendored design table into input/:

bash depictio/projects/nf-core/genomeqc/1.0.1/download_test_data.sh \
  /tmp/genomeqc_test
depictio ingest /tmp/genomeqc_test \
  --template nf-core/genomeqc/latest \
  --var METADATA_FILE=/tmp/genomeqc_test/input/genome_metadata.tsv

The run is s3://nf-core-awsmegatests/genomeqc/results-bce44e5b558e21b38d4dd2b6521302246b4dae6d/, the 1.0.1 test_full run: three Hymenoptera RefSeq assemblies with their annotations, the hymenoptera_odb10 BUSCO lineage, FCS-GX on its test-only database and RepeatMasker with RepeatModeler. The FCS-GX database is a smoke test, so its contamination shares are not a real screen.


Additional resources


Authorship

Developers Wrote the template, its recipes and its dashboards. weber8thomas
Reviewers Nobody has run it on their own data and signed it off yet, which is what keeps it from Reviewed. Open
Maintainers Keep it working as nf-core/genomeqc releases. weber8thomas

Reviewing a template on your own data, or taking over a role here, is a contribution in itself: the contributing guide says what each one involves.