Skip to main content
EIS upload validation in the Python API, and faster pipeline detail page and ECM fits

EIS upload validation

cell_measurement.create(...) now accepts a data_type="eis" hint on the measurement dict. When set, validate_measurement_data runs a structural columns check (always on, requires Frequency [Hz], Z_Re [Ohm], Z_Im [Ohm]) plus two strict-only, individually-skippable heuristic checks. eis_zim_sign flags a spectrum whose capacitive band is predominantly positive — i.e. the raw Im(Z) sign is flipped, with the fix hint Z_Im = -Z_Im. eis_impedance_magnitude catches order-of-magnitude unit errors by comparing min(Z_Re) against a wide 100× band around a capacity- derived estimate — no data fetch, just a sanity check against the supplied rated_capacity. Both fire only on order-of-magnitude issues (a 1000× unit error, a fully flipped sign) so a plausible spectrum is never touched. The BioLogic reader now stores the raw imaginary part directly as Z_Im [Ohm] (negative across the capacitive arc), matching the validator’s convention.

Faster pipeline detail page and ECM fits

The pipeline detail page now loads noticeably faster: large per-element data is now loaded lazily on expand instead of upfront, and a slow client-side recalculation on every 5s poll tick has been optimized away. Separately, pipeline ECM fits got faster and more accurate through several internal fit-strategy improvements, with fit quality fully preserved.
Improvements
  • Protocol detail pages now show a Simulations section listing every simulation that uses the protocol, with the same bulk actions (add to study, rerun, delete) available on the parameterized-model simulation list.
  • Pipeline bulk cancel is now instant. The UI flips immediately with optimistic updates, and the slower job-termination work is offloaded to run in the background. A single bulk-cancel endpoint replaces the per-pipeline loop the frontend was previously doing.
  • The Cycle Filter now clamps First N, Last N, and Range values that exceed the number of available cycles: it returns all available cycles and shows Showing all N cycles in neutral text. Explicit single-cycle typos (e.g. 0,50,200 on a 100-cycle measurement) still error, with a short, actionable message instead of the previous thousands-of-numbers wall of text.
  • Compute hours are now a first-class usage dimension alongside simulation hours, driven by each org’s contract. The account drawer renders one meter per configured usage type, gated on a combined loading signal with placeholder cards sized to the last-known meter count, so the list no longer briefly collapses to zero at load.
Fixes
  • Deleting an organization as a regular Admin (non-super-admin) now returns a proper 403 Forbidden. Previously the delete was silently blocked but the endpoint returned 204, giving a false success while the org remained in the database.
  • Current sign-convention documentation corrected across backend field descriptions, the API discovery endpoint, and the data-upload docs: positive = discharge, negative = charge (matching the platform’s actual data and validators). Descriptions of external cycler conventions that legitimately differ (e.g. BioLogic / Arbin native positive = charge) are unchanged.
Improvements
  • Default population size for the DE and PSO optimizers is now capped at 40. Explicit population_size values still bypass the cap; only the auto-scaled default changed, and only above the cap.
Fixes
  • Local pipeline runs now match server behavior in three places where they had drifted. An OCP interpolant input with only a data key is no longer rejected as missing metadata. Schema-provided transforms (Log10, Log, Inverse, …) are no longer silently dropped. And the vacuous multistart guard (Multiple multistarts are being used, but all initial guesses are identical) that fired as a downstream symptom of those drops is gone as a consequence.
Improvements
  • GET /organizations/current/usage is now public and returns per- dimension usage (simulation, compute) with limits, so SDK clients can read their own quotas without an admin token.
Improvements
  • Neware BTSDA .xlsx files with no explicit sheets option now auto-select the record sheet — where the time series actually lives — instead of defaulting to the metadata-only first sheet and failing with a missing Timestamp error. The previous “you must pass sheets={type: 'name', value: 'record'}” gotcha is now automatic; files without a record sheet still fall back to the first-sheet default.
Fixes
  • The Maccor reader now maps Cycle C — the cumulative cycle counter, the true cycle number — to Cycle from cycler. Previously it mapped Cycle P, a program/loop counter that is often 0 and can reset within a procedure, so any file containing both columns reported meaningless zeros for the cycle number.
Fixes
  • Arbin schedules that reference a subschedule (SubSchedule step) no longer fail parsing with Duplicate step name found: 'End Test'. The reserved End Test terminal is exempted from the duplicate-name check — each subschedule keeps its own copy, so any goto: "End Test" from any scope still resolves at simulation time. Genuinely-named block collisions (e.g. a user Loop_X appearing in two scopes) still error as they should.