prs-ui
Reusable Reflex UI components for Polygenic Risk Score (PRS) computation using the PGS Catalog.
Built on top of just-prs for the computation engine and reflex-mui-datagrid for data grid display.
Installation
pip install prs-ui
Running the Standalone App
uv run start
The launcher reads .env, resolves both the Reflex frontend port (PRS_UI_PORT, default 3000) and backend port (PRS_UI_BACKEND_PORT, default 8000), and passes the resolved pair explicitly to Reflex so another running Reflex app cannot shift only one side. Runtime uploads go under PRS_UI_DATA_DIR/input/ (default: ./data/input/ from the directory where the launcher was invoked), which keeps uvx runs from writing into the installed package.
Quick Start
import polars as pl
import reflex as rx
from reflex_mui_datagrid import LazyFrameGridMixin
from prs_ui import PRSComputeStateMixin, prs_section
class MyAppState(rx.State):
genome_build: str = "GRCh38"
cache_dir: str = ""
status_message: str = ""
class PRSState(PRSComputeStateMixin, LazyFrameGridMixin, MyAppState):
def load_genotypes(self, parquet_path: str) -> None:
lf = pl.scan_parquet(parquet_path)
self.set_prs_genotypes_lf(lf) # preferred: provide a LazyFrame
self.prs_genotypes_path = parquet_path
def prs_page() -> rx.Component:
return prs_section(PRSState)
Components
| Component | Description |
|---|---|
prs_workbench(source_section, prs_state, trait_state, mode_state, trait_selector, ...) |
Unified single-tab layout: one shared genotype source + Select by PRS / Select by Trait sub-tabs, per-mode controls, compute button, and per-mode results |
vcf_source_section(source_state) |
Reference detachable genotype source: compact VCF upload + build detection + collapsed normalized preview. Swap it for your own source in a host app |
prs_shared_build_bar(source_state) |
Single genome-build selector that fans the build out to all consumer states |
prs_section(state) |
Older single-state section: build selector + score grid + compute button + progress + results |
prs_build_selector(state) |
Genome build dropdown (GRCh37/GRCh38) |
prs_scores_selector(state) |
MUI DataGrid for score selection. Selection (checkboxes + Select/Clear) is read-only and dimmed until genotypes are loaded, with an "upload a VCF" callout |
prs_compute_button(state) |
Compute button with disclaimer callout |
prs_progress_section(state) |
Progress bar and status text during computation |
prs_results_table(state) |
Results table with quality badges, interpretation cards, and CSV download |
The genotype source is loosely coupled to the PRS logic: a source pushes a normalized
genotypes parquet into each consumer via the additive load_genotypes(path) hook, or
several at once via load_samples([{"label", "path"}, ...]) for CLI-style multi-sample
comparison (per-sample colors, medians, and bell-curve markers). Each uploaded sample
gets its genetic ancestry autodetected (1000 Genomes reference panel): the sample row
shows the population with the classifier's confidence plus the closest 1000G cohort as a
clickable IGSR link with its own confidence — a reference point, not a nationality — and
the majority detected population becomes the percentile reference (shown on each sample
row; override via the trait dashboard Population dropdown). After
computing, the chart panel renders automatically for the first (or currently open)
result/trait — no row click needed. Sources may also pass optional per-sample
ancestry / ancestry_confidence / fine_population / fine_confidence keys, and optionally
set_genome_build(build), so a host app can replace vcf_source_section /
GenomicGridState with its own source (public genome, consumer-array file, pre-normalized
parquet) without touching PRSComputeStateMixin. VCF normalization (not upload) is the
slow step; it is content-aware cached (a fresh normalized parquet is reused) and shown via an
indeterminate progress bar.
State Mixin
PRSComputeStateMixin provides all PRS computation logic as a Reflex state mixin. Mix it into your concrete state class alongside LazyFrameGridMixin to get the full PRS workflow.
The preferred input method is a polars LazyFrame via set_prs_genotypes_lf() -- memory-efficient and avoids re-reading VCF files on each computation. A parquet path (prs_genotypes_path) is supported as a fallback.
Documentation
See the just-prs documentation for the full Python API, CLI reference, and integration guide.
Release files for prs-ui 0.3.16
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| prs_ui-0.3.16.tar.gz | 166.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| prs_ui-0.3.16-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 268.8 kB
Release files / prs_ui-0.3.16.tar.gz
| Download URL | prs_ui-0.3.16.tar.gz |
|---|---|
| Size | 166.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
00c52f5ffbaff104f6449b1ce8e54c2116997412daafa3fa70aa35b9813a21b8
|
|
BLAKE2b-256 checksum How to use checksums |
fda447a8484288b94c9fd902ca22f29bdf1be56d1bf3f3a489bb043e5c059061
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / prs_ui-0.3.16-py3-none-any.whl
| Download URL | prs_ui-0.3.16-py3-none-any.whl |
|---|---|
| Size | 102.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4190c1466ddb0ba70351ac457043dd54e547dc759cec46bd6ff2381f2d45d229
|
|
BLAKE2b-256 checksum How to use checksums |
5d82768e297e45b7979857600c292065235f21f6ae4adec4789f2a584241ba9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|