Skip to content

feat(tomowise): reconcile with the TDR; share the Mask Family; compose the Microscope assembly#301

Merged
xmap merged 5 commits into
mainfrom
worktree-tomowise-tdr-reconcile
Jun 22, 2026
Merged

feat(tomowise): reconcile with the TDR; share the Mask Family; compose the Microscope assembly#301
xmap merged 5 commits into
mainfrom
worktree-tomowise-tdr-reconcile

Conversation

@xmap

@xmap xmap commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Reconciles the design-phase TomoWISE (MAX IV) scaffold against the authoritative TomoWISE TDR, and reuses 2-BM catalog structure where it genuinely fits. All facts were verified directly against the TDR text, not an extraction summary.

TDR reconciliation

  • Nano stage: the TDR fully specifies the six-axis sample manipulator (Table 9.5); it is NOT deferred. Remodelled as a real stack (granite + tilt + coarse X/Y/Z + continuous rotary + fine Xs/Zs) reusing the micro-endstation Families; NANO-1 reframed to model-procurement.
  • Drift fixes: table surface 390 mm below the beam (p54); the 60 urad belongs to the beam-defining mask, not the white-beam slit (p38); MLM coating candidates are W/SiC or W/B4C, Table 8.3 lists W/Si; two heat absorbers (FE + SU); MF at the start of the experiment hutch (p374).

Catalog sharing

  • Mask promoted to a shared catalog Family (2-BM M3-24 + TomoWISE FM1/FM2/MSM; naming-r3 PASS).
  • Microscope/Optics assemblies generalized: camera and propagation_distance slots -> ZeroOrOne (no enum change) so a camera-agnostic microscope sharing a detector pool can compose. 2-BM still binds both (scenario re-validated).
  • MicLFOV/MicHR composed as the cross-facility Microscope Assembly (Housing-anchored: turret + objectives + selector over a scintillator), removing the loose Microscope family/assembly name collision. The Optique Peter model optique_peter_micrx080 is bound on both Housings (the 2-BM candidate, pending DET-2).

Known follow-up (not in this PR)

The affordance-superset check that should guarantee a Detector-presenting Microscope is imageable is documented as deferred to register_fixture (equipment/aggregates/assembly/state.py) but is implemented nowhere, and catalog Families carry no affordances yet. Relaxing the camera floor surfaces this pre-existing gap; tracked for a later slice.

Verification

Deployment + register_fixture unit tests, the 2-BM microscope integration scenario, and mkdocs --strict all pass. Gate-reviewed (17-agent workflow); 5 findings fixed pre-merge.

🤖 Generated with Claude Code

xmap and others added 5 commits June 22, 2026 07:41
The design-phase TomoWISE scaffold (#287) carried values that drift from
the TomoWISE TDR (the authoritative source). Each correction below was
verified directly against the TDR text, not the extraction summary.

- nano stage: the TDR specifies the six-axis sample manipulator in full
  (Table 9.5); it is NOT deferred to procurement. Replace the single
  NanoSampleStage/NanoPositioner with the real stack (granite, tilt,
  coarse X/Y/Z, continuous rotary, fine Xs/Zs), reusing the micro
  endstation Families (Table/TiltStage/LinearStage/RotaryStage) so no
  nano-specific Family is needed. NANO-1 reframed to model-binding
  procurement and kept live for the open-questions alignment guard.
- drop the fabricated microscope model MICRX080 (absent from the TDR);
  keep the named vendor Optique Peter. Narrow DET-2 to model-only.
- sample table surface is 390 mm BELOW the beam, not above (p54).
- 60 urad is the beam-defining mask aperture, not the white-beam slit (p38).
- MLM coating candidates are W/SiC or W/B4C per the text; Table 8.3 lists W/Si.
- heat absorber: drop the uncorroborated MM1/MM2; note the second SU heat
  absorber. Metal filter sits at the start of the experiment hutch (p374).

Deployment unit tests (62) and mkdocs --strict pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ssembly reuse

Mask was already used as a loose (plain-text) family by both 2-BM (the
M3-24 front-end exit mask) and TomoWISE (FM1/FM2 plus the MSM safety
mask), so it is earned into the catalog as a shared Family. naming-r3
clean: a bare role-noun, sibling of Slit/Aperture/Mirror, with the
movable-vs-fixed distinction kept as a per-Asset setting (no
FixedMask/MovableMask split). Beam-effect modelling stays deferred to
the passive beam-path tier.

The 2-BM descriptor test used Mask as its "uncatalogued family renders
plain" example; swap it to Beam, the loose bending-magnet source
representation that is intentionally never a catalog Family.

Also record, on the TomoWISE model page, that the two microscopes bind a
loose Microscope family instead of composing the catalog Microscope /
Optics Assemblies that 2-BM already uses. Composing them is the clearest
catalog-reuse opportunity and would remove the Microscope family/assembly
name collision; deferred until the detector optics and camera models firm.

Deployment unit tests (62) and mkdocs --strict pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The catalog already carries optique_peter_micrx080 (an Optique Peter
model, bound by 2-BM). The TomoWISE TDR names only the vendor "Optique
Peter", not a model, so the model stays unbound, but the existing catalog
model is the natural first candidate when DET-2 is decided. Note it in the
detector page and the DET-2 question as a candidate, not a TDR fact or a
binding.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…omoWISE microscopes

Make the cross-facility Microscope.camera and Optics.propagation_distance slots
ZeroOrOne so a camera-agnostic microscope that shares a detector pool can compose
the assembly. TomoWISE's two microscopes share four interchangeable cameras and
one gantry propagation rail, so each leaves those slots empty; 2-BM still binds
its camera and propagation (re-validated by the microscope scenario). No code-enum
change: ZeroOrOne already exists.

Compose MicLFOV/MicHR as the cross-facility Microscope Assembly instead of a loose
Microscope family (removing the family/assembly name collision): Housing-anchored,
with a turret, the objectives, and an objective selector over a scintillator, and
the Optique Peter optics model optique_peter_micrx080 bound from the 2-BM catalog
candidate (pending confirmation, DET-2). The four cameras stay separate shared
Assets; the gantry provides the propagation distance.

Pin the new ZeroOrOne-left-unbound behavior with a register_fixture decider test.
Docs updated (detector, inventory, model, questions).

Known follow-up, not addressed here: the affordance-superset check that should
guarantee a Detector-presenting Microscope is imageable is documented as deferred
to register_fixture (equipment/aggregates/assembly/state.py) but is not implemented
there, and catalog Families carry no affordances yet. Relaxing the camera floor
surfaces that pre-existing gap; tracked for a later slice.

Deployment + register_fixture unit tests, the 2-BM microscope integration scenario,
and mkdocs --strict all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…onstituents

The constituents are children of the MicLFOV / MicHR Housing Assets, so the
parent already scopes them (parent_id); prefixing a child with its parent's
name was redundant. No global Asset-name uniqueness is enforced (identity is
the stream UUID; only an Asset's ports/owners are name-unique within it), and
the objectives are already unique by magnification. Plain names (Turret,
Objective_1x, ObjectiveSelector, Scintillator) match the 2-BM constituent
style; Turret/ObjectiveSelector/Scintillator repeat across the two microscopes,
scoped by their parent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@xmap xmap enabled auto-merge (squash) June 22, 2026 06:28
@github-actions

Copy link
Copy Markdown

Coverage report

Click to see where and how coverage changed

FileStatementsMissingCoverageCoverage
(new stmts)
Lines missing
  apps/api/src/cora/equipment/features/register_fixture
  decider.py
Project Total  

This report was generated by python-coverage-comment-action

@xmap xmap merged commit 35a3876 into main Jun 22, 2026
16 checks passed
@xmap xmap deleted the worktree-tomowise-tdr-reconcile branch June 22, 2026 06:37
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.

1 participant