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
  • Memory-efficient preprocessing via subprocess isolation
  • 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
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_path="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_path="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_path="spectra.parquet",
    interactivity={'spectrum': 'scan_id'},  # Click -> sets spectrum=scan_id
)

# Detail table: filters by 'spectrum', sets 'peak' on click
detail = Table(
    cache_id="peaks",
    data_path="peaks.parquet",
    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_path="peaks.parquet",
    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_path="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_path="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_path="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_path str None Path to parquet file (preferred - uses subprocess for memory efficiency)
data pl.LazyFrame None Polars LazyFrame (alternative to data_path, in-process preprocessing)
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.2.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.2-py3-none-any.whl (4.1 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: openms_insight-0.1.2.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.2.tar.gz
Algorithm Hash digest
SHA256 547df812ab0e67e25c3da839ec577965c12da05bacc806e1477e9ce8ebfdfbdb
MD5 75aa986653e65c3190b89e448ef11e20
BLAKE2b-256 a1f564d8d28c820ce448694118d49b4f1e827d7ce3f0db8b676f67fbb7415cdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for openms_insight-0.1.2.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.2-py3-none-any.whl.

File metadata

  • Download URL: openms_insight-0.1.2-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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f86744303313697d3b5977598e54afccb410169eaa0cb5639507f62462ce19cf
MD5 2024b014eb1c98289bf55217f9436b25
BLAKE2b-256 a88ea8f20fbccbc861bfd23ec33086fd394d90ad2d6a111fc8ead5b7a55086c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for openms_insight-0.1.2-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