Skip to content

Ancient DNA

Ancient-DNA QC from trimming and collapsing to endogenous content, the deamination and fragment-length signals that authenticate a library, coverage and genotypes, next to the pipeline's MultiQC report.

Draft
Template version latest

The eager template follows an nf-core/eager run from raw lanes to genotypes, one question per tab, in three groups:

  • Overview: the run in four key figures, live findings and four figures, each linked to the tab that explains it
  • Data & QC: FastQC, AdapterRemoval and bcftools panels from the regenerated MultiQC report, every library on every tool at once, and where each sequenced read stops, from trimming and collapsing to deduplication
  • Ancient DNA: how much of each extract is the target organism, how many distinct molecules each library holds, and whether the DNA is damaged and short, as ancient DNA is
  • Genome: depth per contig and the depth distribution, depth and mapping quality at one locus, and the variants called per sample

The persistent Sample filters (sample, library, UDG treatment) sit in the left panel and narrow every tab. Below them, the collapsed QC thresholds set coverage, duplication and endogenous-DNA floors: the collections they read link back to the library hub, so a floor narrows the hub and, through it, every tab.

The MultiQC report must be regenerated

eager 2.4.5 ships MultiQC 1.13, which writes no parquet, and Depictio reads only multiqc.parquet (MultiQC 1.31 and later). Re-run MultiQC over the run's own tool outputs before ingesting, or the MultiQC tab stays empty:

python -m depictio.dev_scripts.multiqc_reprocess --src <outdir> --dest <outdir>

Copy the --input TSV under input/

eager 2.x does not publish the samplesheet it was launched with. The library hub and the per-lane table read any input/*.tsv under the data root, so copy the TSV there (several are concatenated, one per batch).

Optional branches appear when the run enabled them

Sex.DetERRmine, MTNucRatio, ANGSD nuclear contamination, MaltExtract and Kraken are optional collections, each bound to one table in a collapsed section: Off-target screen on Endogenous DNA, Contamination on Authentication, Sex determination on Coverage. A run that did not enable the branch ingests without it, and the import drops its table.


Quick start

depictio ingest /path/to/eager_results \
  --template nf-core/eager/latest

The results directory is the only thing you have to pass, once the --input TSV is copied under input/ and the MultiQC report regenerated. SHORT_FRAGMENT_BP (default 70) sets the short-fragment cut-off the Authentication tab counts:

depictio ingest /path/to/eager_results \
  --template nf-core/eager/latest \
  --var SHORT_FRAGMENT_BP=50
depictio config nextflow --install     # once per machine
nextflow run nf-core/eager -r 2.4.5 -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. The samplesheet copy and the MultiQC regeneration above still apply. See Nextflow trigger.


Reference

The template reads the run's --input TSV, the regenerated MultiQC report and the tool tables behind it: AdapterRemoval, samtools flagstat, endorS.py, Picard MarkDuplicates, preseq, DamageProfiler, Qualimap BamQC and bcftools stats. 63 of its 89 tiles carry a use: catalog reference, so a tile says where its panel comes from. Every file is matched on its name, never on the per-library directory around it.

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.

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 containing eager output (fastqc/, adapterremoval/, samtools/, deduplication/, damageprofiler/, qualimap/, preseq/, endorspy/, bcftools/, pipeline_info/) plus the reprocessed multiqc/multiqc_data/multiqc.parquet, and the run's --input TSV under input/ (see the LAYOUT NOTE above).
SHORT_FRAGMENT_BP — Short-fragment cut-off in bp. The damageprofiler/authenticity recipe counts fragments shorter than it (column fraction_under_70bp, name kept for schema stability) and the Authentication tab names it (card title and fragment-length intro).

Data collections

39 data collections — 34 required 5 optional · 20 direct 19 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, whose name links to its source on GitHub, 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
samples direct Table recipe nf-core/eager/samples.py required
multiqc_data direct MultiQC MultiQC file (?:.*/)?multiqc(?:/[^/]+)?/multiqc_data/multiqc.parquet$ required
adapterremoval_settings_raw direct Table file .*.settings$ required
adapterremoval_settings derived Table recipe adapterremoval/settings.py required
eager_lane_stats derived Table recipe nf-core/eager/lane_stats.py required
samtools_flagstat_raw direct Table file .*flagstat.stats$ required
samtools_flagstat derived Table recipe samtools/flagstat.py required
endorspy_endogenous_raw direct Table file .*_endogenous_dna(?:_mqc)?.json$ required
endorspy_endogenous derived Table recipe endorspy/endogenous.py required
picard_markduplicates_metrics_raw direct Table file .*.metrics(?:.txt)?$ required
picard_markduplicates_metrics derived Table recipe picard/markduplicates_metrics.py required
eager_read_fate derived Table recipe nf-core/eager/read_fate.py required
qualimap_bamqc_genome_results_raw direct Table file genome_results.txt$ required
qualimap_bamqc_genome_results derived Table recipe qualimap/bamqc_genome_results.py required
qualimap_coverage_per_contig derived Table recipe qualimap/coverage_per_contig.py required
qualimap_coverage_across_reference_raw direct Table file .*coverage_across_reference.txt$ required
qualimap_coverage_across_reference derived Table recipe qualimap/coverage_across_reference.py required
qualimap_mapq_across_reference_raw direct Table file .*mapping_quality_across_reference.txt$ required
qualimap_mapq_across_reference derived Table recipe nf-core/eager/mapq_across_reference.py required
qualimap_coverage_histogram_raw direct Table file .*coverage_histogram.txt$ required
qualimap_coverage_histogram derived Table recipe qualimap/coverage_histogram.py required
qualimap_genome_fraction_coverage_raw direct Table file .*genome_fraction_coverage.txt$ required
qualimap_genome_fraction_coverage derived Table recipe qualimap/genome_fraction_coverage.py required
preseq_ccurve_raw direct Table file .*.filtered.preseq$ required
preseq_complexity_curve derived Table recipe nf-core/eager/complexity_curve.py required
damageprofiler_misincorporation_raw direct Table file .*_freq_misincorporations.txt$ required
damageprofiler_misincorporation derived Table recipe damageprofiler/misincorporation.py required
damageprofiler_lgdistribution_raw direct Table file .*lgdistribution.txt$ required
damageprofiler_lgdistribution derived Table recipe damageprofiler/lgdistribution.py required
damageprofiler_authenticity derived Table recipe damageprofiler/authenticity.py required
eager_library_qc derived Table recipe nf-core/eager/library_qc.py required
bcftools_stats_raw direct Table file .*.(?:vcf.stats|bcftools_stats.txt)$ required
bcftools_stats_summary derived Table recipe bcftools/stats_summary.py required
bcftools_stats_tstv derived Table recipe bcftools/stats_tstv.py required
sexdeterrmine direct Table file .*(?:SexDet|sexdeterrmine).tsv$ optional
mtnucratio direct Table file .*.mtnucratio(?:.json)?$ optional
nuclear_contamination direct Table file .*nuclear_contamination(?:_mqc)?.txt$ optional
maltextract_heatmap direct Table file .*heatmap_overview_Wevid.tsv$ optional
kraken_report direct Table file .*kraken(?:_merged_report|_parsed)?.(?:csv|tsv)$ optional

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
adapterremoval/settings.py Trimming and collapsing statistics from an AdapterRemoval settings report. sample, total_read_pairs, total_reads, well_aligned_read_pairs, unaligned_read_pairs, discarded_reads, singleton_reads, collapsed_pairs, truncated_collapsed_pairs, retained_reads, retained_nucleotides, average_retained_length, collapse_rate, discard_rate
bcftools/stats_summary.py Per-sample, per-caller variant record counts from bcftools stats. sample, caller, n_records, n_no_alts, n_snps, n_mnps, n_indels, n_others, n_multiallelic_sites, n_multiallelic_snp_sites, snp_fraction, log10_n_records
bcftools/stats_tstv.py Per-sample, per-caller transition/transversion ratio from bcftools stats. sample, caller, ts, tv, ts_tv, ts_1st_alt, tv_1st_alt, ts_tv_1st_alt
damageprofiler/authenticity.py The ancient-DNA authenticity plane: terminal deamination against fragment length. sample, ct_5p_first, ga_3p_first, terminal_damage, background, mean_length, median_length, fraction_under_70bp, n_reads
damageprofiler/lgdistribution.py Fragment-length distribution of a mapped library, from DamageProfiler. sample, strand, series, length, occurrences, fraction
damageprofiler/misincorporation.py Ancient-DNA misincorporation frequency by position, both read ends, one row sample, end, position, base_change, frequency
endorspy/endogenous.py Endogenous DNA percentage per library, from endorS.py's MultiQC custom content. sample, endogenous_dna, endogenous_dna_post, endogenous_dna_loss, off_target_pct
nf-core/eager/complexity_curve.py eager-local override of depictio/catalog/preseq/complexity_curve.py. sample, total_reads, expected_distinct, lower_ci, upper_ci, ci_width
nf-core/eager/lane_stats.py One row per sequencing LANE, joining AdapterRemoval's report to the samplesheet. lane_id, sample_id, sample_name, lane, run_accession, seq_type, strandedness, total_read_pairs, total_reads, discarded_reads, collapsed_pairs, retained_reads, retained_nucleotides, average_retained_length, collapse_rate, discard_rate
nf-core/eager/library_qc.py One row per library pooling the numbers an ancient-DNA library is judged on. sample, endogenous_dna, endogenous_dna_post, clonality_pct, mean_coverage, mean_mapping_quality, error_rate_pct, gc_percentage, ct_5p_first_pct, mean_length
nf-core/eager/mapq_across_reference.py Mapping quality along the reference, from Qualimap BamQC's windowed table. sample, chromosome, position, mapping_quality, global_position
nf-core/eager/read_fate.py Where every sequenced read of a library ends up, as a flow of read counts. sample, step_sequencing, step_trimming, step_mapping, step_filtering, step_duplication, reads
nf-core/eager/samples.py One row per eager LIBRARY, from the TSV samplesheet the run was launched with. sample_id, sample_name, organism, seq_type, udg_treatment, n_lanes, lane_ids
picard/markduplicates_metrics.py Duplication metrics from a Picard MarkDuplicates report. sample, library, unpaired_reads_examined, read_pairs_examined, unmapped_reads, unpaired_read_duplicates, read_pair_duplicates, read_pair_optical_duplicates, duplicate_reads, reads_after_dedup, percent_duplication, estimated_library_size
qualimap/bamqc_genome_results.py One row per sample from a Qualimap BamQC genome_results.txt report. sample, total_reads, mapped_reads, percentage_aligned, mean_coverage, mean_mapping_quality, general_error_rate, gc_percentage, duplication_rate
qualimap/coverage_across_reference.py Read depth along the reference, from Qualimap BamQC's own windowed table. sample, chromosome, position, coverage, coverage_std, global_position
qualimap/coverage_histogram.py How many bases of the reference sit at each depth, from Qualimap BamQC. sample, coverage, n_genomic_locations, fraction
qualimap/coverage_per_contig.py Per-contig depth, from the Coverage per contig block of genome_results.txt. sample, chromosome, length, mapped_bases, mean_coverage, coverage_std, relative_coverage
qualimap/genome_fraction_coverage.py What share of the reference is covered at least X deep, from Qualimap BamQC. sample, min_coverage, genome_fraction_pct
samtools/flagstat.py One row per (sample, filter stage) from a samtools flagstat report. sample, stage, total_reads, mapped_reads, mapped_pct, duplicate_reads, properly_paired_reads, properly_paired_pct, singleton_pct

Dashboard tabs

One dashboard: the Overview, then nine child tabs in three groups, read as a funnel from the reads to the genotypes called from an ancient extract. 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, Libraries, Read fate
Ancient DNA Endogenous DNA, Complexity, Authentication
Genome Coverage, Locus, Genotypes

Each child tab opens with a short intro and, except on MultiQC, a strip of four cards, then at most three open sections; tables, record cards and the optional branches follow, collapsed. The template has no group column: the library hub (samples) is one row per eager library, and the biological sample plays the group's part. The persistent Sample filters (sample, library, UDG treatment) sit in the left panel and narrow every tab through the project links. The persistent QC thresholds, collapsed below them, filter the Qualimap BamQC summary (mean coverage, duplication rate) and endorS.py (endogenous DNA); both collections link back to the hub, so a floor narrows the hub and the hub fans the surviving libraries out. The Sample sheet (the library hub) and Reference tables (the BamQC summary the thresholds read) are pinned, collapsed, to the bottom of every child tab.

Ancient DNA, from the reads to authentication, coverage and genotypes.

Overview dashboard

Overview dashboard

A short hero links the run's provenance: eager 2.4.5 writes no params.json, so the dialog lists the software versions the run recorded. About this dashboard says how the two filter levels work, The run lists facts read from the run's tables (libraries and samples, the most common UDG treatment, the organism, the lanes and reads sequenced), and Pipeline walks the six steps from trimming to genotyping, each linked to the version of its tool and to its tab. The findings are live values: they follow the filters. Each figure draws one point or curve per library, so its legend is hidden and the caption says what the colour is.

Filters and components

Filters · the left panel starts collapsed. Key figures has its own filter bar (sample and library), and Findings another (sample and UDG treatment): each narrows its own section only.

Section What it holds
Top Hero, About this dashboard, The run, Pipeline
Key figures 4 headline cards: libraries by sample, endogenous DNA, C to T at the first base, genome covered at 1X
Findings Live result rows, then 4 figures: endogenous DNA before against after filtering, the preseq complexity curves, the ancient-DNA plane and the genome fraction curves
How to read this dashboard The tabs by group, each with its question

Data & QC · Did sequencing and trimming work for every library?

MultiQC dashboard

MultiQC dashboard

MultiQC panels only, from the regenerated report, and only those no tile redraws from a tool table: flagstat, Picard, preseq, DamageProfiler and Qualimap are left to their tiles. Open: general statistics (endorS.py's endogenous DNA included), FastQC sequence counts and the AdapterRemoval collapsed-read length, then per-base quality and GC content. Adapter content and duplication levels, and the four bcftools panels (substitution types, quality, indel lengths, depths), are collapsed.

Filters and components

Filters · Report sample on multiqc_data, the sample as the report names it.

Section What it holds
QC overview 3 MultiQC panels
Read quality 2 MultiQC panels
QC details (collapsed) 2 MultiQC panels
Variant calling (collapsed) 4 MultiQC panels

Data & QC · How do the libraries compare on every tool at once?

Libraries dashboard

Libraries dashboard

Libraries split by sample, the reads per lane, the reads sequenced (a funnel to the reads AdapterRemoval kept) and the mapping quality. Then the per-library QC profile: the pipeline-local eager/library_qc.py recipe joins endorS.py, Picard, Qualimap and DamageProfiler on the library id, and a parallel-coordinates tile draws one line per library across seven axes, each rescaled to its range. Brush an axis to narrow the profile. Collapsed: the pooled table with the record of the row you pick beside it, and the per-lane AdapterRemoval table.

Filters and components

Filters · a Clonality (%) range on eager_library_qc and Lane on eager_lane_stats.

Section What it holds
Libraries at a glance 4 cards
Library QC profile 1 advanced visualization
Library detail (collapsed) Library QC, pooled + a library record card
Lanes (collapsed) Per-lane trimming and collapsing

Data & QC · Where does every sequenced read stop?

Read fate dashboard

Read fate dashboard

Reads sequenced split by trimming outcome, the same reads by final fate (a ring), the collapse rate and the discard rate per lane. Then one sankey, five stages with the reads that fall out at each, its flows coloured by where they end. The pipeline-local eager/read_fate.py recipe chains AdapterRemoval, samtools flagstat and Picard MarkDuplicates, and the accounting is exact: a library's retained reads equal its pre-filter flagstat total, so nothing is apportioned. Then the lane yield: reads kept and the discard share per lane, and the collapse rate against the retained length. The fate table is collapsed.

Filters and components

Filters · Final fate on eager_read_fate and Lane on eager_lane_stats. There is no trimming-outcome filter: it would leave the strip's first card on one outcome.

Section What it holds
Reads at a glance 4 cards
Read fate 1 advanced visualization
Lane yield Reads kept for mapping, per lane, Reads discarded, per lane, 1 advanced visualization (collapse rate against retained length)
Read fate table (collapsed) Read fate, as counts

Ancient DNA · How much of each extract is the target organism?

Endogenous DNA dashboard

Endogenous DNA dashboard

Endogenous DNA before filtering, after filtering (a share of 100%), the points lost between them and the reads given to the mapper (a funnel to those mapped, from flagstat's pre-filter stage). Then each library's endogenous DNA before against after filtering, the on-target signal lost to filtering below the diagonal, and the mapped reads per library and stage. A low share is normal for ancient extracts, where most DNA is environmental. The off-target screen (MaltExtract and Kraken, when the run enabled them) and the endorS.py and flagstat tables are collapsed.

Filters and components

Filters · an Endogenous DNA after filtering range on endorspy_endogenous. There is no stage filter, for the same reason there is no trimming-outcome filter on Read fate.

Section What it holds
Endogenous DNA at a glance 4 cards
Before and after filtering 1 advanced visualization
Alignment Mapped reads before and after the filter
Off-target screen (collapsed) MaltExtract authentication overview, Kraken classification
Endogenous tables (collapsed) Endogenous DNA per library, Flagstat, pre- and post-filter

Ancient DNA · How many distinct molecules does each library hold?

Complexity dashboard

Complexity dashboard

The Picard duplication rate, the reads checked (a funnel to the unique reads kept), the duplicates removed and the unique reads kept. Then the screening plane, endogenous DNA against clonality with each point sized by depth, and side by side the duplication against the unique reads kept and the preseq complexity curves. A library worth sequencing deeper is high in endogenous DNA and low in duplicates; a flattened curve means the extract, not the sequencing, is the limit. eager's preseq run wrote no bootstrap interval, so the curves carry no band. The Picard table is collapsed.

Filters and components

Filters · a Picard duplication range on picard_markduplicates_metrics.

Section What it holds
Duplication at a glance 4 cards
Screening plane 1 advanced visualization
Duplication and depth 2 advanced visualizations: duplication against what survived it and the library complexity curve
Duplication table (collapsed) Duplication metrics per library

Ancient DNA · Is the DNA damaged and short, as ancient DNA is?

Authentication dashboard

Authentication dashboard

C to T at the 5 prime end, G to A at the 3 prime end, the mean fragment length and the share under the SHORT_FRAGMENT_BP cut-off. Then the ancient-DNA plane, mean length against terminal deamination, beside the fragment length curves, and the misincorporation profile (C>T, G>A and the pooled background by position from each read end). Short and damaged is ancient, long and undamaged is modern contamination; UDG-treated libraries keep the damage at the terminal base only. DamageProfiler 0.4.9 writes no length-binned damage table, so the profile is not split by length. The contamination estimates (ANGSD and MTNucRatio, when the run enabled them) and the DamageProfiler tables are collapsed.

Filters and components

Filters · Read end and a Distance from the read end range on damageprofiler_misincorporation, Strand and a Fragment length range on damageprofiler_lgdistribution.

Section What it holds
Damage at a glance 4 cards
Length and damage 2 advanced visualizations: the ancient-DNA plane and the fragment length distribution
Misincorporation 1 advanced visualization
Contamination (collapsed) Nuclear contamination (ANGSD), Mitochondrial to nuclear ratio
Authentication tables (collapsed) Authenticity summary per library, Misincorporation table, Fragment length table

Genome · How deep and how evenly is the reference covered?

Coverage dashboard

Coverage dashboard

The mean coverage per library, the share of the reference covered at 1X and at 2X, and the depth of the sequences of 1 Mb or more relative to the library mean. Then the relative depth against contig length, the quantity a sex call and an organelle ratio are made from: an even library sits on 1, the mitochondrion far above it, a sex chromosome near 0.5 or 1. Side by side, the depth histogram and the share of the reference covered at least X deep, on a log depth axis. There is no per-contig bar: on a reference with hundreds of scaffolds its axis cannot be read. The Sex.DetERRmine table (when the run enabled it) and the per-contig and genome fraction tables are collapsed.

Filters and components

Filters · Relative depth and Contig length ranges on qualimap_coverage_per_contig. There is no depth-threshold filter: the 1X and 2X cards would print a dash once it excluded their threshold.

Section What it holds
Coverage at a glance 4 cards
Per-contig depth 1 advanced visualization
Depth distribution 2 advanced visualizations: the depth histogram and the genome fraction curve
Sex determination (collapsed) Sex.DetERRmine
Coverage tables (collapsed) Coverage per contig, Genome fraction by depth threshold

Genome · How deep and how well mapped is one region?

Locus dashboard

Locus dashboard

The window depth, the windows in view (those at 1X or deeper against the rest), the depth spread within a window and the mapping quality; the four cards read the whole reference until a region is picked, then that region. Then the locus navigator, Qualimap's windows mapped back onto their contigs, with a track of mean mapping quality under it from the pipeline-local eager/mapq_across_reference.py. A region link carries the navigator's chromosome and position onto that track, so a brush or a typed locus moves both tracks and the strip together. A dip in mapping quality under a depth dip marks repeats the mapper could not place. The window table is collapsed.

Filters and components

Filters · a Window depth (X) range on qualimap_coverage_across_reference. There is no chromosome filter: the navigator owns the region.

Section What it holds
Region at a glance 4 cards
Depth along the reference 2 advanced visualizations: the locus navigator and the mapping quality track
Window table (collapsed) Windowed depth

The navigator opens on the first contig

No contig name holds across references, so the navigator opens on the whole first contig of the data. A non-model reference has no built-in assembly: the contig list comes from the data and there is no gene lane.

Genome · How many variants did each sample yield, and how clean?

Genotypes dashboard

Genotypes dashboard

SNPs called split by sample, indels, the Ts to Tv ratio and multiallelic sites. The VCF record count is not a card: a VCF that emits reference sites counts them as records too. Then SNPs and the Ts to Tv ratio per sample, one bar per caller. bcftools reads the biological sample from the VCF header, not the library, so the hub carries both ids and links on both. A shallow, damaged library calls fewer confident variants than its read count suggests, and deamination read as variation inflates the transitions. The bcftools summary and Ts/Tv tables are collapsed.

Filters and components

Filters · Variant caller on bcftools_stats_summary.

Section What it holds
Calls at a glance 4 cards
Calls per sample SNPs called per sample, Ts to Tv ratio per sample
Genotype tables (collapsed) Variant counts per sample and caller, Transition and transversion counts

Tables and points select on their entity column: the pinned sample sheet on sample_id and the BamQC reference table on sample; the lane table and the collapse scatter on lane_id; the pooled library table, the read fate table and every per-library table and scatter of the Ancient DNA and Genome tabs on sample, as do the fragment length and genome fraction profiles. A pick narrows the other tiles of its collection and follows the project links to the collections they reach. The complexity curve and depth histogram profiles, the coverage track, and the raw MaltExtract, Kraken, contamination and Sex.DetERRmine tables do not select. The screening plane emits a selection, but its collection has no outgoing link, so it narrows no other tile.


Running the pipeline

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

nextflow run nf-core/eager -r 2.4.5 \
  --input libraries.tsv \
  --fasta reference.fa \
  -profile docker --outdir results

Then copy the TSV beside the results, regenerate the MultiQC report and point Depictio at them:

mkdir -p results/input && cp libraries.tsv results/input/
python -m depictio.dev_scripts.multiqc_reprocess --src results/ --dest results/
depictio ingest results/ --template nf-core/eager/latest

See nf-co.re/eager/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, so a run with --dedupper dedup or a different directory layout lands in the same collections.

<DATA_ROOT>/
├── input/*.tsv                                # the run's --input TSV (required, copied by hand)
├── pipeline_info/software_versions.csv
├── multiqc/multiqc_data/multiqc.parquet       # written by multiqc_reprocess
├── fastqc/{input_fastq,after_clipping}/zips/*_fastqc.zip
├── adapterremoval/output/*.settings
├── samtools/
│   ├── stats/*_flagstat.stats
│   └── filtered_stats/*_postfilterflagstat.stats
├── endorspy/*_endogenous_dna_mqc.json
├── deduplication/<library>/*_rmdup.metrics
├── preseq/*.filtered.preseq
├── damageprofiler/<library>_rmdup/
│   ├── *_freq_misincorporations.txt
│   └── *lgdistribution.txt
├── qualimap/<library>_rmdup_stats/
│   ├── genome_results.txt
│   └── raw_data_qualimapReport/*.txt          # coverage and mapping quality across the reference
├── bcftools/stats/*.vcf.stats
└── (optional branches, anywhere under the root)
    ├── *SexDet*.tsv                           # Sex.DetERRmine
    ├── *.mtnucratio                           # MTNucRatio
    ├── nuclear_contamination.txt              # ANGSD
    ├── heatmap_overview_Wevid.tsv             # MaltExtract (HOPS)
    └── *kraken{_parsed,_merged_report}.{csv,tsv}  # Kraken

Validation runs

The template was validated on the nf-core AWS megatest of the 2.4.5 release, s3://nf-core-awsmegatests/eager/results-42c9d5f8602e5e88fdcec28f194d2cd4cff61c75/ (every 2.5.x prefix holds pipeline_info/ only), and the screenshots above come from that run. The megatest did not enable sex determination, contamination estimation or a metagenomic screen, so the import drops those tables. Its samplesheet is not part of the results; the template ships a reconstructed one under input/:

DEST=/tmp/eager_test
bash depictio/projects/nf-core/eager/2.4.5/download_test_data.sh "$DEST"
mkdir -p "$DEST/input" && cp depictio/projects/nf-core/eager/2.4.5/input/*.tsv "$DEST/input/"
python -m depictio.dev_scripts.multiqc_reprocess --src "$DEST" --dest "$DEST"
depictio ingest "$DEST" --template nf-core/eager/latest

Do not pass --project when ingesting: the dashboard is attached to the project by name, so renaming it breaks a later depictio dashboard import. Re-ingesting accumulates dashboards, so delete the project before repeating a run.


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 a Draft. Open
Maintainers Keep it working as nf-core/eager 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.