Skip to content

RNA-seq variant calling

Germline variants called from RNA-seq: how the reads aligned, spliced and covered the genome, how many calls each sample yields and how clean they are, what they change in the genes, and whether replicates share them, with a genome browser on the reads.

Experimental
Pipeline version latest

The rnavar template follows an nf-core/rnavar run from the alignment to where the calls fall on the genome:

  • Overview: the run in four key figures, live findings and figures, each linked to the tab that explains it
  • Data & QC: the MultiQC report, how the reads aligned, spliced and deduplicated, and how deep and where they cover the genome
  • Variants: the callset per sample, what the calls change in the genes (snpEff route), and a genome view of the variants replicates share, over the reads
Live showcase nf-core/rnavar, nf-core test data Open

The persistent Sample filters (the design group and the sample) sit in the left panel and narrow every tab through the sample hub.

The design table is optional

rnavar does not publish its samplesheet, and the samplesheet has no design column, so the design is a table you pass (METADATA_FILE: the sample id in a sample column, every other column a factor). Without it the group filter, the group colours and the replicate agreement fall away, and every tile keeps working on one constant group.

The BAMs are never ingested as tables

The alignments (14 to 21 GB each on the test run) are opened only by the genome browser, in place (TRACKS_URI) or uploaded. The numbers come from STAR's, Picard's and samtools' reports, the VCFs and the MultiQC report.


Quick start

depictio ingest /path/to/rnavar_results \
  --template nf-core/rnavar/latest \
  --var METADATA_FILE=/path/to/design.tsv

The results directory is the only required value. METADATA_FILE is the optional design table above.

Variable Default Role
METADATA_FILE unset design table; 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 samples by
GENOME hg38 UCSC name of the assembly, which lays out the Genome tab axis and gene lane; rnavar's --genome GRCh38 is chr-prefixed, so hg38 fits, and none drops the gene lane only
TRACKS_URI unset s3:// or https:// folder holding the run's results: the browser then reads the VCFs and BAMs in place; unset, the files under the results directory are uploaded
depictio config nextflow --install     # once per machine
nextflow run nf-core/rnavar -r 1.3.0 -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 STAR's final log and splice junctions, Picard MarkDuplicates, samtools stats and idxstats, the HaplotypeCaller VCFs, the snpEff output when the run annotated, and the native MultiQC report (no regeneration needed). rnavar writes each sample's calls twice, as called and after VariantFiltration: the template reads the filtered VCF, or the unfiltered one when the run skipped filtration, so no call is counted twice.

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. Without --tools snpeff the Annotation tab, its pipeline step and its tile in the tab list go.

Pipeline nf-core/rnavar 1.3.0 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 rnavar run (reports/, variant_calling/, annotation/, pipeline_info/).
METADATA_FILE — Optional design table (TSV): sample id in a column named sample (or in the first column), one column per factor such as a cell line or condition. Joined into the sample hub: enables the design filters, the group colours and the group splits.
METADATA_ID_COL — Design table sample-id column. Auto-detected as the first column; defaults to 'sample'.
GROUP_COL — Design column the dashboards group and filter samples by. Auto-detected as the first factor column of METADATA_FILE.
GENOME — UCSC name of the assembly the run was aligned to (hg38, mm10): the axis and gene lane of the Genome tab. Use none for an assembly without chr-prefixed contigs.
TRACKS_URI — s3:// or https:// folder holding the run's results (the folder DATA_ROOT mirrors), to read the genome-browser tracks (VCF, BAM) in place instead of uploading them from DATA_ROOT.

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

Data collections

28 data collections — 13 required 15 optional · 11 direct 17 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
star_log_final direct Table recipe star/log_final.py optional
star_junctions direct Table recipe star/junctions.py optional
picard_markduplicates_metrics_raw direct Table file .*\.md\.metrics\.txt$ optional
picard_markduplicates_metrics derived Table recipe picard/markduplicates_metrics.py optional
samtools_stats_raw direct Table file .*\.md\.stats$ optional
samtools_stats_sections derived Table recipe samtools/stats_sections.py optional
samtools_idxstats direct Table recipe samtools/idxstats.py optional
vcf_calls_raw direct Table file ^(?!.*_(?:snpEff\|VEP\|BCF)).*\.haplotypecaller(?:\.filtered)?\.vcf\.gz$ required
vcf_variants derived Table recipe nf-core/rnavar/variants.py required
vcf_callset_summary derived Table recipe vcf/callset_summary.py required
vcf_substitution_spectrum derived Table recipe vcf/substitution_spectrum.py required
vcf_filter_breakdown derived Table recipe vcf/filter_breakdown.py required
vcf_callset_nodesign derived Table recipe vcf/callset_summary.py required
snpeff_ann_vcf_raw direct Table file .*_snpEff\.ann\.vcf\.gz$ optional
snpeff_ann_variants derived Table recipe snpeff/ann_variants.py optional
snpeff_csv_raw direct Table file .*_snpEff\.csv$ optional
snpeff_csv_stats derived Table recipe snpeff/csv_stats.py optional
snpeff_genes_raw direct Table file .*_snpEff\.genes\.txt$ optional
snpeff_genes derived Table recipe snpeff/genes.py optional
samples derived Table recipe nf-core/rnavar/samples.py required
variant_windows derived Table recipe nf-core/rnavar/variant_windows.py required
shared_variants derived Table recipe nf-core/rnavar/shared_variants.py required
replicate_sharing derived Table recipe nf-core/rnavar/replicate_sharing.py required
vcf_allele_fractions derived Table recipe nf-core/rnavar/allele_fractions.py required
sample_concordance derived Table recipe nf-core/rnavar/sample_concordance.py required
tracks derived genomic_tracks recipe nf-core/rnavar/tracks.py optional

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 TRACKS_URI
metadata +
vcf_callset_nodesign −
replicate_sharing +
tracks ⇄

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
nf-core/rnavar/allele_fractions.py nf-core/rnavar allele-fraction distribution: each sample's PASS calls over the allele fraction. sample, variant_type, depth_class, vaf_bin, vaf, calls
nf-core/rnavar/replicate_sharing.py nf-core/rnavar replicate agreement: the PASS sites of a design group that every replicate calls. samples, sites, shared_sites, shared_pct
nf-core/rnavar/sample_concordance.py nf-core/rnavar genotype concordance: how alike two samples' PASS genotypes are. sample
nf-core/rnavar/samples.py nf-core/rnavar sample hub: one row per sample, from the reads to the calls. sample, input_reads, uniquely_mapped_pct, multimapped_pct, unmapped_pct, mismatch_rate_pct, splices_annotated_pct, novel_junction_pct, duplication_pct, bases_10x_pct, mito_reads_pct, chry_reads_pct, other_contig_reads_pct, pass_calls, snvs, indels, pass_pct, filtered_pct, ts_tv, het_hom_ratio, median_dp
nf-core/rnavar/shared_variants.py nf-core/rnavar shared variants: the PASS sites of each design group and how many replicates call them. chrom, pos, end, variant_key, ref, alt, variant_type, sharing, n_calling, samples, min_dp, median_vaf, best_qual, carriers, support_score
nf-core/rnavar/tracks.py Genome-browser track manifest: the HaplotypeCaller VCF and the BAM of every sample. track_id, sample, format, uri, name, category, order
nf-core/rnavar/variant_windows.py nf-core/rnavar Genome tab navigator: PASS variants in 1 Mb windows, one lane per design group. chrom, pos, end, variants, calls, samples, snv_pct
nf-core/rnavar/variants.py nf-core/rnavar variant calls: one row per call, from the filtered VCF of each sample. sample, caller, chrom, pos, variant_key, ref, alt, variant_type, qual, filter_status, is_pass, gt, dp, vaf, stage
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
samtools/idxstats.py Reads per contig, per sample, from samtools idxstats. sample, stage, contig, contig_class, length, mapped_reads, mapped_pct, reads_per_mb
samtools/stats_sections.py The distribution sections of a samtools stats report, as one long table. sample, section, series, metric, bin, n_reads, n_bases, n_indels, n_pairs, reads_total, reads_mapped, reads_mapped_pct, bases_mapped, error_rate, identity_pct, average_length, maximum_length, average_quality, supplementary_alignments
snpeff/ann_variants.py One row per annotated variant call, read from SnpEff's annotated VCF. sample, caller, chrom, pos, variant_key, ref, alt, variant_type, qual, filter_status, is_pass, gt, dp, vaf, gene, gene_id, impact, consequence, hgvs_p, aa_pos
snpeff/csv_stats.py The composition sections of SnpEff's CSV summary, melted into one long frame. sample, caller, section, category, count, percent
snpeff/genes.py Per-gene variant counts by impact class, from SnpEff's gene effect table. sample, caller, gene_name, gene_id, biotype, n_high, n_low, n_moderate, n_modifier, n_variants, n_coding
star/junctions.py Splice junctions per sample, by intron motif and annotation, from STAR's SJ.out.tab. sample, motif_class, motif_order, annotation, junctions, unique_reads, multimapping_reads, junctions_pct, unique_reads_pct
star/log_final.py One row per sample from STAR's Log.final.out. sample, input_reads, avg_input_read_length, uniquely_mapped, uniquely_mapped_pct, multimapped, multimapped_pct, too_many_loci_pct, unmapped_pct, mapped_pct, avg_mapped_length, splices_total, splices_annotated, splices_annotated_pct, splices_noncanonical, splices_noncanonical_pct, mismatch_rate_pct, deletion_rate_pct, insertion_rate_pct, chimeric_pct
vcf/callset_summary.py One row per callset (sample and caller): what a germline callset is judged on. sample, caller, calls, pass_calls, pass_pct, snvs, indels, mnps, multiallelic, transitions, transversions, ts_tv, het, hom_alt, het_hom_ratio, median_qual, median_dp, median_het_vaf
vcf/filter_breakdown.py How each caller's own FILTER column partitions its calls, per callset. sample, caller, filter_label, is_pass, failed_filters, calls, calls_pct, snvs, indels
vcf/substitution_spectrum.py SNV substitution spectrum per callset, folded onto the six pyrimidine classes. sample, caller, callset, substitution_class, mutation_class, count, fraction

Dashboard tabs

One dashboard: the Overview, then six child tabs in two groups, read as a funnel from the reads to where the calls fall on the genome. 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, Alignment, Coverage
Variants Callset, Annotation, Genome

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 is pinned, collapsed, to the bottom of every child tab.

Germline variant calling from RNA-seq, from the alignment to the annotated calls.

Overview dashboard

Overview dashboard

The run reads the genome, aligner, calling confidence, filter thresholds and annotation tools from the run parameters, and Pipeline walks six steps (Align, Mark, Call, Filter, Annotate, Report), each linked to its settings and its tab. Four key figures: PASS variants, replicate agreement (a Ts/Tv card without a design table), the T to C share of the PASS SNVs and the calls failing a filter. The findings are live rows plus three figures: unique mapping and duplication per sample, the substitution spectrum and the sample-by-sample genotype concordance.

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

MultiQC dashboard

MultiQC dashboard

MultiQC panels only: the general statistics, then STAR's alignment scores and summary, Picard MarkDuplicates, and samtools reads per contig and XY counts.

Data & QC · How well did the reads align, splice and deduplicate?

Alignment dashboard

Alignment dashboard

The input reads, the uniquely mapped share, duplication and the mismatch rate, each with a line on what a bad value means. Then unique mapping and duplication per sample as a sorted dot plot, the weakest sample on top, next to the record of the picked sample, and the splice junctions per sample by intron motif, novel first. The tables are collapsed.

Data & QC · How deep do the reads cover the genome, and where?

Coverage dashboard

Coverage dashboard

The covered bases at 10x, the mapped reads, the mitochondrial reads (a threshold at 5%) and the reads on alt and unplaced contigs. Then the depth histogram of every sample on log axes and the mapped reads by contig class. The contig table is collapsed.

Variants · How many calls does each sample yield, and how clean are they?

Callset dashboard

Callset dashboard

PASS calls, Ts/Tv, the het/hom ratio and the calls by FILTER value, the first two against a working range. Then the genotype concordance of every pair of samples, where replicates should sit together, the substitution spectrum per sample (T to C carries the A-to-I editing signal) and Ts/Tv and het/hom per sample with that range shaded. The allele-fraction distributions and the tables are collapsed; a FILTER value picked on the left narrows the calls.

Variants · What do the calls change in the genes they hit?

Only when the run annotated with --tools snpeff. The annotated calls by impact, the genes hit by biotype, the HIGH impact calls and the coding allele fraction. Then the impact classes per sample and the twelve commonest consequence terms, coloured by impact. A gene picked in the collapsed gene table narrows the call table.

Variants · Are PASS variants shared between replicates, and do the reads support them?

Genome dashboard

Genome dashboard

Cards on the sites replicates share and on the region in view. A navigator draws one lane per design group, each window its distinct PASS variants per megabase; a brush or a typed locus sets the region for the cards, the call table and the genome browser, which shows the replicates' VCFs and, under them, their BAMs with splice-junction arcs. It opens on the best-supported shared variant, and a stepper walks the shared sites. The UCSC tracks are hg38 only.

A pick on a sample or a design group reaches every per-sample collection and the MultiQC panels through the project links.


Running the pipeline

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

nextflow run nf-core/rnavar -r 1.3.0 \
  --input samplesheet.csv \
  --genome GRCh38 \
  --outdir results \
  -profile docker

Add --tools snpeff for the Annotation tab. Then point Depictio at the results:

depictio ingest results/ \
  --template nf-core/rnavar/latest \
  --var METADATA_FILE=design.tsv

See nf-co.re/rnavar/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/sample_metadata.tsv                   # --var METADATA_FILE (optional design table)
├── pipeline_info/
├── reports/
│   ├── star/<s>/<s>.Log.final.out
│   ├── star/<s>/<s>.SJ.out.tab
│   ├── picard/<s>/<s>.md.metrics.txt
│   ├── samtools/<s>/<s>.md.{stats,idxstats}
│   ├── snpeff/<s>/*_snpEff.{csv,genes.txt}     # only with --tools snpeff
│   └── multiqc/multiqc_data/multiqc.parquet
├── variant_calling/<s>/<s>.haplotypecaller[.filtered].vcf.gz[.tbi]
├── annotation/<s>/*_snpEff.ann.vcf.gz          # only with --tools snpeff
└── preprocessing/<s>/<s>.md.bam[.bai]          # opened by the genome browser only

Validation runs

The repository ships download_test_data.sh, which fetches the tables-only subset of nf-core's AWS megatest run that the template needs (no BAMs) and copies the vendored design table into input/:

bash depictio/projects/nf-core/rnavar/1.3.0/download_test_data.sh \
  /tmp/rnavar_test
depictio ingest /tmp/rnavar_test \
  --template nf-core/rnavar/latest \
  --var METADATA_FILE=/tmp/rnavar_test/input/sample_metadata.tsv

The run is s3://nf-core-awsmegatests/rnavar/results-5e72bcb5520e00422750c978d4153b38f1fd7312/, a complete test_full run of the 1.3.0 development version: eight samples from cell lines with replicates, with the HaplotypeCaller VCFs and a MultiQC report. The 1.3.0 release run is a truncated sync with no variant calls, so it is not used. That run used no --tools, so the Annotation tab was checked on snpEff output from the same subworkflow in a sarek megatest.


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/rnavar 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.