Skip to main content

Bayesian RNA-seq transcript quantification tool

Project description

Rigel

Bayesian RNA-seq quantification with joint mRNA, nascent RNA, and genomic DNA modeling

CI PyPI Bioconda Python License


Overview

Rigel Overview

Rigel quantifies RNA-seq alignments while explicitly modeling three sources of signal in the same library:

  • Mature RNA (mRNA)
  • Nascent RNA (nRNA)
  • Genomic DNA contamination (gDNA)

The implementation is built around a single-pass native BAM scan plus a locus-level EM solver. A key architectural change in the current codebase is that nRNA is no longer represented as one shadow per transcript. Instead, Rigel builds a global table of unique nRNA spans keyed by (ref, strand, start, end) and shares each nRNA component across transcripts with the same genomic span. This reduces redundant nRNA states in loci with many isoforms that start and end at the same coordinates.

Key features

  • Joint mRNA, nRNA, and gDNA quantification in one locus-level model
  • Shared-span nRNA architecture with one component per unique genomic span (ref, strand, start, end)
  • Single-pass C++ BAM scanner using htslib, with memory-bounded buffering and spill-to-disk support
  • Automatic strand-model training from annotated spliced fragments; protocol auto-detection (R1-sense / R1-antisense)
  • gDNA calibration via Simple Regional Deconvolution (SRD): per-fragment geometric categorization plus a 1-D fragment-length mixture, library-agnostic
  • Empirical Bayes priors for nRNA fractions and gDNA rates; calibrated per-locus gDNA initialization
  • MAP-EM and Variational Bayes EM (VBEM, default) solver modes with SQUAREM acceleration
  • Discrete fragment assignment: fractional, map, or sample (default) post-EM assignment modes
  • Parallel BAM scanning and parallel locus EM controlled through one --threads setting
  • Feather and TSV outputs plus optional annotated BAM output with per-fragment assignment tags

Installation

Bioconda

conda install -c conda-forge -c bioconda rigel

PyPI

pip install rigel-rnaseq

The PyPI package name is rigel-rnaseq because rigel is already taken on PyPI. The import name and CLI stay rigel.

From source

git clone https://github.com/mkiyer/rigel.git
cd rigel

mamba env create -f mamba_env.yaml
conda activate rigel

pip install --no-build-isolation -e .

Requirements

  • Python 3.12+
  • C++17-capable compiler
  • Runtime dependencies: numpy, pandas, pyarrow, pysam, pyyaml

On macOS, install Xcode Command Line Tools first:

xcode-select --install

Quick start

1. Build an index

rigel index \
    --fasta genome.fa \
    --gtf annotation.gtf \
    -o index/

The FASTA must have a .fai index. If needed:

samtools faidx genome.fa

2. Quantify a BAM

rigel quant \
    --bam sample.bam \
    --index index/ \
    -o results/

Input BAM requirements:

  • Name-sorted or collated
  • NH tag present for multimapper handling
  • Splice-junction strand tag available for best strand-model training (XS or ts, or let Rigel auto-detect)

3. Inspect outputs

head results/quant.tsv
head results/gene_quant.tsv
head results/nrna_quant.tsv
head results/loci.tsv
cat results/summary.json

Output files

File Description
quant.feather / quant.tsv Transcript-level abundance table with mrna, nrna, rna_total, tpm, and QC columns
gene_quant.feather / gene_quant.tsv Gene-level aggregates derived from transcript estimates
nrna_quant.feather / nrna_quant.tsv nRNA-span-level abundance estimates (one row per unique genomic nRNA span)
loci.feather / loci.tsv Per-locus EM summary with mrna, nrna, gdna, and gdna_init
summary.json Library protocol, strand specificity, fragment-length histograms, calibration results, alignment counts, and global quantification totals
config.yaml Resolved run configuration (parameters, I/O paths). Rerun with rigel quant --config config.yaml
annotated.bam Optional annotated BAM with ZT, ZG, ZR, ZI, ZJ, ZF, ZW, ZC, ZH, ZN, ZS, ZL, ZB tags. Rigel guarantees a collated-in → collated-out contract: the output contains exactly the same records as the input (no drops, no duplications).

The nrna values in transcript- and gene-level tables are derived from shared nRNA-span counts that are pro-rated across transcripts sharing the same span.


How it works

Rigel runs in two logical stages.

Architecture

 FASTA + GTF ──▶ Index Build (index.py) ──▶ Feather index files
                                                    │
 BAM file ──────────────────────────────────────────┤
                                                    ▼
                              ┌──────────────────────────────────┐
                              │  Stage 1: BAM Scan & Training    │
                              │  C++: BamScanner → Resolver      │
                              │  Py:  buffer.py, strand_model.py │
                              └──────────────┬───────────────────┘
                                             │ FragmentBuffer + models
                                             ▼
                              ┌──────────────────────────────────┐
                              │  Stage 2: Score & Route          │
                              │  C++: fused_score_buffer         │
                              │  Py:  scan.py → ScoredFragments  │
                              └──────────────┬───────────────────┘
                                             │ CSR arrays
                                             ▼
                              ┌──────────────────────────────────┐
                              │  Stage 3: SRD gDNA Calibration   │
                              │  Py:  calibration/_simple.py     │
                              └──────────────┬───────────────────┘
                                             │ per-locus γ (gDNA fraction)
                                             ▼
                              ┌──────────────────────────────────┐
                              │  Stage 4: Locus-Level EM         │
                              │  C++: batch_locus_em (SQUAREM)   │
                              │  Py:  estimator.py dispatch      │
                              └──────────────┬───────────────────┘
                                             │ posterior counts
                                             ▼
                              ┌──────────────────────────────────┐
                              │  Stage 5: Output                 │
                              │  Py:  cli.py → Feather/TSV/JSON  │
                              └──────────────────────────────────┘

BAM scan and model training

A native scanner reads the BAM once, resolves fragments against the indexed annotation, classifies splice structure, trains strand and fragment-length models, and writes resolved fragment data into a columnar buffer.

The main strand model is trained from annotated spliced fragments with unambiguous gene assignment. Diagnostic exonic and intergenic strand models are also retained for reporting, but gDNA itself is always scored with strand probability 0.5.

gDNA calibration

Before per-locus EM, Rigel runs Simple Regional Deconvolution (SRD). Every uniquely-aligned fragment is classified into one of seven geometric categories using only per-candidate exon-overlap counts computed by the C++ scanner. Fragments that geometrically cannot originate from mature mRNA — those overhanging transcript edges, falling entirely in introns, or mapping outside any annotated transcript — form a "gDNA pool". A 1-D fragment-length mixture

pool_FL(L) ≈ π·gDNA_FL(L) + (1−π)·RNA_FL(L)

recovers gDNA_FL(L) and the library-wide gDNA fraction π. Per-locus Dirichlet priors are derived from per-fragment posteriors and feed the EM. No regional density model, no per-region exposure, no SS-threshold magic numbers. See docs/calibration/srd_v1_implementation.md for the full derivation.

Locus-level EM

Ambiguous fragments are routed into CSR form and grouped into connected components of overlapping transcripts. For a locus with T transcripts and N unique nRNA spans, Rigel solves a T + N + 1 component problem:

  • T mRNA components
  • N shared nRNA components
  • 1 merged gDNA component for the locus

The solver runs VBEM (default) or MAP-EM with SQUAREM acceleration. A tripartite prior (coverage-weighted OVR for mRNA, sparsifying Dirichlet for nRNA, calibrated γ for gDNA) is applied. Post-EM fragments are assigned using the configured assignment mode (sample by default).


Documentation

Document Description
docs/MANUAL.md CLI reference, parameter defaults, configuration rules, and output schema
docs/METHODS.md Algorithmic description of the implemented model and priors
docs/PUBLISHING.md Release workflow for PyPI and Bioconda
docs/parameters.md Complete parameter reference with defaults and config dataclass mapping

Citing Rigel

If you use Rigel in research, cite the repository for now:

Iyer MK. Rigel: Bayesian RNA-seq quantification with joint mRNA, nascent RNA, and genomic DNA modeling. 2026. https://github.com/mkiyer/rigel


License

Rigel is distributed under the GNU General Public License v3.0.


Development

pytest tests/ -v
pytest tests/ --cov=rigel --cov-report=term-missing

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rigel_rnaseq-0.6.2.tar.gz (5.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_x86_64.whl (7.5 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.28+ x86-64

rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_aarch64.whl (7.2 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.28+ ARM64

rigel_rnaseq-0.6.2-cp312-abi3-macosx_15_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12+macOS 15.0+ ARM64

File details

Details for the file rigel_rnaseq-0.6.2.tar.gz.

File metadata

  • Download URL: rigel_rnaseq-0.6.2.tar.gz
  • Upload date:
  • Size: 5.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rigel_rnaseq-0.6.2.tar.gz
Algorithm Hash digest
SHA256 86202d811a462f36f4a6e93593c05a7aac47d7a87546e9d6a4697112e747ab72
MD5 d3ad41cab6f7c199bfec5b4d8b9ddd09
BLAKE2b-256 1d99a1f9e17a56510f96b41d8bca1ae960c3443590954764329b744d89ee1ff7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rigel_rnaseq-0.6.2.tar.gz:

Publisher: publish.yml on mkiyer/rigel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8cb1e298d9253d028010c9c3be7058ff54aeff9e1a0509615bf8a78e53d1afab
MD5 0412428cc0e3305154b2882c97d36ed2
BLAKE2b-256 ab4b758fc6e00c963ab6f33594a6695b88cfffec6ed8492490c46ddba028036d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on mkiyer/rigel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 85b1cea1d161695e6e79b58729d7bc70b8e8960aa7d0757274bf3bc104a530df
MD5 749dc9341aa6de4a69a74532123b4083
BLAKE2b-256 368e181636ef8f2d95796568c3fd7649f7f7c71cba5b9d24127e0ebc38dd82e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rigel_rnaseq-0.6.2-cp312-abi3-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on mkiyer/rigel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rigel_rnaseq-0.6.2-cp312-abi3-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for rigel_rnaseq-0.6.2-cp312-abi3-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7deac681181db894ab404649bdb5535af0ac1eaf4dd7b0a3e2dc89a0b0983b5a
MD5 11c161190204b9653cc200c1ae7daef3
BLAKE2b-256 f9e8f45b832376a8ab5cab9c44282f5e408603f45422cf3a2471ea9bc81b2b81

See more details on using hashes here.

Provenance

The following attestation bundles were made for rigel_rnaseq-0.6.2-cp312-abi3-macosx_15_0_arm64.whl:

Publisher: publish.yml on mkiyer/rigel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page