Public release. This document is a sanitised version of an internal benchmark report shared with the nf-core/riboseq community for methodological feedback. Internal identifiers (names, paths, cluster details, sample-library codes, commit hashes) have been stripped; all metric numbers, figures, and tool recommendations are otherwise unchanged from the internal version. The dataset is described as "Condition A vs Condition B, 3 technical replicates each" — the underlying biological context is not relevant to the methodological findings.

Ribo-seq ORF caller benchmark — production-pipeline tier recommendation

Status: FINAL (scaling phase complete; all gw numbers populated) Date: 2026-05-14 Authors: the project team Project: 6-tool benchmark for nf-core/riboseq fork; 6 reps of a controlled timecourse (two conditions (3 reps each)) Source: the project repository (private)


Executive summary

This report benchmarks six published Ribo-seq ORF callers — RiboCode, Rp-Bp, ribotish, PRICE, ribotricer, and RibORF — against six replicates of a human Ribo-seq dataset (2 conditions × 3 technical reps). RIBOSS was deferred (paired RNA-seq + Salmon dependency); Rp3 was excluded (proteomics dependency).

The benchmark produces per-tool Tier-1 (production default), Tier-2 (opt-in for specific use cases), and excluded recommendations for the production microprotein-quantification pipeline.

Key findings (gw scale, 6 reps per tool):

Tier recommendations (final): - Tier 1 (production default): RiboCode + Rp-Bp - Tier 2 (opt-in): ribotish (alt-start discovery), PRICE (near-cognate specialty) - Excluded: ribotricer (rank-unstable scoring), RibORF (operationally untenable — 5-7 days/rep gw), RIBOSS + Rp3 (missing data dependencies)


1. Methodology

1.1 Reference data

1.2 Replicates (6 total, 2 timepoints × 3 biological replicates)

Sample ID Condition Replicate Read count (post UMI dedup) Notes
D01_S1 A 1 ~33M
D02_S2 A 2 ~28M
D03_S3 A 3 ~33M
D81_S7 B 1 ~32M
D82_S8 B 2 ~12M LOW DEPTH — sensitivity-flagged
D83_S9 B 3 ~31M

Sample IDs (D01–D83) are arbitrary labels; D01/D02/D03 are the three Condition-A replicates and D81/D82/D83 are the three Condition-B replicates. The same labels appear on the figures below.

BAMs from a standard nf-core/riboseq alignment; both genome-aligned and transcriptome-aligned outputs available.

1.3 Tools evaluated

Tool Version Algorithm family Status
ribotish 0.2.8 Fisher Q-value, periodicity + TIS ✅ chr1 + gw (Tier-2)
Rp-Bp 4.0.1 Bayesian periodicity model ✅ chr1 + gw (Tier-1)
RibORF 2.0 Periodicity uniformity ratio ❌ chr1 only — gw operationally untenable (5-7 d/rep)
PRICE 1.0.6e (Gedi maven build) EM with logistic regression ✅ chr1 + gw (Tier-2, near-cognate specialty)
ribotricer 1.5.0 Phase score coherence ✅ chr1 + gw — but excluded (rank-unstable scoring)
RiboCode 1.2.15 Statistical frame test (Wilcoxon-like) ✅ chr1 + gw (Tier-1)
RIBOSS (deferred) Comparative periodicity ❌ requires paired RNA-seq + Salmon
Rp3 (excluded) MS + Ribo-seq combined ❌ requires proteomics (Metric 7 dropped)

1.4 Parameter choices — vendor defaults locked

Per the project lead's directive: all six tools run with vendor defaults; no parameter sweeps. This means: - Start codons: tools that take a configurable codon set use the vendor default (ATG-only for Rp-Bp, ribotricer, RiboCode; ATG+near-cognate for ribotish, RibORF, PRICE) - Q-value cutoffs: tool defaults (varying); §6.3 mapping documented in deviations - Ribosome profiling-specific tuning: vendor defaults across all tools

1.5 Schema normalization (§6.1)

All six per-tool outputs are normalized to a 14-column common schema: orf_id, chrom, start, end, strand, start_codon, length_aa, orf_type, score, host_transcript_id, host_gene_id, tool, replicate_id, sample_id

Per-tool §6.2 vocabulary mappings, §6.3 filter applications, and operational deviations are documented in Appendix A (supplementary deviations document).

1.6 Compute environment


2. §7 Metrics

Results from 5 of 6 tools at gw scale × 6 replicates each = 30 of 30 expected normalized TSVs landed (RiboCode, Rp-Bp, ribotish, PRICE, ribotricer). RibORF excluded on operational grounds at gw scale (see §4.2); chr1 vertical-slice RibORF results retained as supplementary evidence of its call profile.

2.1 Metric 1 — Replicate concordance (HEADLINE)

Pairwise across-replicate Spearman correlation of ORF scores (top heatmaps below) and Jaccard overlap of called ORF sets (bottom heatmaps). Spearman captures whether the same ORFs rank consistently across reps; Jaccard captures whether the same set of ORFs is called. A Tier-1 candidate needs both — calling the same ORFs is necessary but not sufficient if scores are rank-unstable.

Metric 1 — Within-tool reproducibility

Headline numbers (mean across 15 rep pairs):

Tool mean Spearman mean Jaccard Verdict
ribocode 0.917 0.772 Passes Tier-1 gate
ribotish 0.884 0.824 Passes Tier-1 gate
ribotricer 0.288 0.770 Fails — rank-unstable scoring
Rp-Bp 0.893 0.673 Passes Tier-1 gate (6 of 6 reps)
PRICE 0.854 0.060 Passes Spearman gate; very low Jaccard (mirror-opposite of ribotricer — near-cognate start-codon ambiguity gives different ORF sets across reps but consistent score ranks)

Ribotricer's gap (Jaccard 0.77 but Spearman 0.29) is the diagnostic pattern: it identifies similar ORF sets across replicates but assigns inconsistent ranks to them. A production scoring pipeline cannot underwrite that.

2.2 Metric 2 — Cross-tool concordance

Pairwise Jaccard across tools using a (chrom, start, end, strand) coordinate-equality join, averaged across the 6 reps.

Metric 2 — Cross-tool concordance

Mean Jaccard across reps (gw, all 5 tools):

price ribocode ribotish ribotricer rpbp
price 1.000 0.057 0.006 0.000 0.000
ribocode 0.057 1.000 0.041 0.000 0.000
ribotish 0.006 0.041 1.000 0.006 0.000
ribotricer 0.000 0.000 0.006 1.000 0.052
rpbp 0.000 0.000 0.000 0.052 1.000

Surprise finding — strict coordinate equality gives near-zero cross-tool overlap. Tools place the start coordinate differently for the same biological ORF (alt-start ambiguity, frame interpretation differences), so even when they agree on translation, their (start, end) tuples don't match. This is a methodological finding for the production pipeline: real consensus calling needs fuzzy overlap matching (e.g., bedtools intersect with ≥80% reciprocal overlap, or gene-level aggregation) rather than coordinate equality. A follow-up "Metric 2b" using fuzzy matching is tracked as a future addition.

Earlier chr1 D01_S1 5-way Jaccard (gene-level join, committed at 73fb126) showed much higher numbers — ribotish ↔ ribotricer = 0.837, Rp-Bp ↔ ribocode = 0.461, 6-way intersection = 39 transcripts — which underscores the start-coordinate vs gene-level resolution gap.

2.3 Metric 3 — ORF-type breakdown per tool, per replicate

Stacked-bar fractions of each tool's calls into the canonical ORF-type vocabulary: annotated / Truncated (alt-start of an annotated CDS) / Extended / novel / uORF / dORF / internal / Overlap_* variants. One panel per replicate.

Metric 3 — ORF-type fractions per tool, per replicate

Reveals three distinct tool "personalities":

The ribotricer dORF inflation flows directly into Metric 4's biology violation below.

(MANE-Select canonical recall is deferred to a follow-up analysis — needs an additional join against the MANE-Select transcript list. Tracked as a future addition.)

2.4 Metric 4 — uORF:dORF ratio (biology-sanity floor)

Pooling rule: uORF + Overlap_uORF vs dORF + Overlap_dORF. Leaky-scanning biology predicts uORF ≫ dORF (typically ≥5×); a tool reporting dORF ≥ uORF is over-calling 3′-UTR signal or mis-classifying internal initiation events. The red dashed line at log10=0 marks the "biology violation" floor.

Metric 4 — uORF:dORF ratio per tool per replicate

Per-rep ratios (uORF / dORF):

Tool D01_S1 D02_S2 D03_S3 D81_S7 D82_S8 D83_S9 Verdict
ribocode 2.07 2.99 3.62 4.01 1.73 3.23 Passes (above biology floor)
ribotish 0.067 0.090 0.117 0.137 0.046 0.101 Inverted (7-22× more dORFs than uORFs)
ribotricer 0.086 0.095 0.106 0.118 0.071 0.102 Inverted (8-14× more dORFs than uORFs)
Rp-Bp 3.44 5.18 3.76 3.79 5.11 4.13 Passes — 3.4-5.2× across all 6 reps (biology-correct)
PRICE 4.83 9.20 7.97 7.06 4.73 5.34 Passes — highest ratio in the cohort (5-9×); biology-strict caller

The inversion in ribotish and ribotricer is consistent across all 6 reps — not a single-rep artifact. Worth verifying for the production-pipeline design phase whether this is a real over-calling pattern in the tools (a property of their default scoring) or a §6.2 type-mapping decision in the parsers; either way, the inversion is the dominant signal pushing both tools to Tier-2 / excluded rather than Tier-1.

2.5 Metric 5 — Start codon bias

Aggregated across the 6 reps (start-codon prevalence is a tool-intrinsic property of the model + threshold, not sample-specific).

Metric 5 — Start-codon distribution per tool

The 3 fast non-PRICE tools called 100% AUG at gw scale; Rp-Bp called 99.94% AUG (11 AGU, 1 AUU among 19,741 ORFs); PRICE called only ~30% AUG and ~70% non-AUG near-cognate starts:

Tool AUG CUG GUG AAG UUG AUU AGG ACG AUA other
ribocode 100% – – – – – – – – –
ribotish 100% – – – – – – – – –
ribotricer 100% – – – – – – – – –
Rp-Bp 99.94% – – – – <0.01% – – – 0.05%
PRICE 29.7% 19.6% 12.9% 10.0% 6.4% 5.5% 5.4% 2.6% 2.3% 5.7%

PRICE's gw start-codon distribution is the unique near-cognate signature that distinguishes it from every other tool in the cohort. For production-pipeline design, this means PRICE occupies a non-overlapping niche: it's the only tool that recovers non-AUG-initiated ORFs at scale (CUG-, GUG-, AAG-initiated translation), which is well-documented in the literature as accounting for ~30-40% of mammalian translation initiation events.

The other four tools' near-100% AUG profile is by design — their default thresholds suppress near-cognate predictions. Whether to bake near-cognate recovery into the production pipeline default is a biological question for the project lead; the data argues for at least an opt-in mode using PRICE.

2.6 Metric 6 — Computational cost

Mean ± std of wall + peak memory per tool, across 6 reps. From logs/scaling/{tool}_{rep}.log. Memory profiling deferred: GNU /usr/bin/time -v (which has the -v flag for max-RSS) is not installed on the cluster; only the bash builtin time is available, which captures wall but not memory. Wall captured via explicit T0=$(date +%s); ...; T1=$(date +%s); echo $((T1-T0))s pattern.

Wall times (seconds per rep):

Tool D01_S1 D02_S2 D03_S3 D81_S7 D82_S8 (low-depth) D83_S9 Range
RiboCode 805 778 975 1553 392 1067 6.5-26 min
PRICE 461 316 313 584 247 481 4-10 min — second-fastest, needs gedi -mem 64G
ribotish 6111 5224 4871 6446 3042 4625 51-107 min
ribotricer 7392 7068 7883 9747 4155 8091 69-162 min
Rp-Bp 80,830 76,104 85,491 86,814 70,713 87,063 19h38m-24h11m — Bayesian fit dominates
RibORF killed at ~25h (1/10 length classes done) killed killed killed killed killed Excluded — projected 5-7 days/rep at default settings; see §4.2

S8 (D82_S8) consistently fastest within each tool (50-70% of next-fastest rep) due to lower read depth (12M vs 28-33M).

Metric 6 — Wall-time per tool per replicate

The log-y axis spans 2 orders of magnitude — from PRICE (~4 min) to Rp-Bp (~24 h). The read-depth-dominated runtime pattern (D82_S8 consistently fastest within each tool, ~50-70% the wall of next-fastest rep) confirms that BAM size, not genome complexity, drives wall-time across all tools — useful for production-pipeline scheduling estimates.

2.7 Metric 7 — Mass-spec validation

Dropped (proteomics unavailable; documented in deviations 2026-05-11).


3. Tier recommendations

Based on the 5-tool × 6-replicate gw-scale evaluation, the production tier assignment is:

3.1 Tier 1 candidates (production default)

Both tools pass all M1/M4/M5 sanity floors and have non-overlapping personalities (RiboCode is permissive-novel; Rp-Bp is Bayesian-strict). The recommended production pipeline default is RiboCode for speed-prioritized routine analysis and Rp-Bp for statistical-rigor-prioritized analysis (or both, in an ensemble configuration if false-positive control matters most).

3.2 Tier 2 candidates (opt-in for specific use cases)

3.3 Excluded from production


4. Limitations & open issues

4.3 Methodological

4.4 Scope


5. Reproducibility

5.1 Code

All six parsers + 92 unit tests committed at: - scripts/parse_ribotish.py - scripts/parse_rpbp.py - scripts/parse_riborf.py - scripts/parse_price.py - scripts/parse_ribotricer.py - scripts/parse_ribocode.py - scripts/_common.py (shared helpers) - scripts/test_parsers.py (92 tests) - scripts/metric{1..6}_*.py (6 metric computation + plotting scripts) - scripts/run_price_seq.sh (sequential PRICE launcher; encodes gedi -mem 64G fix)

Test command: pytest scripts/test_parsers.py -v

5.2 Tool environments

Pinned env yamls committed at: - environments/ribotish.yaml - environments/ribotricer.yaml - environments/ribocode.yaml - (Rp-Bp / PRICE / RibORF: tools cloned + built from source on the cluster; reproducible via internal scaling-phase state file paths)

5.3 Git history

Full per-tool parser commits, scaling-phase milestones, and the final Tier-verdict commit chain are preserved in the project repository (internal). Not included in this public release.

5.4 Compute reproducibility


Appendix A — Per-tool deviations summary

50+ deviations from execution plan (EP §5/§6) documented in supplementary deviations document. Headline categories:

Appendix B — Operational lessons from scaling phase

9 operational issues caught + resolved during Phase A0 pre-flight + Phase A:

  1. STAR index at Index/STARIndex/ not Sequence/STARIndex/
  2. gtfToGenePred at $WORK/tools/gtfToGenePred (not in any env's bin/)
  3. RibORF binary path at $WORK/tools/RibORF/RibORF.2.0/ (not $WORK/tools/RibORF.2.0/)
  4. RibORF .pl scripts lack shebang — invoke via perl <script> explicitly
  5. PRICE gedi -a is GTF, -p is "show progress" (no-arg); not -p $GTF
  6. gedi wrapper needs envs/price/bin in PATH for embedded mvn lookup
  7. GNU /usr/bin/time -v not installed on the cluster (only the bash builtin time, which lacks -v for memory) — wall-time only via T0/T1 echo pattern
  8. Rp-Bp prepare-rpbp-genome check_programs_exist requires STAR on PATH even when skipping actual STAR execution
  9. STAR index at sync_structure path uses STAR 2.7.4a (compatible with our STAR 2.7.11b runtime)

Appendix C — Production pipeline integration recommendations

Based on the final Tier verdict, the nf-core/riboseq fork should:

  1. Default workflow runs RiboCode as the primary ORF caller (~6-26 min/rep; covers ~22k ORFs per sample with biology-correct uORF/dORF and 100% AUG canonical-CDS profile). Suitable for routine production cadence.

  2. Statistical-rigor mode (overnight cadence, opt-in for sensitive analyses) runs Rp-Bp alongside RiboCode (~20-24 h/rep; Bayesian-filtered ORF set comparable in volume but stricter selection).

  3. Discovery modes (opt-in, separate config): - alt-start-discovery invokes ribotish (~1 h/rep; ~1M Truncated-CDS calls per sample). Use case: alternative initiation within annotated CDSes. - near-cognate invokes PRICE with gedi -mem 64G (~5-10 min/rep; ~70% non-AUG starts). Use case: CUG/GUG-initiated translation events.

  4. Excluded tools should not be included even as opt-ins: - ribotricer — rank-unstable scoring across replicates makes its score column unreliable for downstream quantification. - RibORF — 5-7 day per-replicate wall is operationally untenable on standard cluster hardware; consider only for one-off retrospective analyses, not routine production.

  5. Consensus calling caveat: if the production pipeline aggregates calls across multiple tools, do not use strict (chrom, start, end, strand) coordinate-equality joins — they yield near-zero overlap across tools (Metric 2 finding). Use bedtools-style fuzzy overlap (≥80% reciprocal) or gene-level aggregation instead.

  6. Memory provisioning: PRICE needs -Xmx64G (set via gedi -mem 64G) at gw scale to avoid silent OOM-killer termination. RiboCode and ribotish are comfortable with default JVM/Python settings. Rp-Bp uses ~3-6 cores per replicate for the Bayesian fit phase.