Skip to content

Viewer on the template's standard Viewer page - #294

Open
t0mdavid-m wants to merge 38 commits into
developfrom
claude/project-thread-f170bl
Open

t0mdavid-m wants to merge 38 commits into
developfrom
claude/project-thread-f170bl

Conversation

@t0mdavid-m

@t0mdavid-m t0mdavid-m commented Nov 13, 2026 •

Copy link
Copy Markdown
Member

What it does

The Explore results page no longer wires the experiment selector, view bars and experiments by hand. It describes its data in a ViewerSpec, and the template's show_viewer draws the page.

The spec has two kinds of dataset:

  • Runs: the top-down catalog, the Deconvolution, Native and Lysate views, the run's own default view, and render_grid. Each experiment keeps its own StateManager, so 📌 and ↺ still work.
  • Comparisons: the comparison catalog, the Quantification, Identification and QC views of its kind, and the comparison grid.

The following works as before:

  • Edit comparison, History, Add analysis and Export sit beside the selector.
  • Views a run was not processed for are marked with a +.
  • The page opens on a comparison just added, and on the newest run after a run finishes.

Single run | Comparison

A comparison is listed once. The Single run | Comparison switch beside the selector shows either the comparison as a whole or one of its runs, picked in a run selector, with the run views (Deconvolution, Native, Lysate). This is the template's switch, so OpenDDA and the template example behave the same.

Edit comparison as a dialog

Edit comparison opens the template's dialog, with one tab per step: Runs and conditions (which runs are compared, their condition and replicate, and the level: features, proteoforms or proteins), Filter, Missing values, Normalize and Test. Start over with the recommended settings resets them; Done computes the comparison again.

Label-free example

The label-free example (spike-in 1x vs 0.1x) now ships all four of its runs, so each one can be opened with Single run. To keep the example data small, every run is cut to the 45 s in which the proteoforms that differ most elute. The four label-free runs take 98 MB, compared with 73 MB for the one run shipped before. The comparison keeps five changed proteoforms, four higher and one lower in spike-in 1x.

The picked proteoform in every plot

  • Volcano. It opens on a symmetric fold-change range, so the volcano is visible at first glance. A single picked proteoform, and the one picked by default, is ringed like a lasso selection. The selection buttons are in the plot toolbar, which also has lasso, measure, box zoom and home.
  • Abundance per run draws every proteoform picked in the volcano (lasso, box or "All changed"), one line each, and names the proteoform (protein and range) or the feature (its mass) under its title.
  • Feature intensity, CV and the other box plots mark the picked feature or proteoform on its box, and the axis range keeps the mark in view.
  • PrSMs. Picking a PrSM in "PrSMs of the selected identification" updates the sequence view and spectrum; when the PrSM's run has no spectrum in the workspace, a line says so and names the PrSM shown instead.

Lysate view

The tables of the Lysate view are two to a row and taller, so their columns are readable.

Plots from the template's visualization library

The plots OpenDDA draws the same way now come from the template's src/viz/, fed from FLASHApp's comparison results and kept in FLASHApp's per-dataset cache:

  • GO enrichment (go_panel.py): category selectors, the number of selected proteins on a line of its own with Selection | All proteins, and paginated Insight tables.
  • Comparison steps (comparison_steps.py): where values are missing, the values imputation fills in, the boxes per sample before and after normalization, and the p-value histogram. src/render/postprocessing_plots.py is gone; src/render/series.py only adds FLASHApp's cache folder and info texts to the library's show_series.
  • Volcano, PCA and clustered heatmap take their settings from volcano_settings, pca_settings / most_variable and clustered_settings.
  • Group colours come from the library (group_colors), so a condition has the same colour in every panel here and in OpenDDA.

The abundance profile and the comparison table stay in FLASHApp, which draws them its own way.

Cleaner viewer

  • Info icons. Every component has an ⓘ in its top left corner, with what it shows and how to use it. The texts are in src/render/teaching.py. They replace the grey captions under the plots, the default-layout caption, the "Comparing … of …" line and the GO info box.
  • Tables show their title and buttons on one line.
  • Bar charts have no zoom or drag, and their title sits close to the bars.
  • Selection tools only where they select. Plots that send no multi-selection hide box and lasso.
  • Aligned rows. The volcano plot ends level with "Abundance per run".

Depends on

Screenshots (example workspace)

Lysate view Volcano and abundance per run, named proteoform
Label-free comparison Edit comparison
Single run of the comparison Picked feature on the box plots (QC: label-free)
Abundance per run of all changed proteoforms PrSM picked, sequence view and spectrum follow

Screenshots of the library's group colours (PCA, clustered heatmap) are still to come.

Tests

  • pytest tests/ passes: 1479 passed.
  • pylint (errors only) is clean on the changed files.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN

…ary, template, app

Adds a 'Four layers' section to the agent rules in CLAUDE.md (what each
layer holds and never holds, a test for each, and the two rules that keep
them apart), glossary entries for the visualization library and panel
sources, and pointers in the upstream-to-template, build-insight-dashboard
and add-visualization skills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
show_viewer(ViewerSpec) lists the datasets, applies a pending pick,
draws the first experiment's selector with its buttons, the view bar of
its kind of dataset and every experiment with its own state. Kinds of
dataset (a run, a comparison, a file) carry their catalog, presets,
renderers and buttons; an experiment made of several runs is shown as
Files of or as Single run | Comparison. View MS data uses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
components, presets and default_layout of a DatasetKind may be functions
of the first experiment's context, for kinds whose ready-made views depend
on what a dataset holds (a comparison shows the QC of its own kind).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Later experiments show datasets of the first one's kind, so they get no
switch; the locked whole is offered only to an experiment without one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…ewer page

The Viewer page is drawn by the template's show_viewer: runs and comparisons
are two kinds of dataset, Single run | Comparison is the member switch, and the
buttons, views, missing-analysis dialogs and picks work as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
@coderabbitai

coderabbitai Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ee476562-f9e0-4b4a-b182-371d29cec7af
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Copy link
Copy Markdown
Member Author

The Linux desktop e2e failure (ValueError: mode must be 'lines', 'markers' or 'lines+markers', got 'bars') comes from develop, not from this PR's change.

The installed app fails as soon as the comparison GO view is drawn, so this check will stay red on develop too until openms-insight releases the bars mode and requirements.txt pins that release. This PR does not touch either file.


Generated by Claude Code

openms-insight main (0.7.6.dev0, with SeriesPlot bars and the latest
Table and sequence view fixes) as a wheel in dev-wheels/, so the
desktop installers can be tested. Revert to a PyPI pin before release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
With an openms-insight that can compare proteoforms, the page read the
precursor mass of stored masses before any were entered and failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…moved

The 🎓 button beside the experiment selector shows what each component
shows and how to use it, as a tooltip beside its title. The captions
under the plots and the GO info box are gone; a picked PrSM whose run
is not in the workspace falls back to the first one that is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Built with the OpenMS FDmerge tools of the desktop build. The lysate
example's most frequent mass shift is now an acetylation, so its test no
longer pins the name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…ialog

member_switch() draws the switch outside the standard Viewer, and
whole_kind/shown_whole tell the whole of an experiment from its first run
when both have one id (run folders). edit_comparison() is a dialog with one
tab per comparison step, Start over and Done. The example Results page
offers both for an experiment of several runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…into claude/project-thread-f170bl

# Conflicts:
#	src/Workflow.py
The conditions, filter, missing values, normalization and test are tabs of the
template's Edit comparison dialog (edit_comparison), with Start over and Done,
as in OpenDDA. quant_cells.comparison_steps(session) returns the steps, what
Done saves and what Start over resets; settings_form stays as a wrapper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
The comparison's three further runs are kept as examples of their own so
the Viewer can show each run of the comparison; the retention-time window
is narrowed to 45 s around the proteoforms that differ most, which keeps
the example data at about the size it had.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…picks

- Abundance per run draws every proteoform picked in the volcano.
- Feature intensity, CV and the other box plots mark the picked point.
- The PrSM sequence view says when the picked PrSM has no spectrum in
  the workspace and which one it shows instead.
- openms-insight development build 0.7.6.dev4 (highlighted points,
  volcano toolbar).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…ight dev5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN

Copy link
Copy Markdown
Member Author

The test-nginx (full, amd64) failure is not caused by this PR. The kind cluster could not pull redis:7.4.12-alpine because Docker Hub answered 429 Too Many Requests, so the redis pod never became ready. I'll rerun the failed job once the rest of the run has finished.


Generated by Claude Code

- Template Viewer collects Insight reruns into one.
- Quantity per run drawn as points, not connected lines.
- openms-insight dev build 0.7.6.dev6 (help icon in the toolbar row,
  wrapped plot titles).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
…red (template)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
The comparison steps (missing values, imputed values, normalization,
p-values), the volcano, PCA and clustered heatmap now take their settings
from src/viz, the panels the template shares between apps. Groups get the
library's colours, the same in every panel and app. The profile and the
comparison table stay here: FLASHApp draws them its own way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkEGen2HSCa8BFE1JW4jxN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants