Skip to content

Implement the agreed serialized-magnet accessor convention - #474

Merged
gupichon-soleil merged 1 commit into
461-serializedmagnetsfrom
473-serialized-accessors
Oct 15, 2026
Merged

gupichon-soleil merged 1 commit into
461-serializedmagnetsfrom
473-serialized-accessors

Conversation

@GamelinAl

Copy link
Copy Markdown
Member

A serialized family (N magnets on one power supply) has a single degree of freedom, the PS current I. The accessors now follow that in design and live:

  • family.hardware returns I (was N x I) and sets I.
  • family.strength returns the average strength sum(f_i(I))/N and sets the I that gives it (exact inverse of the piecewise-linear curves).
  • magnet[i].strength sets I = f_i^-1(x) with the magnet's own submodel; the other magnets follow. Design no longer splits the value by length.
  • Array writes give the PS the mean of the currents asked by the series members present in the array, not by all N, so writing one member no longer moves the PS by 1/N. Inconsistent requests log a warning. Design arrays (no aggregator) apply the same rule as live.

Combined-function magnets keep their current behaviour: the strength aggregator now calls MagnetModel.compute_hardware_values_partial(), whose default is the previous logic; LinearSerializedMagnetModel overrides it.

Also:

  • Build the serialized submodels once, at configuration. Attaching a family used to rebuild them, so the per-magnet accessors kept stale submodels that never received the magnetic rigidity.
  • SerializedMagnetsArray.unit() no longer splits unit strings into characters.
  • Remove ReadWriteSerializedStrengths.elements / get_elements(); use SerializedMagnets.get_magnets().

Tests: new design/live tests for idempotence, family values, per-magnet writes, design/live parity and array writes; tests that relied on the sum and length-sharing convention are updated.

Refs #461
Closes #473

@GamelinAl GamelinAl changed the title Implement the agreed serialized-magnet accessor convention (#473) Implement the agreed serialized-magnet accessor convention Oct 13, 2026
A serialized family (N magnets on one power supply) has a single degree
of freedom, the PS current I. The accessors now follow that in design
and live:

- family.hardware returns I (was N x I) and sets I.
- family.strength returns the average strength sum(f_i(I))/N and sets
  the I that gives it (exact inverse of the piecewise-linear curves).
- magnet[i].strength sets I = f_i^-1(x) with the magnet's own submodel;
  the other magnets follow. Design no longer splits the value by length.
- Array writes give the PS the mean of the currents asked by the series
  members present in the array, not by all N, so writing one member no
  longer moves the PS by 1/N. Inconsistent requests log a warning.
  Design arrays (no aggregator) apply the same rule as live.

Combined-function magnets keep their current behaviour: the strength
aggregator now calls MagnetModel.compute_hardware_values_partial(),
whose default is the previous logic; LinearSerializedMagnetModel
overrides it.

Also:
- Build the serialized submodels once, at configuration. Attaching a
  family used to rebuild them, so the per-magnet accessors kept stale
  submodels that never received the magnetic rigidity.
- SerializedMagnetsArray.unit() no longer splits unit strings into
  characters.
- Remove ReadWriteSerializedStrengths.elements / get_elements(); use
  SerializedMagnets.get_magnets().

Tests: new design/live tests for idempotence, family values, per-magnet
writes, design/live parity and array writes; tests that relied on the
sum and length-sharing convention are updated.

Refs #461

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gupichon-soleil
gupichon-soleil merged commit 4eea3f3 into 461-serializedmagnets Oct 15, 2026
3 checks passed
@gubaidulinvadim gubaidulinvadim added this to the ESRF Workshop milestone Oct 15, 2026
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.

3 participants