Skip to content

feat: Beckman Vi-Cell BLU - support per-sample detail export - #1277

Open
nathan-stender wants to merge 1 commit into
mainfrom
vi-cell-blu-detail-export
Open

nathan-stender wants to merge 1 commit into
mainfrom
vi-cell-blu-detail-export

Conversation

@nathan-stender

Copy link
Copy Markdown
Collaborator

Summary

Vi-Cell BLU's per-sample detail export currently fails with Expected non-null value for Viability (%). The parser only handles the flat summary export (one row per sample), but the detail export has:

  1. A sample settings header and its values
  2. A reagent table (part number, lot number, expiration, ...)
  3. A table with one row per image, ending in a Total row that holds the sample-level results

pandas read every row against the settings header, so the results columns came out empty. Sniff also missed the file, because Viability (%) isn't on its first line.

Changes

  • Reader: detects the detail export (first cell is Sample ID and there is an Image# table) and turns each sample into one summary-style row: settings, then reagent info, then the Total row's results. Files with several samples are supported. Summary exports take the same path as before.
  • Sniff: looks for the results columns on the Image# line when it exists, and on the first line otherwise.
  • New fixture: Beckman_Vi-Cell-BLU_detail_export.csv, an anonymized customer file cut to 3 image rows.

Notes

  • Per-image rows are not included in the output, matching what the summary export gives you.
  • Reagent fields and ROW/COLUMN/Concentration Adjustment Factor (%) go into custom information. If a sample lists more than one reagent, the reagent info is left out.
  • The lot number is converted to a float by the shared custom-info coercion (SeriesData._get_custom_key). This is existing behavior across all parsers and is not changed here.

Testing

  • Existing expected JSON is unchanged.
  • The new fixture fails without the fix, for the original reason.
  • Beckman Vi-Cell BLU tests and tests/discover_vendor_test.py pass (342 tests), and lint passes.

🤖 Generated with Claude Code

The detail export has a sample settings section, a reagent table, and a
per-image results table ending in a "Total" row. Flatten each sample into
the summary-export row shape, and update sniff to find the results header
on the "Image#" line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nathan-stender
nathan-stender requested review from a team and slopez-b as code owners October 8, 2026 15:07
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