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)
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)
Index/STARIndex/ (STAR 2.7.4a)| 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.
| 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) |
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
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).
internal planning document 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.
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.
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.
Pairwise Jaccard across tools using a (chrom, start, end, strand) coordinate-equality join, averaged across the 6 reps.
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.
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.
Reveals three distinct tool "personalities":
annotated + ~25% novel, with small uORF/dORF tails. Total volume ~18-29k ORFs per rep — smallest of the cohort.annotated + ~28-32% novel, with a balanced uORF/dORF tail. Total ~18-26k ORFs per rep — comparable volume to RiboCode. The category profile aligns with RiboCode's "conservative canonical caller" personality, consistent with the literature reputation of Rp-Bp as the most statistically stringent ORF caller.annotated, ~60% Truncated (alt-starts within annotated CDSes), ~10% Overlap_dORF. Total ~830k-1.08M per rep. The Truncated dominance is a design choice — every plausible alternative start within an annotated CDS is reported as a separate ORF.dORF fraction (vs ~3% uORF). Total ~350k-545k per rep.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.)
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.
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.
Aggregated across the 6 reps (start-codon prevalence is a tool-intrinsic property of the model + threshold, not sample-specific).
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.
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).
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.
Dropped (proteomics unavailable; documented in deviations 2026-05-11).
Based on the 5-tool × 6-replicate gw-scale evaluation, the production tier assignment is:
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).
73fb126) are retained as supplementary evidence of its call profile, but it is not a viable production candidate. See §4.2 for the technical details and the comment-to-the project lead summary.PRICE gw initially failed, resolved 2026-05-14: First gw attempt produced 6 partial .cit reads files without their .cit.metadata.json JSON sidecars — gedi's Bam2CIT merge step was never finalized (left .CITI*.data + .DISK*.data temp staging files). Re-running Bam2CIT with empty per-rep output directories produced clean .cit + .cit.metadata.json pairs. A second crash mid-PRICE (Java OOM on default 16 GB heap) was fixed by passing gedi -mem 64G. After both fixes, all 6 PRICE reps completed in 4-10 min wall each — well under the v3.1 plan's 1-4 h per-rep estimate. PRICE is included in the final Tier-2 cohort.
RibORF gw operationally untenable: readDist.pl is implemented as an outer length-class loop wrapping an inner SAM-file read loop (verified at lines 54 + 58 of the script). The SAM file is therefore re-parsed once per length class — 10 length classes × ~20M reads/SAM = effectively O(reads × lengths) Perl serial work per replicate. Empirically, the first length class took ~16h to produce its outputs on all 6 reps simultaneously; the remaining 9 length classes were projected to take comparable wall time each based on file-write cadence, putting the per-replicate total at 5-7 days on this cluster's hardware. After 25 hours elapsed and only length-class 25 (1 of 10) complete across all 6 reps, the jobs were killed (2026-05-14) and RibORF was excluded from production tier candidacy on operational grounds. The exclusion is a wall-time finding, not a call-quality finding — RibORF's ORF predictions themselves are not in question; chr1 vertical-slice results (73fb126) are retained as supplementary evidence of its call profile. A restart with a reduced length-class set (e.g., -d 28,29,30 only) would still cost ~2 days/rep — also untenable for routine production use.
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
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)
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.
outputs/normalized/sample_metadata.tsv documents cohort metadata50+ deviations from execution plan (EP §5/§6) documented in supplementary deviations document. Headline categories:
ORF_gstart > ORF_gstop convention9 operational issues caught + resolved during Phase A0 pre-flight + Phase A:
Index/STARIndex/ not Sequence/STARIndex/gtfToGenePred at $WORK/tools/gtfToGenePred (not in any env's bin/)$WORK/tools/RibORF/RibORF.2.0/ (not $WORK/tools/RibORF.2.0/).pl scripts lack shebang — invoke via perl <script> explicitly-a is GTF, -p is "show progress" (no-arg); not -p $GTFenvs/price/bin in PATH for embedded mvn lookup/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 patternprepare-rpbp-genome check_programs_exist requires STAR on PATH even when skipping actual STAR executionBased on the final Tier verdict, the nf-core/riboseq fork should:
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.
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).
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.
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.
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.
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.