Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

## [Unreleased]

**Added**
- Added `RNAReadPhasingSource`, a BAM-backed `ReadPhasingSource`
implementation for RNA read/fragment co-occurrence. It is consumed
through `MolecularPhaseResolver(source)` and lives behind the optional
`varcode[rna]` / `pysam` dependency. `ReadPhaseResolver` remains as
the varcode 5.0 compatibility name.

**Breaking**
- Unified the multi-outcome machinery: `SpliceCandidate` deleted;
`MultiOutcomeEffect.outcomes` accessor + `_with_extra_outcomes`
Expand Down
8 changes: 8 additions & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,18 @@ Auto-generated from in-source docstrings via

::: varcode.MutantTranscriptSource

### `varcode.MolecularPhaseResolver`

::: varcode.MolecularPhaseResolver

### `varcode.ReadPhaseResolver`

::: varcode.ReadPhaseResolver

### `varcode.RNAReadPhasingSource`

::: varcode.RNAReadPhasingSource

### `varcode.VCFPhaseResolver`

::: varcode.VCFPhaseResolver
Expand Down
9 changes: 7 additions & 2 deletions docs/germline.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@ possibility set** — one classified effect per haplotype hypothesis

- `VCFPhaseResolver(merged_phased.vcf)` — reads `PS` tags from a
WhatsHap- or HapCUT2-phased merged VCF.
- `ReadPhaseResolver(source)` — wraps any RNA-phasing source
- `MolecularPhaseResolver(source)` — wraps any RNA-phasing source
(typically an Isovar adapter shipped by `openvax/isovar`) to check
which haplotype the somatic was observed on in RNA reads.
For RNA-seq BAMs without assembly, use
`MolecularPhaseResolver(RNAReadPhasingSource("tumor.rna.bam"))` to phase
by direct read/fragment co-occurrence. Raw BAM phasing does not
provide observed `MutantTranscript`s; assembly-backed sources can.
`ReadPhaseResolver` remains as the varcode 5.0 compatibility name.
- Anything implementing `in_cis(v1, v2, transcript) -> bool | None`.

Phase known → single `MutationEffect`. Phase unknown →
Expand Down Expand Up @@ -111,7 +116,7 @@ print("trans ->", type(eff_trans).__name__, eff_trans.short_description)
```

In real code use `VCFPhaseResolver(merged_phased.vcf)` or
`ReadPhaseResolver(source)` — same `phase_resolver=` slot.
`MolecularPhaseResolver(source)` — same `phase_resolver=` slot.

## When does this matter?

Expand Down
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ include = ["varcode", "varcode.*"]
"Homepage" = "https://github.com/openvax/varcode"
"Bug Tracker" = "https://github.com/openvax/varcode/issues"

[project.optional-dependencies]
rna = ["pysam>=0.21"]

[project.scripts]
varcode-genes = "varcode.cli.genes_script:main"
varcode = "varcode.cli.effects_script:main"
Expand Down
8 changes: 8 additions & 0 deletions tests/test_read_phase_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from pyensembl import cached_release

from varcode import (
MolecularPhaseResolver,
MutantTranscript,
MutantTranscriptSource,
ReadPhaseResolver,
Expand Down Expand Up @@ -84,6 +85,13 @@ def test_resolver_default_phase_source_tag():
assert resolver.phase_source == "read_phasing"


def test_molecular_resolver_is_preferred_name():
resolver = MolecularPhaseResolver(StubReadPhasingSource())
assert resolver.phase_source == "molecular_phasing"
assert isinstance(ReadPhaseResolver(StubReadPhasingSource()),
MolecularPhaseResolver)


def test_in_cis_true_when_both_observed_together():
transcript = _cftr()
v1 = Variant("7", 117531100, "T", "A", ensembl_grch38)
Expand Down
Loading