Skip to main content

prs-ui

PyPI version

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.

Metadata

Release files for prs-ui 0.3.18

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for prs-ui 0.3.18
File Size Uploaded
prs_ui-0.3.18.tar.gz 167.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for prs-ui 0.3.18
File Interpreter ABI Platform
prs_ui-0.3.18-py3-none-any.whl Python 3 none any Details

Total release size: 271.2 kB

Release files / prs_ui-0.3.18.tar.gz

Download URL prs_ui-0.3.18.tar.gz
Size 167.2 kB
Tags Source
SHA-256 checksum
How to use checksums
c3cca36a7f06179b864ec21f27b20d163383531f3e94d12eacf5260f6bb95083
BLAKE2b-256 checksum
How to use checksums
c31c203513c5f12f2aea6a7857291858af5b41f6ae5a95f67c29802ed2bdb7af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","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.18-py3-none-any.whl

Download URL prs_ui-0.3.18-py3-none-any.whl
Size 104.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
69c147aeb3ada6255c43825d131f89417181a70b3d23cc34ac8502f7a5c9f2d4
BLAKE2b-256 checksum
How to use checksums
54a035d2cfe3014b5bd4eb8ab59e1519571cfb803ad539b3d4b32200a6ee5c9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.3.18 This release

2 release files

0.3.15

2 release files

0.3.14

2 release files

0.3.13

2 release files

0.3.12

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page