Skip to main content

Interactive visualization components for mass spectrometry data in Streamlit

Project description

OpenMS-Insight

PyPI version Python 3.9+

Interactive visualization components for mass spectrometry data in Streamlit, backed by Vue.js.

Features

  • Cross-component selection linking via shared identifiers
  • Polars LazyFrame support for efficient data handling
  • Automatic disk caching with config-based invalidation
  • Table component (Tabulator.js) with filtering, sorting, go-to, pagination
  • Line plot component (Plotly.js) with highlighting, annotations, zoom
  • Heatmap component (Plotly scattergl) with multi-resolution downsampling
  • Sequence view component for peptide/protein visualization

Installation

pip install openms-insight

Quick Start

import streamlit as st
import polars as pl
from openms_insight import Table, LinePlot, StateManager

# Create state manager for cross-component linking
state_manager = StateManager()

# Create a table - clicking a row sets the 'item' selection
table = Table(
    cache_id="items_table",
    data=pl.scan_parquet("items.parquet"),
    interactivity={'item': 'item_id'},
    column_definitions=[
        {'field': 'item_id', 'title': 'ID', 'sorter': 'number'},
        {'field': 'name', 'title': 'Name'},
    ],
)
table(state_manager=state_manager)

# Create a linked plot - filters by the selected 'item'
plot = LinePlot(
    cache_id="values_plot",
    data=pl.scan_parquet("values.parquet"),
    filters={'item': 'item_id'},
    x_column='x',
    y_column='y',
)
plot(state_manager=state_manager)

Cross-Component Linking

Components communicate through identifiers using two mechanisms:

  • filters: INPUT - filter this component's data by the selection
  • interactivity: OUTPUT - set a selection when user clicks
# Master table: no filters, sets 'spectrum' on click
master = Table(
    cache_id="spectra",
    data=spectra_data,
    interactivity={'spectrum': 'scan_id'},  # Click -> sets spectrum=scan_id
)

# Detail table: filters by 'spectrum', sets 'peak' on click
detail = Table(
    cache_id="peaks",
    data=peaks_data,
    filters={'spectrum': 'scan_id'},        # Filters where scan_id = selected spectrum
    interactivity={'peak': 'peak_id'},      # Click -> sets peak=peak_id
)

# Plot: filters by 'spectrum', highlights selected 'peak'
plot = LinePlot(
    cache_id="plot",
    data=peaks_data,
    filters={'spectrum': 'scan_id'},
    interactivity={'peak': 'peak_id'},
    x_column='mass',
    y_column='intensity',
)

Components

Table

Interactive table using Tabulator.js with filtering dialogs, sorting, pagination, and CSV export.

Table(
    cache_id="spectra_table",
    data=pl.scan_parquet("spectra.parquet"),
    interactivity={'spectrum': 'scan_id'},
    column_definitions=[
        {'field': 'scan_id', 'title': 'Scan', 'sorter': 'number'},
        {'field': 'rt', 'title': 'RT (min)', 'sorter': 'number', 'hozAlign': 'right'},
        {'field': 'precursor_mz', 'title': 'm/z', 'sorter': 'number'},
    ],
    index_field='scan_id',
    go_to_fields=['scan_id'],
    default_row=0,
    pagination=True,
    page_size=50,
)

LinePlot

Stick-style line plot using Plotly.js for mass spectra visualization.

LinePlot(
    cache_id="spectrum_plot",
    data=pl.scan_parquet("peaks.parquet"),
    filters={'spectrum': 'scan_id'},
    interactivity={'peak': 'peak_id'},
    x_column='mass',
    y_column='intensity',
    highlight_column='is_annotated',
    annotation_column='ion_label',
    title="MS/MS Spectrum",
    x_label="m/z",
    y_label="Intensity",
)

Heatmap

2D scatter heatmap using Plotly scattergl with multi-resolution downsampling for large datasets (millions of points).

Heatmap(
    cache_id="peaks_heatmap",
    data=pl.scan_parquet("all_peaks.parquet"),
    x_column='retention_time',
    y_column='mass',
    intensity_column='intensity',
    interactivity={'spectrum': 'scan_id', 'peak': 'peak_id'},
    min_points=30000,
    title="Peak Map",
    x_label="Retention Time (min)",
    y_label="m/z",
)

SequenceView

Peptide/protein sequence visualization with fragment ion matching.

SequenceView(
    cache_id="peptide_view",
    sequence="PEPTIDEK",
    observed_masses=[147.1, 244.2, 359.3, 456.4],
    peak_ids=[0, 1, 2, 3],
    precursor_mass=944.5,
    interactivity={'peak': 'peak_id'},
    title="Fragment Coverage",
)

Shared Component Arguments

All components accept these common arguments:

Argument Type Default Description
cache_id str Required Unique identifier for disk cache
data pl.LazyFrame None Polars LazyFrame with source data
filters Dict[str, str] None Map identifier -> column for filtering
interactivity Dict[str, str] None Map identifier -> column for click actions
cache_path str "." Base directory for cache storage

Rendering

All components are callable. Pass a StateManager to enable cross-component linking:

from openms_insight import StateManager

state_manager = StateManager()

table(state_manager=state_manager, height=300)
plot(state_manager=state_manager, height=400)

Development

Building the Vue Component

cd js-component
npm install
npm run build

Development Mode

cd js-component
npm run dev

# In another terminal:
export SVC_DEV_MODE=true
export SVC_DEV_URL=http://localhost:5173
streamlit run app.py

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

openms_insight-0.1.0.tar.gz (4.1 MB view details)

Uploaded Source

Built Distribution

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

openms_insight-0.1.0-py3-none-any.whl (4.1 MB view details)

Uploaded Python 3

File details

Details for the file openms_insight-0.1.0.tar.gz.

File metadata

  • Download URL: openms_insight-0.1.0.tar.gz
  • Upload date:
  • Size: 4.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for openms_insight-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3c6fc384ba38476e5f5f671aa70d0f5bd5b6210a20cbde16ae958eea517b2abd
MD5 db93f74c7386d77bbf523bf75c545610
BLAKE2b-256 1d5ce4731c092d49a9302d841aa263bf8329b1390901992f623d8498a1733b07

See more details on using hashes here.

Provenance

The following attestation bundles were made for openms_insight-0.1.0.tar.gz:

Publisher: publish.yml on t0mdavid-m/OpenMS-Insight

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

File details

Details for the file openms_insight-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: openms_insight-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for openms_insight-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5081664782974565f060616402e37d7366821a4038a067b6b613e6e09c106ba2
MD5 df781e369956ad60a15df3653ec65480
BLAKE2b-256 7400556b3830837bb07c3529fe745f33fff461e24bfa2842eac2b4338d08f385

See more details on using hashes here.

Provenance

The following attestation bundles were made for openms_insight-0.1.0-py3-none-any.whl:

Publisher: publish.yml on t0mdavid-m/OpenMS-Insight

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