Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
6bdf490
feat(quant): add TranscriptomeIndex built from GTF exon groups
ewels Apr 17, 2026
ae8b253
feat(quant): project genome alignments onto transcripts (align_to_tra…
ewels Apr 17, 2026
35e3582
feat(quant): filter modes + softclip extension for transcriptome SAM
ewels Apr 17, 2026
51ebe28
feat(params): --quantTranscriptomeSAMoutput + TranscriptomeSAM valida…
ewels Apr 17, 2026
7600a8c
feat(io/bam,lib): wire Aligned.toTranscriptome.out.bam pipeline
ewels Apr 17, 2026
6008336
test: integration test for --quantMode TranscriptomeSAM
ewels Apr 17, 2026
ab5523a
chore(simplify): drop dead Display + allow_single_end on QuantTranscr…
ewels Apr 17, 2026
505a30f
chore(simplify): share a single rc_encode helper in transcriptome bui…
ewels Apr 17, 2026
557de39
chore(simplify): emit PE transcriptome records with one build call pe…
ewels Apr 17, 2026
eee8518
chore(simplify): share primary-hit + MAPQ picker between SE and PE
ewels Apr 17, 2026
724103f
chore(simplify): share BGZF writer setup between BamWriter constructors
ewels Apr 17, 2026
5781129
chore(simplify): collapse locals in extend_softclips trailing fixup
ewels Apr 17, 2026
c86c07d
chore(simplify): tighten filter_and_project docs + drop unread read_s…
ewels Apr 17, 2026
95bef01
chore(simplify): fix stale mate_or_junction_before comment in align_t…
ewels Apr 17, 2026
2e95a44
chore(simplify): drop speculative BamWriter::header accessor
ewels Apr 17, 2026
9725513
chore(simplify): accept IntoIterator in build_transcriptome_records_pe
ewels Apr 17, 2026
a31fc4f
chore(simplify): drop redundant StdHashMap alias in transcriptome tests
ewels Apr 17, 2026
a8686df
chore: apply cargo fmt
ewels Apr 21, 2026
982b96e
feat(quant): add tr_exi cumulative exon offset to TranscriptomeIndex
ewels Apr 22, 2026
a2a9bd0
feat(quant): add gene interning (gene_ids/names/biotypes + tr_gene_idx)
ewels Apr 22, 2026
5a38ea3
fix(quant): compute tr_exi in STAR's sorted order, not insertion order
ewels Apr 22, 2026
b259c23
feat(quant): write transcriptInfo.tab in STAR's exact byte format
ewels Apr 22, 2026
b735628
feat(quant): write exonInfo.tab in STAR's exact byte format
ewels Apr 22, 2026
69ee062
feat(quant): write geneInfo.tab in STAR's exact byte format
ewels Apr 22, 2026
dc5d45b
feat(quant): write exonGeTrInfo.tab in STAR's exact byte format
ewels Apr 22, 2026
6898536
feat(quant): write sjdbList.fromGTF.out.tab in STAR's exact byte format
ewels Apr 22, 2026
3c828d5
feat(quant): load TranscriptomeIndex from on-disk STAR files
ewels Apr 22, 2026
1349196
feat: persist transcriptome index at genomeGenerate, load at alignReads
ewels Apr 22, 2026
e6eed98
feat(align): add i_frag mate index to Exon
ewels Apr 22, 2026
bff2f8c
feat(quant): handle mate boundary in transcriptome projection
ewels Apr 22, 2026
7db1d40
feat(align): add PairedAlignment::combined_transcript_for_projection
ewels Apr 22, 2026
6351a68
test: verify byte-format parity of all 5 STAR-compatible index files
ewels Apr 22, 2026
16d719f
Fix bug in diagonal dedup in stitch_seeds_core
Psy-Fer Apr 22, 2026
43b17c8
combined seed search and RC bug fix
Psy-Fer Apr 22, 2026
0535f9d
fix(quant): match STAR's geneInfo.tab fallback strings
ewels Apr 22, 2026
fa29f13
test: add diff_star_transcriptome.sh — byte-for-byte parity script
ewels Apr 22, 2026
c6e1ea1
fix(genome): match STAR's genomeParameters.txt byte-for-byte
ewels Apr 22, 2026
96d071c
chore(simplify): reuse Genome::position_to_chr in TranscriptomeIndex …
ewels Apr 22, 2026
cbe4e39
chore(simplify): lift GTF attribute names + MissingGeneType to constants
ewels Apr 22, 2026
277415d
test: simplify diff script with a symlink pointing to per-tool index dir
ewels Apr 22, 2026
2b1b342
chore(simplify): drop redundant tr_gene_id string field from Transcri…
ewels Apr 22, 2026
304a39c
fix(params): don't require --sjdbGTFfile at alignReads when the index…
ewels Apr 22, 2026
649fd6e
fix(io/bam): write header with a lenient validator (STAR tRNA names)
ewels Apr 22, 2026
bc1aa6e
feat(junction): splice motif classifier for sjdb insertion
ewels Apr 22, 2026
6d1ea6c
feat(junction): compute sjdb shift_left / shift_right for junctions
ewels Apr 22, 2026
644f6a9
feat(junction): PreparedJunction + prepare_junction pipeline
ewels Apr 22, 2026
d5e41f5
Phase E3: Combined-threshold for half-mapped fallback
Psy-Fer Apr 22, 2026
35638fd
PE-CHECK2 guard removal
Psy-Fer Apr 22, 2026
81ece99
chore(simplify): reuse detect_splice_motif / encode_motif in sjdb_insert
ewels Apr 22, 2026
166cf5f
feat(junction): sort + cross-strand dedup for prepared junctions
ewels Apr 22, 2026
19c378b
feat(junction): build_gsj() — concatenated SJ flanking-sequence buffer
ewels Apr 22, 2026
771eeb5
feat(junction): write sjdbInfo.txt + sjdbList.out.tab
ewels Apr 22, 2026
7df9137
feat(genome): Genome::append_sjdb() — extend forward + rebuild RC
ewels Apr 22, 2026
87cdf9c
feat(index): wire sjdb insertion into GenomeIndex::build + extended d…
ewels Apr 22, 2026
45792dd
Merge upstream/dev into feat/transcriptome-sam
ewels Apr 22, 2026
a26d636
chore(simplify): collapse try_pair_transcripts now that all callers s…
ewels Apr 22, 2026
148f9a4
Merge remote-tracking branch 'origin/feat/transcriptome-sam' into fea…
ewels Apr 22, 2026
5d454b0
split_combined_wt n_mismatch propagation
Psy-Fer Apr 24, 2026
1bdbb9a
Merge origin/main (PRs #5 run-rng-seed, #6 sam-rg-line) into dev
Psy-Fer Apr 24, 2026
02cc0e1
Merge PR #7: --quantMode TranscriptomeSAM output
Psy-Fer Apr 24, 2026
c3a0ebf
Merge PR #8: SJ insertion into Genome + SA at genomeGenerate
Psy-Fer Apr 24, 2026
d86e407
Adjust faithful % to exlcude random but correct calls
Psy-Fer Apr 24, 2026
f0463ca
update based on some failed changes
Psy-Fer Apr 24, 2026
83cf2af
Per-fragment PE seeding fix
Psy-Fer Apr 28, 2026
c955909
Phase G1 junction_shifts fix in split_combined_wt
Psy-Fer Apr 29, 2026
c76e124
Phase G2 MAX_RECURSION increased and sa_pos_to_forward overflow fix
Psy-Fer Apr 29, 2026
5a185ae
update docs
Psy-Fer Apr 29, 2026
f9f976b
sortedBamWriter
Psy-Fer Apr 29, 2026
72f54ae
update md docs for 17.2
Psy-Fer Apr 29, 2026
760fc0a
phase 17.4 --outReadsUnmapped
Psy-Fer Apr 29, 2026
4e0343d
phase 17.6 --outStd
Psy-Fer May 1, 2026
32ec461
Phase G3 makeing indexes match
Psy-Fer May 1, 2026
b9bede1
phase 17.3 - Add chimeric detection
Psy-Fer May 1, 2026
0e67766
phase 17.11 - --chimOutType WithinBAM
Psy-Fer May 1, 2026
5c980d8
Phase 17.7 new GTF commands
Psy-Fer May 1, 2026
e1279ac
update docs
Psy-Fer May 1, 2026
2dc0381
Phase 17.9 --outBAMcompression and --limitBAMsortRAM
Psy-Fer May 1, 2026
567ae36
Phase 17.10 PE soft-clip chimeric remapping
Psy-Fer May 1, 2026
538d452
phase 17.12 - BySJout disk-buffering
Psy-Fer May 1, 2026
ee8731a
Phase 17.13 integration tests
Psy-Fer May 1, 2026
004f077
Phase 17.10 and 12.2 more chimeric reads
Psy-Fer May 4, 2026
51c64b5
update docs
Psy-Fer May 4, 2026
75831a2
cargo fmt fixes
Psy-Fer May 4, 2026
fccc423
doc cleanup and contributing
Psy-Fer May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 16 additions & 19 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Always run `cargo clippy`, `cargo fmt --check`, and `cargo test` before consider

## Current Status

**278 tests passing, 0 clippy warnings.** SE: 8796/8926 compare_sam.py (98.5%), 2.2% splice rate (STAR: 2.2%), 66 shared junctions, **100.0% MAPQ agreement, MAPQ inflation: 0, deflation: 0**. 127 position disagreements (ALL verified as genuine ties). 1 CIGAR-only disagree (ERR12389696.13573895, insertion placement, seed-level tie). **0 STAR-only / 0 ruSTAR-only SE reads**. PE: **8767 both-mapped** (STAR: 8390), **236 half-mapped** (new behavior), 28 MAPQ inflations / 192 deflations (rDNA N² problem), **98.2% per-mate position agreement**, **93.920% PE exact faithfulness** (pos+CIGAR+MAPQ+proper+NH). Phase 17.A: `scoreSeedBest` pre-extension. Phase 17.B: per-mate seeding. Phase 17.C: STAR-faithful SCORE-GATE + mappedFilter (0 MAPQ inflations). Phase 17.D: combined-span penalty fix + dedup ordering (248→236 half-mapped). Phase 17.8: `--quantMode GeneCounts`. See [ROADMAP.md](ROADMAP.md) for detailed phase tracking and [docs/](docs/) for per-phase notes.
**396 tests passing, 0 clippy warnings.** SE: 8613/8926 compare_sam.py (96.5%; note: lower due to seeded-RNG tie-break PR diverging from STAR's mt19937), **99.815% faithfulness (tie-adjusted)** (8611/8627 non-tie reads exact), 299 tie-breaking diffs excluded. 1 CIGAR-only disagree (ERR12389696.13573895, insertion placement, seed-level tie). **0 STAR-only / 0 ruSTAR-only SE reads**. PE: **8390 both-mapped** (STAR: 8390), **0 half-mapped**, 0 MAPQ inflations / 0 deflations, **99.883% PE exact faithfulness (tie-adjusted)** (16284/16306, 475 tie-breaking diffs excluded), **0 proper-pair diffs**, **0 NH diffs**. Phase 17.A: `scoreSeedBest` pre-extension. Phase 17.B: per-mate seeding. Phase 17.C: STAR-faithful SCORE-GATE + mappedFilter. Phase 17.D: combined-span penalty fix + dedup ordering. Phase 17.8: `--quantMode GeneCounts`. Phase E fix (2026-04-21): mate_id-aware diagonal dedup. Phase E2 (2026-04-22): STAR-faithful combined-read seeding. Phase E3 (2026-04-22): combined-threshold half-mapped fallback. Phase E4 (2026-04-22): PE-CHECK2 unconditional. Phase E5 (2026-04-23): split_combined_wt n_mismatch propagation. Phase E6 (2026-04-24): tie-adjusted faithfulness metric in assess_faithfulness.py. Phase F1: --runRNGseed + seeded primary tie-break (PR #5). Phase F2: --outSAMattrRGline (PR #6). Phase F3: --quantMode TranscriptomeSAM (PR #7). Phase F4: SJDB insertion into Genome+SA at genomeGenerate (PR #8). Phase G1 (2026-04-29): junction_shifts fix in split_combined_wt (rDNA cross-copy false-splice filter). Phase G2 (2026-04-29): MAX_RECURSION 10k→100k + sa_pos_to_forward overflow fix (ERR12389696.7118031 NH=3→9). Phase 17.2 (2026-04-29): coordinate-sorted BAM output (`--outSAMtype BAM SortedByCoordinate` → `Aligned.sortedByCoord.out.bam`). Phase 17.4 (2026-04-29): `--outReadsUnmapped Fastx` → `Unmapped.out.mate1` / `Unmapped.out.mate2`; writes unmapped + TooManyLoci reads; PE writes both mates for fully-unmapped and half-mapped pairs. Phase 17.6 (2026-05-01): `--outStd SAM/BAM_Unsorted/BAM_SortedByCoordinate` — routes primary alignment output to stdout via `Box<dyn AlignmentWriter>` trait dispatch; `SamStdoutWriter`, `BamStdoutWriter`, `SortedBamStdoutWriter` in sam.rs/bam.rs; verified with samtools pipe (967 records). Phase G3 (2026-05-01): SA tie-breaking fix — `compare_suffixes` tie-breaker changed from `pos_b.cmp(&pos_a)` to `packed_a.cmp(&packed_b)` (ascending by packed SA value with strand bit); ruSTAR SA is now **byte-for-byte identical** to STAR's SA for the yeast genome (10,862 → 0 entry diffs). diff AS: 6→4 cases (4 remaining are ruSTAR improvements: .844151 VIII 0mm vs STAR VII 6mm, .4972950 spliced vs unspliced mate2). Phase 17.3 (2026-05-01): PE chimeric detection — `detect_inter_mate_chimeric` in `chimeric/detect.rs`; intra-mate multi-cluster chimeric via cluster splitting + mate2 read_pos adjustment; inter-mate chimeric for discordant pairs (diff chr, same strand, or >1Mb); `align_paired_read` returns 4-tuple including `Vec<ChimericAlignment>`; no benchmark regression (8390 both-mapped, 0 half-mapped). Phase 17.11 (2026-05-01): `--chimOutType WithinBAM` — chimeric alignments written as supplementary records (FLAG 0x800) in primary BAM; donor record has full SEQ + SA tag; acceptor has FLAG 0x800 + SA tag + empty SEQ; `build_within_bam_records` in `chimeric/output.rs`; `chim_out_junctions()` / `chim_out_within_bam()` helpers in params.rs; supports mixed `--chimOutType Junctions WithinBAM`. Phase 17.7 (2026-05-01): GTF tag parameters — `--sjdbGTFchrPrefix`, `--sjdbGTFfeatureExon`, `--sjdbGTFtagExonParentTranscript`, `--sjdbGTFtagExonParentGene`; `_configured` variants in `junction/gtf.rs`, `quant/mod.rs`, `quant/transcriptome.rs`, `junction/mod.rs`; all 4 production paths thread params; backward-compat wrappers preserve zero test disruption. Phase 17.9 (2026-05-01): `--outBAMcompression` (BGZF level -1–9, default 1; -1/0=NONE, 1-8=flate2 levels, ≥9=BEST) + `--limitBAMsortRAM` (bytes, 0=unlimited; aborts sort if ~400 bytes/record estimate exceeds limit); `bgzf_compression()` + `make_bgzf_writer()` helpers in `io/bam.rs`; threaded through all 4 BAM writers (unsorted file, sorted file, unsorted stdout, sorted stdout). PE chimericDetectionOld (2026-05-01): per-mate `detect_chimeric_old` called on `all_m1_transcripts` / `all_m2_transcripts` pools after `filter_paired_transcripts` in `read_align.rs`. Phase 17.12 (2026-05-01): BySJout disk buffering — `BySJReadMeta` struct + `NamedTempFile` SAM temp file replaces `Vec<AlignmentBatchResults>`; `create_bysj_writer` / `bysj_write_records` / `bysj_read_n_records` helpers in `io/sam.rs`; `tempfile` moved to `[dependencies]`. Phase 17.13 (2026-05-01): 8 integration tests in `tests/alignment_features.rs` — synthetic 20kb genome with planted GT-AG intron; tests cover BAM output, PE alignment, spliced reads, BySJout, GeneCounts, unmapped output, two-pass mode. Phase 12.2 (2026-05-04): SE chimeric Tier 1b soft-clip re-mapping — `detect_from_soft_clips` in `chimeric/detect.rs` re-seeds the primary alignment's soft-clipped bases when `detect_chimeric_old` finds no partner; `adjust_read_positions` helper shifts sub-seq coords into full-read space for right clips; called as Step 3c in `read_align.rs`. Phase 17.10 (2026-05-04): Chimeric Tier 3 — `detect_from_chimeric_residuals` in `chimeric/detect.rs` re-seeds outer uncovered read regions (before donor / after acceptor) of each found chimeric pair; enables 3-way gene-fusion detection; called as Step 3d in `read_align.rs`. See [ROADMAP.md](ROADMAP.md) for detailed phase tracking and [docs/](docs/) for per-phase notes.

## Source Layout

Expand Down Expand Up @@ -64,7 +64,7 @@ src/
mod.rs -- Module exports
fastq.rs -- FASTQ reader (plain + gzip, noodles wrapper)
sam.rs -- SAM writer (header + records, noodles wrapper)
bam.rs -- BAM writer (BGZF compression, streaming unsorted output)
bam.rs -- BAM writer (BGZF compression, streaming unsorted + in-memory sorted output)
junction/
mod.rs -- GTF parsing, junction database, motif detection, two-pass filtering
sj_output.rs -- SJ.out.tab writer
Expand All @@ -73,7 +73,7 @@ src/
mod.rs -- Gene-level read counting (--quantMode GeneCounts, ReadsPerGene.out.tab)
chimeric/
mod.rs -- Module exports
detect.rs -- Chimeric detection (Tier 1: soft-clip, Tier 2: multi-cluster)
detect.rs -- Chimeric detection (Tier 1: transcript-pair, Tier 1b: soft-clip re-seed, Tier 2: multi-cluster, Tier 3: residual re-seed)
segment.rs -- ChimericSegment and ChimericAlignment data structures
score.rs -- Junction type classification, repeat length calculation
output.rs -- Chimeric.out.junction writer (14-column format)
Expand Down Expand Up @@ -130,16 +130,16 @@ predicates = "3"
- Every phase uses differential testing against STAR where applicable
- Test data tiers: synthetic micro-genome → chr22 → full human genome

**Current test status**: 278/278 tests passing (274 unit + 4 integration), 0 clippy warnings
**Current test status**: 364/364 tests passing (359 unit + 5 integration), 0 clippy warnings

## Known Issues — Disagreement Root Causes (10k SE yeast)

**127 total position disagreements — ALL verified as genuine ties** (confirmed via STAR debug tracing):
**299 total position disagreements — ALL verified as genuine ties** (SA-order ties + seeded-RNG tie-break divergence from STAR's mt19937):

Both tools find identical alignment sets for all 127 disagreements. The primary difference is tie-breaking order (SA iteration order). Neither alignment is more correct than the other.
Both tools find identical alignment sets for all 299 disagreements. Primary selection differs either due to SA iteration order or RNG seed divergence (PR #5: `--runRNGseed`, uses `StdRng`, not `mt19937`).

- **100 diff-chr ties** — same set of alignments, different repeat copy chosen as primary.
- **27 same-chr ties** — same alignment set, different primary due to tie-breaking (includes multi-intron reads where both tools find same 2 alignments but select different primaries).
- **100+ diff-chr ties** — same set of alignments, different repeat copy chosen as primary.
- **27+ same-chr ties** — same alignment set, different primary due to tie-breaking.

**1 CIGAR-only disagreement (same position, different CIGAR):**
- `ERR12389696.13573895`: both tools align to XV:218357 MAPQ=255, but ruSTAR gives `100M1I45M4S` (insertion at read pos 100) while STAR gives `108M1I37M4S` (insertion at 108). Root cause: both alignments score AS=133. The 71-base seed is found at RC pos 29 (ruSTAR) vs RC pos 37 (STAR) due to different Lmapped chain paths through a long homopolymer region. Same diagonal, different starting position → different insertion placement. Seed-level tie.
Expand All @@ -161,22 +161,19 @@ Previously listed issues now resolved:

See [ROADMAP.md](ROADMAP.md) and [docs/](docs/) for full issue tracking.

## PE Status (Updated 2026-04-17 — Phase 17.D)
## PE Status (Updated 2026-04-29 — Phase G2)

**Phase 17.D** (combined-span penalty + dedup ordering): **PE both-mapped = 8767** (STAR: 8390), **half-mapped = 236** (was 248 Phase 17.B), **98.2% per-mate position agreement**, **93.920% PE exact faithfulness**.
**Current**: **PE both-mapped = 8390** (STAR: 8390, exact match!), **half-mapped = 0**, **99.883% PE exact faithfulness (tie-adjusted)** (16284/16306, 475 tie-breaking diffs excluded). MAPQ inflations: **0**, deflations: 0. NH diffs: **0**. 1 STAR-only mate (`.18919121`, SA-level diff), 1 ruSTAR-only mate (`.6302610`, pre-existing FP).

**Two fixes in Phase 17.D**:
1. `try_pair_transcripts` now computes STAR-faithful combined-span penalty: `combined_wt_score = t1.score + t2.score - p1 - p2 + combined_p`. Previously double-applied per-mate span penalties → AS tag wrong for 99.6% of PE reads. Now 3.1%.
2. Decision tree reordered to (1) position dedup → (2) score-range filter → (3) TooManyLoci → (4) quality filter. Fixes 12 half-mapped pairs.
**Phase G2** (2026-04-29): `MAX_RECURSION` 10,000→100,000 + `sa_pos_to_forward` overflow fix. `ERR12389696.7118031` was the sole source of both NH diffs and MAPQ inflations (NH=3 vs STAR's NH=9, ruSTAR MAPQ=1 vs STAR MAPQ=0). Root cause: the 47-WA rDNA cluster (4 copies × multiple seeds per mate) exhausted 10k recursions before exploring the 4th within-copy pair. Fix: raise the per-cluster recursion budget from 10k to 100k. Also fixed: `sa_pos_to_forward` underflow panic for reverse-strand seeds near genome boundary (now `saturating_sub`). Also added guard in `finalize_transcript` to reject WTs where `adjusted_genome_start + ref_len > n_genome`.

**Current PE parity**: 8767 vs STAR 8390 (+377 extra, mostly rDNA N² cross-copy pairs). 236 half-mapped. 28 MAPQ inflations / 192 deflations (rDNA N² problem). `.18919121` fixed (Phase 17.B). `.6302610` still FP.
**Phase G1** (2026-04-29): `split_combined_wt` junction_idx fix. Reduced `.16980960`'s pairs from 11 to 9, matching STAR's NH=9.

## Remaining Limitations (Top 5)
**Note on faithfulness change**: Phase F1 (--runRNGseed PR) changed PE tie-breaking from SA-order to seeded StdRng, increasing tie-breaking diffs. Phase G1 improved faithfulness from 99.755% → 99.865%. Phase G2: 99.865% → 99.883%.

## Remaining Limitations (Top 2)

- No coordinate-sorted BAM output (use `samtools sort`) — Phase 17.2
- No PE chimeric detection — Phase 17.3
- No `--outStd SAM/BAM` (stdout output) — Phase 17.6
- No `--outReadsUnmapped Fastx` — Phase 17.4
- No STARsolo single-cell features — Phase 14 (deferred)
- 4 PE AS diffs (ruSTAR improvements, not bugs): `.844151` finds VIII:451791 0mm vs STAR's VII:1001391 6mm; `.4972950` finds correct spliced mate2 vs STAR's unspliced. Both cases: STAR's combined-window approach fails to stitch a PE pair at the better location.

See [docs/phase17_features.md](docs/phase17_features.md) for full feature status.
29 changes: 29 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Contributing to ruSTAR

## Building and testing

Rust 2024 edition. Standard Cargo commands:

```bash
cargo build # debug build
cargo build --release # release build
cargo test # run all tests
cargo clippy # lint (zero warnings expected)
cargo fmt --check # formatting check
```

CI runs on Linux (x86_64, x86-64-v3, aarch64), macOS (aarch64), and Windows (x86_64). PRs must pass all CI checks before merging.

## Test data

Small synthetic and yeast test data lives in `test/`. Integration tests in `tests/` use the synthetic genome. Differential testing against STAR reference outputs is done via `test/compare_sam.py` and `test/compare_pe.py`.

## Project history

ruSTAR was written as a faithful port of [STAR](https://github.com/alexdobin/STAR) by Alexander Dobin. Up to the initial release, the goal was behavioral parity with STAR — matching its algorithms, thresholds, and output formats as closely as possible. Notes from that development phase are in `docs/dev/`.

Future development is not bound by that constraint. Adding STARsolo, new features, or diverging from STAR behavior is entirely welcome.

## License

MIT, matching the original STAR license.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ rayon = "1"
dashmap = "6"
chrono = "0.4"
rand = "0.8"
tempfile = "3"

[dev-dependencies]
tempfile = "3"
assert_cmd = "2"
predicates = "3"

Expand Down
Loading
Loading