Materialize the Diffractometer Assembly at Bernina + Cristallina (SwissFEL fixtures)#543
Merged
Merged
Conversation
…o Fixtures) The Diffractometer blueprint was earned across 4-ID + 8-ID and graduated to the catalog, but only 8-ID materialized it. Prove it composes at a non-APS facility from the assets Bernina's descriptor actually carries: its GPS and XRD platforms bind ONE Assembly into TWO Fixtures, exercising the ZeroOrMore detector_arm slot at count 0 (GPS, no modelled arm) and count 1 (XRD delta), which is the reusability the blueprint exists to express. Co-Authored-By: Claude <noreply@anthropic.com>
…cility) Third independent binding of the catalog Diffractometer blueprint (after 8-ID and Bernina), from Cristallina's descriptor. DM1 binds all three slots (goniometer + detector arm + reciprocal space). DM2 is deliberately not materialized: the descriptor carries only its goniometer, its PVs are disabled (DISABLED-1), and it has no reciprocal-space Asset for the Exactly1 slot, so binding it would mean inventing hardware the source does not carry. Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Materializes the catalog
DiffractometerAssembly at two SwissFEL beamlines, taking it from one materialization (8-ID) to three independent facility bindings past the rule-of-three that graduated the blueprint. Both scenarios bind the real slot-tagged devices from each beamline's descriptor (DIFF-1); nothing fabricated.test_bernina_diffractometer_setup.py): two platforms, so ONE Assembly materializes into TWO Fixtures. GPS binds goniometer + reciprocal-space with no detector arm (ZeroOrMoredetector_armat count 0); XRD binds goniometer + detector-arm RotaryStage + reciprocal-space (count 1). The "two fixtures differing only in whether a detector arm is mounted" shape is the reusability the blueprint exists to express.test_cristallina_diffractometer_setup.py): DM1 binds all three slots (full three-slot Fixture). DM2 is deliberately NOT materialized: the descriptor carries only its goniometer, its PVs are disabled (DISABLED-1), and it has no reciprocal-space Asset for theExactly1slot, so binding it would mean inventing hardware the source does not carry. Disciplined partial materialization.Why
The blueprint was earned across 4-ID + 8-ID and graduated to the catalog, but only 8-ID had materialized it. These are the two SwissFEL beamlines whose descriptors carry every mandatory slot's Asset, so they can be materialized faithfully to source. Deferred descriptor items (hexapods, robots/ROBOT-1, lasers/LASER-1, DIFF-2 solver partition, magnet/MAG-1, MX stage/SAMPLE-1) are left out of scope and noted in each docstring.
Test plan
ruff check+ruff format --checkclean; pre-commit pyright passes🤖 Generated with Claude Code