diff --git a/apps/api/tests/unit/deployments/test_beamline_descriptor.py b/apps/api/tests/unit/deployments/test_beamline_descriptor.py index 0eb9e9595e..396018e8a4 100644 --- a/apps/api/tests/unit/deployments/test_beamline_descriptor.py +++ b/apps/api/tests/unit/deployments/test_beamline_descriptor.py @@ -176,10 +176,12 @@ def test_renders_source_stage_walk_and_no_em_dash() -> None: assert "`new`" in markdown # the P6-50 nested constituents (a source-stage device) render as their own sub-table assert "**SafetyStack constituents**" in markdown - # a source family present in the Catalog links up; a pending one renders plain (no fake link) + # a source family present in the Catalog links up; a pending one renders plain (no fake link). + # Beam is the loose bending-magnet source representation, intentionally never a catalog Family + # (see the InsertionDevice family note), so it is a stable "renders plain" example. assert "](../../catalog/families.md)" in markdown - assert "`Mask`" in markdown - assert "[`Mask`](../../catalog/families.md)" not in markdown + assert "`Beam`" in markdown + assert "[`Beam`](../../catalog/families.md)" not in markdown # the folded source-area modelling note and the confirm marker render assert "no Conditioner Role" in markdown assert "`confirm`" in markdown diff --git a/apps/api/tests/unit/equipment/test_register_fixture_decider.py b/apps/api/tests/unit/equipment/test_register_fixture_decider.py index 752d2e28df..13c290356e 100644 --- a/apps/api/tests/unit/equipment/test_register_fixture_decider.py +++ b/apps/api/tests/unit/equipment/test_register_fixture_decider.py @@ -197,6 +197,26 @@ def test_decide_rejects_exactly_one_slot_with_zero_bindings() -> None: assert "Exactly1" in exc_info.value.reason +@pytest.mark.unit +def test_decide_allows_zero_or_one_slot_left_unbound() -> None: + assembly_id = uuid4() + slot = _slot("camera", cardinality=SlotCardinality.ZERO_OR_ONE) + context = RegisterFixtureContext( + assembly_state=_assembly(assembly_id, slots=frozenset({slot})), + ) + events = register_fixture.decide( + state=None, + command=RegisterFixture(assembly_id=assembly_id), + context=context, + now=_NOW, + new_id=uuid4(), + registered_by=_TEST_ACTOR_ID, + ) + assert len(events) == 1 + assert isinstance(events[0], FixtureRegistered) + assert events[0].slot_asset_bindings == frozenset() + + @pytest.mark.unit def test_decide_rejects_unknown_slot_in_bindings() -> None: assembly_id = uuid4() diff --git a/catalog/catalog.yaml b/catalog/catalog.yaml index 26cdcc6dbb..8c05b076b5 100644 --- a/catalog/catalog.yaml +++ b/catalog/catalog.yaml @@ -70,6 +70,8 @@ families: note: "Beam-defining four-blade slit Family (four independently-driven blades forming a variable horizontal/vertical opening). 2-BM: ConditioningSlit (A-station L3-20) and SampleSlit (B-station)." - name: Aperture note: "Patterned beam-shaping aperture Family: a fixed-pattern mask positioned in the beam as a unit. Distinct from Slit (a variable opening defined by four driven blades) and from a passive Mask (a fixed beam-defining opening that does not move); the discriminator is the element's nature (a fixed code pattern), not that it is driven. 2-BM: the coded aperture for compressive-sensing tomography, fine-positioned by ApertureFineDrive." + - name: Mask + note: "Passive beam-defining mask Family: a plain fixed-opening element that shapes or limits the beam, positioned as a unit. Distinct from Slit (a variable opening via four driven blades) and Aperture (a fixed code pattern); the discriminator is the element's nature (a plain fixed opening). One Family spans the permanently-fixed masks and the movable safety-mask variant (movability is a per-Asset setting, the Table / InsertionDevice precedent). 2-BM: the M3-24 front-end exit mask. TomoWISE: the FM1 / FM2 fixed masks and the MSM movable safety mask. Earned in once two deployments shared it; beam-effect modelling stays deferred (the passive beam-path tier)." - name: Mirror note: "Beam-steering grazing-incidence mirror optic Family. 2-BM: the Y3-30 mirror (distinct from its MirrorTable support, which is Family Table)." - name: Monochromator @@ -273,21 +275,28 @@ models: assemblies: - name: Optics note: >- - Reusable optics core: turret, objectives, virtual objective selector, and - propagation-distance stage. Presents nothing on its own; composed by detector Assemblies. + Reusable optics core: turret, objectives, virtual objective selector, and an + optional propagation-distance stage. Presents nothing on its own; composed by + detector Assemblies. propagation_distance is ZeroOrOne because some deployments + drive propagation with a shared facility stage rather than a per-Optics rail + (2-BM binds a per-microscope PropagationDistance; TomoWISE shares one detector + gantry rail across both microscopes, so its microscopes leave the slot empty). presents_as: [] required_slots: - { slot_name: turret, required_families: [LinearStage], cardinality: Exactly1 } - { slot_name: objectives, required_families: [Objective], cardinality: OneOrMore } - { slot_name: objective_selector, required_families: [PseudoAxis], cardinality: Exactly1 } - - { slot_name: propagation_distance, required_families: [LinearStage], cardinality: Exactly1 } + - { slot_name: propagation_distance, required_families: [LinearStage], cardinality: ZeroOrOne } - name: Microscope note: >- - Full scintillator-relay detector: the Optics sub-assembly plus camera and - scintillator leaf slots. Presents the Detector Role. Zero required_wires in v1. + Full scintillator-relay detector: the Optics sub-assembly plus an optional camera + and a scintillator leaf slot. Presents the Detector Role. Zero required_wires in v1. + camera is ZeroOrOne because a microscope can be camera-agnostic, drawing from a + shared camera pool (2-BM binds its camera per microscope; TomoWISE's two microscopes + share four interchangeable cameras on one gantry, so each leaves the slot empty). presents_as: [Detector] required_slots: - - { slot_name: camera, required_families: [Camera], cardinality: Exactly1 } + - { slot_name: camera, required_families: [Camera], cardinality: ZeroOrOne } - { slot_name: scintillator, required_families: [Scintillator], cardinality: Exactly1 } required_sub_assemblies: - { slot_name: optics, sub_assembly: Optics } diff --git a/deployments/tomowise/beamline.yaml b/deployments/tomowise/beamline.yaml index 16a6d860db..b3be49d11e 100644 --- a/deployments/tomowise/beamline.yaml +++ b/deployments/tomowise/beamline.yaml @@ -76,9 +76,9 @@ front-end: enclosure: TomoWISE-optics intro: "Fixed and movable masks plus the heat absorber that shape the beam and absorb power before the optics hutch." note: > - z from the CPMU14 source (TDR Table 7.1). Mask/heat-absorber Families are - not yet in the catalog (they render as plain text pending the passive - beam-path tier); bound loosely here by design intent. + z from the CPMU14 source (TDR Table 7.1). Mask is now a shared catalog + Family; the heat-absorber Family is not yet in the catalog (it renders as + plain text pending the passive beam-path tier), bound loosely by design intent. devices: - name: FM1 family: Mask @@ -109,7 +109,7 @@ front-end: new: true confirm: true power_budget: 4 kW - note: "heat absorber; movable masks MM1/MM2 alongside" + note: "front-end heat absorber protecting the safety shutter; a second, near-identical heat absorber sits in the optics-hutch safety unit (SU) with SS1/SS2 (TDR Table 8.1), not separately modelled here" optics-hutch: stage: source @@ -133,8 +133,7 @@ optics-hutch: z_mm: 24280 new: true confirm: true - opening: 60 urad - note: "white-beam slits (DM1)" + note: "water-cooled white-beam slits (WBS) in DM1; DM1 also carries a separate beam-defining mask (BM, water-cooled Cu, 60 urad opening matching the MLM acceptance) and a bremsstrahlung collimator, not separately modelled here" - name: PFU family: Filter z_mm: 25200 @@ -148,7 +147,7 @@ optics-hutch: z_mm: 25900 new: true confirm: true - coating: W/Si or W/B4C bilayers, d=2.5 nm, 140 bilayers (OPT-1) + coating: W/SiC or W/B4C bilayers (TDR text); Table 8.3 lists W/Si; d=2.5 nm, 140 bilayers (OPT-1) energy_range: 20 to 65 keV bandwidth: dE/E ~ 1.8% bragg_range: 3.84 to 12.6 mrad @@ -165,7 +164,7 @@ optics-hutch: new: true confirm: true transmission: 1e-4 to 1 - note: "metal filter unit (third filter stage); on the experiment-hutch end wall" + note: "metal filter unit (third filter stage, Fe/Cu carriages, NanoMAX design); at the beginning of the experiment hutch" safety-shutters: stage: source @@ -247,8 +246,15 @@ microtomography-endstation: nanotomography-endstation: stage: sample enclosure: TomoWISE-experiment - intro: "The nanotomography endstation, ~49-51 m from source: the KB mirror pair focuses the undulator beam for 200-nm-class cone-beam imaging. The sample stage is not yet specified." - note: "Mirror Family reused for the KB pair. The nano sample stage is deferred to procurement (NANO-1)." + intro: "The nanotomography endstation, ~49-51 m from source: the KB mirror pair focuses the undulator beam for 200-nm-class cone-beam imaging. The sample manipulator is a six-axis stack on a granite support, conceptually similar to the microtomography endstation but about a factor of ten more precise." + note: > + Mirror Family reused for the KB pair. The TDR specifies the sample + manipulator in Table 9.5 (it is NOT deferred to procurement): the stack + reuses the same Families as the microtomography endstation (Table, + TiltStage, LinearStage, RotaryStage), with a "(target)" model per axis + carried as model_target pending procurement (NANO-1). The most critical + axis is the rotary: Abbe error from wobble and eccentricity must not + exceed 100 nm at 100 mm sample height. devices: - name: KB family: Mirror @@ -258,11 +264,60 @@ nanotomography-endstation: type: fixed-curvature graded-multilayer KB pair focal_spot: 205 x 196 nm @ 30 keV; 196 x 80 nm @ 45 keV note: "Kirkpatrick-Baez focusing mirrors for nanotomography" - - name: NanoSampleStage - family: NanoPositioner + - name: NanoGranite + family: Table + z_mm: 49000 + new: true + confirm: true + note: "single granite support housing the KB optics, the sample manipulator, and the detector stage" + - name: NanoTilt + family: TiltStage + new: true + confirm: true + travel: 2 deg + resolution: 5 mdeg + model_target: Huber 5202.80 (NANO-1) + note: "Tilt X; aligns the rotation axis to the beam vertical angle" + - name: NanoCoarseX + family: LinearStage + new: true + confirm: true + travel: 50 mm + model_target: Huber 5101.20 (NANO-1) + note: "Xt; centre-of-rotation alignment and flat-field acquisition" + - name: NanoCoarseY + family: LinearStage + new: true + confirm: true + travel: 50 to 100 mm + model_target: Huber 5103.A20-90 (NANO-1) + note: "Yt; sample height adjustment" + - name: NanoCoarseZ + family: LinearStage new: true - confirm: "specification deferred to procurement (NANO-1); must meet Abbe error compatible with 200 nm resolution" - note: "nanotomography sample stage; not yet specified in the TDR" + confirm: true + travel: 250 to 300 mm + resolution: <0.5 um + model_target: Zaber X-LDQ-AE (NANO-1) + note: "Zt; brings the rotation axis into the KB focus, then translates toward the detector" + - name: NanoRotary + family: RotaryStage + new: true + confirm: true + max_speed: ">60 rpm" + resolution: 1 mdeg + eccentricity: <100 nm at sample height + encoder: TTL, 3600 pulses per rotation + model_target: Lab Motion Systems RT100AS (NANO-1) + note: "Rot y; continuous nanotomographic rotation, radial error <100 nm / axial error <50 nm" + - name: NanoSamplePositioning + family: LinearStage + new: true + confirm: true + travel: +/-6 mm (Xs, Zs) + resolution: 0.1 um + model_target: Lab Motion Systems XY150B-12 (NANO-1) + note: "Xs/Zs sample-to-CoR centring; same model as the micro endstation positioning" # --- DETECTION STAGE: the shared detector gantry --- @@ -270,7 +325,14 @@ detector: stage: detection enclosure: TomoWISE-experiment intro: "One detector gantry on 7 m floor rails serves both endstations (45 m to the 52 m hutch wall), carrying interchangeable microscopes and cameras. A removable flight tube reduces air scatter." - note: "Camera and microscope-optics models are design targets, chosen in project year 2 (DET-1, DET-2)." + note: > + The two microscopes are composed as Microscope Assemblies (Housing-anchored, + reusing the cross-facility catalog assembly): each has a turret, objectives, + and a selector over a scintillator. The four cameras and the gantry propagation + rail are shared across both microscopes, so the assembly's camera and + propagation_distance slots are left empty (ZeroOrOne). Camera models are design + targets (DET-1); the Optique Peter optics model is bound from the 2-BM catalog + candidate pending confirmation (DET-2). devices: - name: DetectorGantry family: Table @@ -280,19 +342,82 @@ detector: range: 45 m to 52 m note: "shared detector gantry" - name: MicLFOV - family: Microscope + family: Housing + model: optique_peter_micrx080 new: true confirm: true magnification: 1 to 2x numerical_aperture: ">0.2" - note: "large-field-of-view microscope (DET-2)" + cora: "Assembly(Microscope) presenting the Detector Role; Optics sub-assembly = turret + objectives + selector. The camera and propagation_distance slots are left empty (shared cameras + DetectorGantry rail)." + note: "large-field-of-view microscope; Optique Peter housing, model is the 2-BM candidate pending TomoWISE confirmation (DET-2)" + constituents: + - name: Turret + family: LinearStage + new: true + confirm: true + note: "objective changer: switches objectives without intervening in the setup (TDR p57)" + - name: Objective_1x + family: Objective + new: true + confirm: true + magnification: 1.0 + - name: Objective_2x + family: Objective + new: true + confirm: true + magnification: 2.0 + - name: ObjectiveSelector + family: PseudoAxis + new: true + confirm: true + note: "virtual objective picker over the turret" + - name: Scintillator + family: Scintillator + new: true + confirm: true + material: LSO or LuAG:Ce + thickness: 7 to 15 um - name: MicHR - family: Microscope + family: Housing + model: optique_peter_micrx080 new: true confirm: true magnification: 4x / 10x / 20x numerical_aperture: ">0.4" - note: "high-resolution microscope (DET-2)" + cora: "Assembly(Microscope) presenting the Detector Role; Optics sub-assembly = turret + objectives + selector. The camera and propagation_distance slots are left empty (shared cameras + DetectorGantry rail)." + note: "high-resolution microscope; Optique Peter housing, model is the 2-BM candidate pending TomoWISE confirmation (DET-2)" + constituents: + - name: Turret + family: LinearStage + new: true + confirm: true + note: "objective changer: switches objectives without intervening in the setup (TDR p57)" + - name: Objective_4x + family: Objective + new: true + confirm: true + magnification: 4.0 + - name: Objective_10x + family: Objective + new: true + confirm: true + magnification: 10.0 + - name: Objective_20x + family: Objective + new: true + confirm: true + magnification: 20.0 + - name: ObjectiveSelector + family: PseudoAxis + new: true + confirm: true + note: "virtual objective picker over the turret" + - name: Scintillator + family: Scintillator + new: true + confirm: true + material: LuAG:Ce + thickness: 7 to 15 um - name: CameraI family: Camera new: true diff --git a/docs/deployments/tomowise/equipment/detector.md b/docs/deployments/tomowise/equipment/detector.md index 1289d57a32..72a1d7779d 100644 --- a/docs/deployments/tomowise/equipment/detector.md +++ b/docs/deployments/tomowise/equipment/detector.md @@ -10,10 +10,12 @@ TomoWISE has a single detector system on a gantry that travels the experiment hu ## Microscopes -Interchangeable visible-light microscopes couple the scintillator image to the cameras. The optics vendor is a design decision deferred to project year 2 (DET-2); the Optique Peter MICRX080 is the reference. +Interchangeable visible-light microscopes (scintillator, objective, 45 deg mirror, CMOS camera) couple the scintillator image to the cameras, built for sensors up to 60 mm diagonal. Each is **composed as the cross-facility `Microscope` Assembly** that 2-BM also uses, rather than a loose family: a `Housing` anchors an `Optics` sub-assembly (a turret, the objectives, and a virtual objective selector for switching magnification "without intervening in the setup") over a `Scintillator`. The Optique Peter optics model from 2-BM, `optique_peter_micrx080`, is **bound** on each Housing as the design-target candidate (the TDR names only the vendor; confirmation is DET-2). -- **MicLFOV** (Family `Microscope`, not yet in the catalog): large field of view, 1-2x magnification, NA > 0.2. -- **MicHR** (Family `Microscope`, not yet in the catalog): high resolution, 4x / 10x / 20x, NA > 0.4. +Because TomoWISE's two microscopes share the four cameras and the one `DetectorGantry` propagation rail, the assembly's `camera` and `propagation_distance` slots are **decoupled**: the catalog assembly was generalized to make both `ZeroOrOne`, and each microscope leaves them empty. The cameras are modelled as separate shared Assets (below); the gantry provides the propagation distance. + +- **MicLFOV** (Assembly `Microscope`, Housing model `optique_peter_micrx080`): large field of view, 1-2x magnification, NA > 0.2; objectives 1x / 2x. +- **MicHR** (Assembly `Microscope`, Housing model `optique_peter_micrx080`): high resolution, 4x / 10x / 20x, NA > 0.4. ## Cameras @@ -24,4 +26,4 @@ Four cameras span the throughput-versus-speed-versus-resolution trade. The model - **Camera III** (Family `Camera`): ~4 Mpix, > 2,000 fps. Streaming. - **Camera IV** (Family `Camera`): 150 Mpix, 54 x 40 mm sensor, 3.76 um pixel. Matches the large-sensor device already procured for DanMAX. -The camera models, the microscope vendor, and the trigger path are the main detector-side [open questions](../questions.md). See [Inventory](../inventory.md) for the Asset tree. +The camera models, the bound microscope-optics model confirmation (DET-2), and the trigger path are the main detector-side [open questions](../questions.md). See [Inventory](../inventory.md) for the Asset tree. diff --git a/docs/deployments/tomowise/equipment/endstations.md b/docs/deployments/tomowise/equipment/endstations.md index deb16a29d3..5aacdc81cd 100644 --- a/docs/deployments/tomowise/equipment/endstations.md +++ b/docs/deployments/tomowise/equipment/endstations.md @@ -8,7 +8,7 @@ TomoWISE has two experiment stations in the experiment hutch, sharing one [detec The workhorse station: a fixed sample table about 45 m from the source carrying the rotation and positioning stack. -- **Sample table** (Family `Table`): fixed at 45 m, surface 390 mm above the beam. Coarse table motion Xt (+/-100 mm), Yt (+50/-150 mm), and a beta tilt (1.2 deg). +- **Sample table** (Family `Table`): fixed at 45 m, surface 390 mm below the beam, leaving space for sample environments. Coarse table motion Xt (+/-100 mm), Yt (+50/-150 mm), and a beta tilt (1.2 deg). - **Rotary stage** (Family `RotaryStage`): tomographic rotation up to 1200 rpm, 1 mdeg resolution, with a TTL encoder emitting 3600 pulses per revolution. The TDR names the Lab Motion Systems RT100AX as the target model; CORA leaves the Model unbound until confirmed (STAGE-1). This stage is also the trigger master clock (see [Controls](controls.md)). - **Sample positioning** (Family `LinearStage`): Xs/Zs centring, +/-6 mm per axis, 0.1 um resolution. Target model XY150B-12 (STAGE-2). - **Laminography tilt** (Family `TiltStage`): a 25 deg tilt axis for laminography, distinct from tomography rotation. @@ -23,8 +23,8 @@ Optional modules the TDR anticipates (a horizontal-rotation loading rig for in-s The high-resolution station: the KB mirror pair focuses the undulator beam for 200-nm-class cone-beam imaging. - **KB pair** (Family `Mirror`): Kirkpatrick-Baez fixed-curvature graded-multilayer focusing mirrors at ~49 m, focal spot 205 x 196 nm at 30 keV. Reused from the `Mirror` Family; the focusing-vs-steering distinction is a setting, not a Family split. -- **Sample stage** (Family `NanoPositioner`, not yet in the catalog): the nanotomography sample positioning. The TDR defers its specification to procurement, requiring only that its Abbe error be compatible with 200-nm resolution. Carried as a question (NANO-1), not a structure. +- **Sample manipulator** (granite support + a six-axis stack): the TDR specifies it in full (Table 9.5), conceptually like the microtomography endstation but about ten times more precise. It reuses the same Families, not a `NanoPositioner` of its own: a tilt (`TiltStage`, Tilt X), coarse X/Y/Z translations (`LinearStage`: Xt, Yt, and a long-travel Zt that brings the rotation axis into the KB focus), a continuous rotary (`RotaryStage`, Rot y), and fine Xs/Zs centring (`LinearStage`). The rotary is the critical axis: its Abbe error from wobble and eccentricity must not exceed 100 nm at 100 mm sample height. Each axis names a "(target)" model carried pending procurement (NANO-1). -The KB pair and the nano sample stage are the only nano-specific hardware; the shared beam delivery and detector serve both stations. +The KB pair and the sample manipulator are the only nano-specific hardware; the shared beam delivery and detector serve both stations. -See [Open questions](../questions.md) for the deferred items (nano stage, stage models) and [Inventory](../inventory.md) for the Asset tree. +See [Open questions](../questions.md) for the model bindings still to confirm and [Inventory](../inventory.md) for the Asset tree. diff --git a/docs/deployments/tomowise/equipment/index.md b/docs/deployments/tomowise/equipment/index.md index e13390be7f..725b128abb 100644 --- a/docs/deployments/tomowise/equipment/index.md +++ b/docs/deployments/tomowise/equipment/index.md @@ -5,7 +5,7 @@ TomoWISE delivers one beam to two experiment stations that share a detector. The beam path runs in three stages, the same source / sample / detection spine every CORA beamline inherits. - [Source](../beamline.md): the shared beam delivery. Two switchable insertion devices (CPMU14 undulator, 3T3PW wiggler) feed a front end of fixed and movable masks and a heat absorber, then an optics hutch of filters (CVD diamond, power-filter and metal-filter units) and a multilayer monochromator (MLM), then the safety shutters. The operation mode selects source, filters, and whether the MLM and KB optics are in the beam. -- [Endstations](endstations.md): two sample stations. The microtomography station (~45 m) carries the rotary stage, sample positioning, laminography tilt, sample-side slits and fast shutter, and a slip ring for continuous rotation. The nanotomography station (~49 m) adds the KB mirror pair for 200-nm-class cone-beam imaging; its sample stage is not yet specified. +- [Endstations](endstations.md): two sample stations. The microtomography station (~45 m) carries the rotary stage, sample positioning, laminography tilt, sample-side slits and fast shutter, and a slip ring for continuous rotation. The nanotomography station (~49 m) adds the KB mirror pair for 200-nm-class cone-beam imaging and a TDR-specified six-axis sample manipulator on a granite support (models pending procurement). - [Detector](detector.md): one gantry on 7 m floor rails serves both stations (45 m to the 52 m hutch wall), carrying interchangeable microscopes (MicLFOV, MicHR) and cameras (four design-target sensors). Cutting across all three: diff --git a/docs/deployments/tomowise/inventory.md b/docs/deployments/tomowise/inventory.md index cb54429f50..a2810cb7dc 100644 --- a/docs/deployments/tomowise/inventory.md +++ b/docs/deployments/tomowise/inventory.md @@ -4,7 +4,7 @@ TomoWISE is in the design phase, so this is the planned Asset shape, not a registered inventory. It is the cross-cutting reference view of the [Source](beamline.md) walk and the [endstation](equipment/endstations.md) and [detector](equipment/detector.md) pages. The shape is generated-honest: it is authored from the same [`beamline.yaml`](https://github.com/xmap/cora/blob/main/deployments/tomowise/beamline.yaml) descriptor that the Source page renders from. -Devices bind to catalog [Families](../../catalog/families.md) only. No vendor Models are bound: part numbers are not yet procured, and the "(target)" models named in the TDR are carried as open questions, not bindings. Control handles are omitted because MAX IV runs Tango/Sardana and the names are not yet assigned. +Devices bind to catalog [Families](../../catalog/families.md). Only one vendor Model is bound: the Optique Peter microscope optics (`optique_peter_micrx080`, reused from 2-BM, pending confirmation); the remaining "(target)" models named in the TDR are carried as open questions, not bindings, because part numbers are not yet procured. Control handles are omitted because MAX IV runs Tango/Sardana and the names are not yet assigned. ## The Asset tree @@ -17,7 +17,7 @@ Root Asset `TomoWISE` (`tier = Unit`, `facility_code = maxiv`); sub-systems nest | `3T3PW` | `Device` | InsertionDevice | three-pole wiggler, 3 T, 1.6 kW | | `FM1` / `FM2` | `Device` | Mask | fixed masks, 1.1 mrad apertures | | `MSM` | `Device` | Mask | movable safety mask | -| `HeatAbsorber` | `Device` | HeatAbsorber | 4 kW budget; with movable masks MM1/MM2 | +| `HeatAbsorber` | `Device` | HeatAbsorber | 4 kW budget; front-end, protects the safety shutter | | `CVD` | `Device` | Filter | 0.35 mm CVD diamond | | `PFU` | `Device` | Filter | two Si wedges, 0.2 to 25 mm effective | | `MLM` | `Device` | Monochromator | 20 to 65 keV, dE/E ~ 1.8% | @@ -32,12 +32,18 @@ Root Asset `TomoWISE` (`tier = Unit`, `facility_code = maxiv`); sub-systems nest | `FastShutter` | `Device` | Shutter | <5 ms / <10 ms reference designs | | `SlipRing` | `Device` | SlipRing | 30 to 40 channels, up to 1000 rpm | | `KB` | `Device` | Mirror | KB pair, 205 x 196 nm focus @ 30 keV | -| `NanoSampleStage` | `Device` | NanoPositioner | nanotomography stage, not yet specified | -| `DetectorGantry` | `Component` | Table | 7 m floor rails, 45 to 52 m | -| `MicLFOV` / `MicHR` | `Device` | Microscope | 1-2x / 4-20x microscopes | -| `CameraI` ... `CameraIV` | `Device` | Camera | 16-25 / 4 / 4 / 150 Mpix | - -Families not yet in the catalog (`Mask`, `HeatAbsorber`, `SlipRing`, `Microscope`, `NanoPositioner`) are bound loosely by design intent; they are earned into the catalog when a confirmed device needs them (the beam-path mask/stop tier and the nano stage are tracked below). +| `NanoGranite` | `Component` | Table | granite support for the nano manipulator | +| `NanoTilt` | `Device` | TiltStage | Tilt X, 2 deg, target Huber 5202.80 | +| `NanoCoarseX` / `NanoCoarseY` | `Device` | LinearStage | Xt/Yt coarse, target Huber 5101.20 / 5103.A20-90 | +| `NanoCoarseZ` | `Device` | LinearStage | Zt long-travel (250-300 mm), target Zaber X-LDQ-AE | +| `NanoRotary` | `Device` | RotaryStage | Rot y, continuous, Abbe < 100 nm, target RT100AS | +| `NanoSamplePositioning` | `Device` | LinearStage | Xs/Zs centring, +/-6 mm, target XY150B-12 | +| `DetectorGantry` | `Component` | Table | 7 m floor rails, 45 to 52 m (the shared propagation rail) | +| `MicLFOV` / `MicHR` | `Component` | Housing | Microscope Assemblies; Housing model `optique_peter_micrx080` | +| `MicLFOV` / `MicHR` constituents | `Device` | LinearStage / Objective / PseudoAxis / Scintillator | turret + objectives (1-2x / 4-20x) + selector + scintillator | +| `CameraI` ... `CameraIV` | `Device` | Camera | 16-25 / 4 / 4 / 150 Mpix; shared across both microscopes | + +`Mask` is now a shared catalog Family (earned in once both 2-BM and TomoWISE used it). The two microscopes compose the shared `Microscope` / `Optics` catalog Assemblies (Housing-anchored), so there is no loose `Microscope` family any more. The remaining families not yet in the catalog (`HeatAbsorber`, `SlipRing`) are bound loosely by design intent; they are earned into the catalog when a confirmed device needs them (the beam-path stop tier is tracked below). The nano manipulator reuses the same `TiltStage`, `LinearStage`, `RotaryStage`, and `Table` Families as the micro endstation, so it needs no nano-specific Family. ## Pending confirmations @@ -47,11 +53,11 @@ Every value below is a TDR design specification awaiting the beamline team. Each | --- | --- | --- | --- | | Control handles (Tango/Sardana device/attribute names) | all devices | `unknown-pending-confirmation` | (CTRL-1) | | Hutch PSS permit signals | both enclosures | `unknown-pending-confirmation` | (PSS-1) | -| Nanotomography sample stage (model, travel, resolution) | `NanoSampleStage` | `unknown-pending-confirmation` | (NANO-1) | +| Nanotomography stage model bindings (TDR Table 9.5 names a target per axis) | the nano `*` stages | `unknown-pending-confirmation` | (NANO-1) | | Rotary stage model (RT100AX target) | `Rotary` | `unknown-pending-confirmation` | (STAGE-1) | | Sample positioning model (XY150B-12 target) | `SamplePositioning` | `unknown-pending-confirmation` | (STAGE-2) | | Camera models I to IV | `CameraI`..`CameraIV` | `unknown-pending-confirmation` | (DET-1) | -| Microscope optics vendor and model | `MicLFOV`, `MicHR` | `unknown-pending-confirmation` | (DET-2) | +| Microscope optics model (Optique Peter `optique_peter_micrx080` bound, from 2-BM) | `MicLFOV`, `MicHR` | bound, pending confirmation | (DET-2) | | Trigger conditioner (direct TTL vs FPGA) | `Triggering` | `unknown-pending-confirmation` | (TRIG-1) | -| MLM coating (W/Si vs W/B4C) | `MLM` | `unknown-pending-confirmation` | (OPT-1) | +| MLM coating (W/SiC vs W/B4C per TDR text; Table 8.3 lists W/Si) | `MLM` | `unknown-pending-confirmation` | (OPT-1) | | Layout z reference (source vs straight-section centre) | all devices | `unknown-pending-confirmation` | (LAYOUT-1) | diff --git a/docs/deployments/tomowise/model.md b/docs/deployments/tomowise/model.md index 0f1588eeba..e646dcc96f 100644 --- a/docs/deployments/tomowise/model.md +++ b/docs/deployments/tomowise/model.md @@ -8,14 +8,17 @@ TomoWISE is a documentation-and-descriptor scaffold today: it exists as the desc | --- | --- | --- | | Beamline descriptor | [`deployments/tomowise/beamline.yaml`](https://github.com/xmap/cora/blob/main/deployments/tomowise/beamline.yaml) | the device walk; source of the generated [Source](beamline.md) page | | Site descriptor | [`deployments/maxiv/site.yaml`](https://github.com/xmap/cora/blob/main/deployments/maxiv/site.yaml) | the MAX IV facility surface | -| Catalog Family | [`catalog/catalog.yaml`](https://github.com/xmap/cora/blob/main/catalog/catalog.yaml) | `InsertionDevice` added for the two sources; other devices reuse existing Families | +| Catalog Family | [`catalog/catalog.yaml`](https://github.com/xmap/cora/blob/main/catalog/catalog.yaml) | `InsertionDevice` added for the two sources; `Mask` promoted to a shared Family (front-end masks, now shared with 2-BM); other devices reuse existing Families | +| Catalog Assembly | [`catalog/catalog.yaml`](https://github.com/xmap/cora/blob/main/catalog/catalog.yaml) | the two microscopes reuse the cross-facility `Microscope` / `Optics` Assemblies (shared with 2-BM); the `camera` and `propagation_distance` slots were generalized to `ZeroOrOne` so TomoWISE can share cameras + the gantry rail | +| Catalog Model | [`catalog/catalog.yaml`](https://github.com/xmap/cora/blob/main/catalog/catalog.yaml) | one model bound: `optique_peter_micrx080` (the 2-BM Optique Peter housing) on both microscope Housings, as the design-target candidate (DET-2) | | Equipment Assets | not yet registered | the [Inventory](inventory.md) is the planned shape; no scenario registers TomoWISE Assets yet | | Trust / governance | not yet instantiated | see [Governance](governance.md) | ## What is deliberately not here yet - **Integration scenarios.** No `test_tomowise_*.py` registers TomoWISE Assets into the event store. Scenario code is where Assets become real, and hard-registering a design-phase, moving-target beamline would commit speculative structure. It lands when the design firms and the team approves. -- **Vendor Models.** No catalog Models are bound: part numbers are not yet procured. The "(target)" models in the TDR are [open questions](questions.md), not bindings. +- **Vendor Models.** Only one catalog Model is bound: `optique_peter_micrx080` on the microscope Housings (reused from 2-BM, pending confirmation, DET-2). The remaining "(target)" models in the TDR are [open questions](questions.md), not bindings, because part numbers are not yet procured. - **Operations and experiment views.** A runbook and live experiment view for an unbuilt beamline would be invention; see the note on the [index](index.md#not-yet-documented). +- **Detector assemblies (done).** The two microscopes now compose the cross-facility `Microscope` / `Optics` Assemblies that 2-BM uses (Housing-anchored: turret + objectives + selector over a scintillator), rather than a loose family. The catalog assembly was generalized (`camera` and `propagation_distance` made `ZeroOrOne`) so TomoWISE can share its four cameras and the one gantry propagation rail across both microscopes. This also removed the prior name collision between the loose `Microscope` family and the catalog `Microscope` Assembly. What remains deferred is the integration scenario that registers the Fixture (slot -> Asset bindings) and a standalone fixture page; both wait until the design firms. The [2-BM Model page](../2-bm/model.md) shows the by-kind index a fully-modelled deployment carries. diff --git a/docs/deployments/tomowise/questions.md b/docs/deployments/tomowise/questions.md index 2ebdea640b..6cbaff7486 100644 --- a/docs/deployments/tomowise/questions.md +++ b/docs/deployments/tomowise/questions.md @@ -15,14 +15,14 @@ TomoWISE is in the design phase, so this page is long by design: almost every va | ID | Priority | Question | CORA assumes | Resolves | | --- | --- | --- | --- | --- | -| OPT-1 | Nice-to-have | Which MLM coating is selected, W/Si or W/B4C? | The MLM is one Monochromator Asset; coating is a setting. | The MLM coating setting. | +| OPT-1 | Nice-to-have | Which MLM coating is selected? The TDR text lists W/SiC or W/B4C; Table 8.3 lists W/Si. | The MLM is one Monochromator Asset; coating is a setting. | The MLM coating setting. | | LAYOUT-1 | Nice-to-have | What is the single z-coordinate reference for the layout? The TDR mixes "from the CPMU14 source" (front end) and "from the straight-section centre" (optics and downstream), about 505 mm apart. | z values are carried as approximate from-source and flagged confirm. | Exact device z positions. | ## Endstations | ID | Priority | Question | CORA assumes | Resolves | | --- | --- | --- | --- | --- | -| NANO-1 | Blocks-build | What is the nanotomography sample stage (model, travel, resolution)? The TDR defers it to procurement. | A nano sample stage exists but is unspecified. | The nanotomography endstation sample positioning. | +| NANO-1 | Blocks-go-live | Are the nanotomography sample-manipulator model bindings final? The TDR specifies the six-axis stack in Table 9.5 (tilt, coarse X/Y/Z, continuous rotary, fine Xs/Zs); only the per-axis model procurement remains. | The TDR-specified stack, reusing the micro-endstation Families, with a "(target)" model per axis carried unbound. | The nanotomography stage Model bindings. | | STAGE-1 | Blocks-go-live | Is the rotary stage the Lab Motion Systems RT100AX, and are its specs final? | The "(target)" RT100AX, used as the trigger master clock. | The rotary stage Model binding. | | STAGE-2 | Nice-to-have | Is the sample positioning stage the Lab Motion Systems XY150B-12? | The "(target)" XY150B-12. | The sample positioning Model binding. | @@ -31,5 +31,5 @@ TomoWISE is in the design phase, so this page is long by design: almost every va | ID | Priority | Question | CORA assumes | Resolves | | --- | --- | --- | --- | --- | | DET-1 | Blocks-go-live | Which camera models will be procured for cameras I to IV? (Chosen in project year 2.) | Four cameras at the stated design-target sensors/speeds; models unbound. | The camera Model bindings. | -| DET-2 | Blocks-go-live | Which microscope optics vendor and model (Optique Peter MICRX080 reference, or a smaller vendor)? | Two microscopes (MicLFOV, MicHR) at the stated magnifications; vendor unbound. | The microscope Model bindings. | +| DET-2 | Blocks-go-live | Confirm the microscope optics model. Each Housing binds the 2-BM candidate `optique_peter_micrx080`; the TDR names only the vendor (Optique Peter), so confirm this model or name the procured alternative (project year 2). | Two microscopes (MicLFOV, MicHR) composed as `Microscope` Assemblies, Housing model bound to `optique_peter_micrx080` pending confirmation. | The microscope Model confirmation. | | TRIG-1 | Blocks-go-live | Will the rotary TTL (3600 pulses/rev) feed the camera triggers directly, or is an FPGA conditioner needed? | Direct TTL, no conditioner; may evolve once camera trigger requirements are firm. | The trigger/sync chain. |