diff --git a/apps/api/tests/unit/deployments/test_site_descriptor.py b/apps/api/tests/unit/deployments/test_site_descriptor.py index 4d818d848a..54591851b8 100644 --- a/apps/api/tests/unit/deployments/test_site_descriptor.py +++ b/apps/api/tests/unit/deployments/test_site_descriptor.py @@ -261,9 +261,9 @@ def test_practice_method_links_only_known() -> None: "resonant_inelastic_scattering": "SIX RIXS; soft X-ray, not yet in pilot scope (TECH-1)", "inelastic_x_ray_scattering": "IXS hard X-ray inelastic scattering; not in scope (TECH-1)", "angle_resolved_photoemission": "ESM ARPES; photoemission, not yet in pilot scope (TECH-1)", - "grid_scan": "i03 + FMX MX fast grid scan; 2 consumers, not yet earned (TECH-1)", - "mx_data_collection": "i03 + FMX MX rotation data collection; 2 consumers (TECH-1)", - "sample_exchange": "i03 + FMX autonomous robotic sample exchange; 2 consumers (ROBOT-1)", + "grid_scan": "i03 + FMX + AMX MX fast grid scan; 3 consumers (TECH-1)", + "mx_data_collection": "i03 + FMX + AMX MX rotation collection; 3 consumers (TECH-1)", + "sample_exchange": "i03 + FMX + AMX robotic sample exchange; 3 consumers (ROBOT-1)", "solution_scattering": "lix bio-SAXS / SEC-SAXS; new Method not yet earned (TECH-1)", "small_angle_scattering": "i22 + 8-ID SAXS; portable Method not yet earned", "wide_angle_scattering": "i22 + 9-ID WAXS; portable Method not yet earned", diff --git a/deployments/amx/beamline.yaml b/deployments/amx/beamline.yaml new file mode 100644 index 0000000000..84c1153a95 --- /dev/null +++ b/deployments/amx/beamline.yaml @@ -0,0 +1,235 @@ +# AMX beamline descriptor (NSLS-II), reverse-engineered +# +# AMX (Highly Automated Macromolecular Crystallography) is the NSLS-II high-throughput MX +# beamline at sector 17-ID-1, the sibling of FMX (17-ID-2): they share the 17-ID straight +# and the IVU21 undulator. A vertical double-crystal monochromator, tandem-deflection and +# KB focusing mirrors, and a beam-conditioning unit feed a single-omega micro-goniometer; +# an EMBL robot loads cryo-cooled crystals from a 48-position dewar, and an Eiger pixel +# detector reads the rotation data. It is bound to the NSLS-II Site +# (deployments/nsls2/site.yaml), the seventeenth NSLS-II beamline after FXI, HXN, BMM, SRX, +# SIX, CHX, CSX, XPD, ESM, SMI, IXS, SST, ISS, FMX, CMS, XFM, and CORA's third +# macromolecular-crystallography deployment after Diamond i03 and NSLS-II FMX. +# +# STATUS: reverse-engineered, design-phase. Every value is read from public open source +# (the NSLS2/amx-profile-collection bluesky / ophyd startup files; the real MX acquisition +# logic lives in the lsdc / mxtools libraries, referenced not modelled) or inferred, +# carried `confirm: true` pending AMX staff. EPICS PVs are real and verified against the +# startup/*.py device classes; the goniometer / robot / detector vendor identities and the +# crystal cut are not in source and are open questions. Same descriptor mode as the other +# NSLS-II beamlines: descriptor + docs, scenarios deferred. +# +# AMX is a PURE-REUSE deployment: it coins NO new Family and graduates nothing. It reuses +# the MX vocabulary i03 / FMX established: the graduated Goniometer (the single-omega +# micro-goniometer), the Camera (the Eiger), the Monochromator (the vertical DCM), the +# Mirror (the tandem-deflection + KB mirrors), the Filter (the BCU attenuator), the +# BeamStop, the EnergyDispersiveSpectrometer (the Mercury fluorescence detector), the +# FluxMonitor (the Keithley), the TimingController (the Zebra), and the loose +# BeamPositionMonitor (DIAG-1). The robotic sample changer is one Positioner-presenting +# Asset (NO new SampleChanger Family), the i03 / 19-BM / FMX precedent (ROBOT-1). The MX +# Methods (mx_data_collection, grid_scan, sample_exchange) stay PENDING: AMX is their THIRD +# consumer (after i03, FMX), which strengthens but does not coin them (Methods coin on a +# conduct-path, not a sighting count; the energy_scan deferral discipline; TECH-1). Unlike +# FMX, AMX has no CRL transfocator and no on-axis backlight in source. + +beamline: + name: AMX + facility: nsls2 # NSLS-II Site (facility_code: nsls2) + sector: "Sector 17" # PV namespace XF:17ID* (the 17-ID-1 branch) + tier: Unit + parent: null + source: insertion-device + source_confirm: "AMX (17-ID-1) shares its IVU21 in-vacuum undulator (SR:C17-ID:G1{IVU21:1}) and the 17-ID straight with its sibling FMX (17-ID-2, which uses IVU21:2); modelled as one root Unit feeding the 17-ID-1 branch (the FMX / CSX precedent), not two roots. Undulator period and gap range not fully in the profile collection (SRC-1, TOPO-1)." + +enclosures: + # 17-ID has a shared front-end / optics enclosure (PV zone XF:17IDA, the FOE: the + # high-heat-load slit, the vertical DCM, the tandem-deflection mirrors) and the AMX + # experiment enclosure (PV zone XF:17IDB: the KB mirrors, the goniometer, the robot, the + # Eiger). The zone letters A / B are grounded in the PV prefixes (note AMX's endstation + # is 17IDB, where FMX's is 17IDC); the AMX-shared layout is not fully in source (TOPO-1). + - name: 17-ID-A + role: optics-hutch + facility_code: nsls2 + permit_signal: {confirm: "PSS search-and-secure permit leaf and the shutter PVs are not in the profile collection; the front end is shared with FMX (PSS-1, TOPO-1)"} + - name: 17-ID-B + role: experiment-hutch + facility_code: nsls2 + permit_signal: {confirm: "PSS permit leaf unknown; 17-ID-B (PV zone XF:17IDB) is the AMX experiment enclosure carrying the KB mirrors, the goniometer, the robot, and the Eiger (PSS-1)"} + +# =========================================================================== +# SOURCE STAGE: the shared insertion device and the shutters +# =========================================================================== + +source: + stage: source + enclosure: 17-ID-A + intro: The shared 17-ID insertion device, the front-end and photon shutters, and the high-heat-load slit. + devices: + - name: Undulator + family: InsertionDevice + pv: "SR:C17-ID:G1{IVU21:1}" + confirm: true + note: "IVU21 in-vacuum undulator on the NSLS-II 3 GeV ring (ring current SR:OPS-BI{DCCT:1}I:Real-I), shared with FMX (17-ID-2, IVU21:2) on the 17-ID straight; AMX drives gap index :1. Gap axis SR:C17-ID:G1{IVU21:1-Ax:Gap}-Mtr. Period and range not fully in source (SRC-1, TOPO-1)." + - name: FrontEndShutter + family: Shutter + confirm: "shared FMX / AMX front-end (FOE) photon shutter; PV not in the profile collection (PSS-1)" + note: "Front-end photon shutter (not exposed in the profile collection)." + - name: PhotonShutter + family: Shutter + confirm: "AMX photon shutter into the experiment enclosure; PV not in the profile collection (PSS-1)" + note: "Photon shutter gating the beam into the experiment enclosure (not exposed in the profile collection)." + - name: FrontEndSlit + family: Slit + pv: "FE:C17A-OP{Slt" + confirm: true + note: "Front-end white-beam slit (FE:C17A-OP{Slt:1 / Slt:2 / Slt:12 blades and center / gap) defining the accepted beam, shared with FMX." + - name: HighHeatLoadSlit + family: Slit + pv: "XF:17IDA-OP:AMX{Slt:0" + confirm: true + note: "High-heat-load white-beam slit ahead of the monochromator." + +# =========================================================================== +# OPTICS STAGE: the monochromator, the focusing mirrors, the attenuator +# =========================================================================== + +optics: + stage: source + enclosure: 17-ID-A + intro: "Condition the beam and set its energy: the vertical double-crystal monochromator, the tandem-deflection harmonic-rejection mirrors and the KB focusing pair, the beam-conditioning attenuator, and the slits. PVs verified against the amx-profile-collection startup files." + devices: + - name: Monochromator + family: Monochromator + pv: "XF:17IDA-OP:AMX{Mono:DCM" + confirm: true + note: "Vertical double-crystal monochromator (VDCM; Bragg / gap / pitch / roll / W axes XF:17IDA-OP:AMX{Mono:DCM-Ax:B/G/P/R/W}Mtr and an energy axis XF:17IDA-OP:AMX{Mono:DCM-Ax:E}Mtr). The vertical geometry is the AMX-vs-FMX difference (FMX is horizontal). Reuses the Monochromator family. Crystal cut and energy range pending (DCM-1)." + - name: TandemMirror + family: Mirror + pv: "XF:17IDA-OP:AMX{Mir:TDM" + confirm: true + note: "Tandem-deflection mirror pair (TDM; pitch / roll / X / Y up-and-down-stream axes) for harmonic rejection and steering, AMX's analog of FMX's horizontal focusing mirror. Reuses the Mirror family (KB-1)." + - name: KBMirrors + family: Mirror + pv: "XF:17IDB-OP:AMX{Mir" + enclosure: 17-ID-B + confirm: true + note: "Kirkpatrick-Baez microfocus mirror pair (horizontal KBH with P/R/X/Y axes, vertical KBV with P/X/Y, XF:17IDB-OP:AMX{Mir:KBH / KBV-Ax:...}Mtr) focusing the microbeam at the sample, with a piezo tweaker. Reuses the Mirror family (KB-1)." + - name: BeamConditioningAttenuator + family: Filter + pv: "XF:17IDB-OP:AMX{Attn:BCU" + enclosure: 17-ID-B + confirm: true + note: "Beam-conditioning-unit attenuator (BCU; four insertable absorber foils XF:17IDB-OP:AMX{Attn:BCU-Ax:1-4}Mtr solving a foil combination for a requested transmission XF:17IDB-OP:AMX{Attn:BCU}). Reuses the Filter family; the energy-dependent transmission solver is the deferred Attenuable leg (the LCLS-MFX ATT-1 precedent). Unlike FMX, AMX has no CRL transfocator in source." + - name: ExperimentSlits + family: Slit + pv: "XF:17IDB-OP:AMX{Slt:2" + enclosure: 17-ID-B + confirm: true + note: "Beam-defining slits in the experiment enclosure (XF:17IDB-OP:AMX{Slt:2 / Slt:3 / Slt:4}); a first slit station sits at XF:17IDA-OP:AMX{Slt:1} in the FOE. Reuses the Slit family." + - name: EnergyAxis + family: PseudoAxis + confirm: true + note: "The master energy axis: a pseudopositioner coordinating the undulator gap, the VDCM, and the mirrors from per-energy look-up tables (the set_energy plan). Energy is set for the experiment and scanned for anomalous (SAD / MAD) data collection; the MX technique scope is TECH-1." + +# =========================================================================== +# SAMPLE STAGE: the goniometer, the robot, the sample environment +# =========================================================================== + +sample: + stage: sample + enclosure: 17-ID-B + intro: "The micro-goniometer, the automated sample-changing robot, the on-axis viewing, and the sample cooling. PVs verified against the amx-profile-collection startup files." + note: > + AMX mounts cryo-cooled protein crystals on a single-omega micro-goniometer with x/y/z + centring and PI fine stages, exchanged by an EMBL robot from a 48-position dewar. The + goniometer reuses the graduated Goniometer family; the robot is one Positioner Asset + (not a new Family). Sample cryo-cooling (the cold-gas cryostream) is not exposed in the + profile collection, so it is deferred (CRYO-1). + devices: + - name: Goniometer + family: Goniometer + pv: "XF:17IDB-ES:AMX{Gon:1" + confirm: true + note: "The MX micro-goniometer (single omega rotation XF:17IDB-ES:AMX{Gon:1-Ax:O}Mtr plus GX / GY / GZ sample-centring and PY / PZ pin fine stages). Reuses the Goniometer family (graduated on the i03 Smargon, reused at FMX); per-axis decomposition and centre-of-rotation calibration pending (GONIO-1)." + - name: Robot + pv: "XF:17IDB-ES:AMX{EMBL}:" + confirm: true + note: "Automated sample-changing EMBL robot (XF:17IDB-ES:AMX{EMBL}:) coordinated by the LSDC / mxtools Governor state machine (XF:17IDB-ES:AMX{Gov:...}) with a 48-position dewar and a sample-detection smart magnet. Per the i03 / 19-BM / FMX precedent: one Positioner-presenting Asset loading / unloading a Subject, gated by a Clearance, vendor in a bound Model; NOT a new SampleChanger Family. The exchange workflow and Subject custody lifecycle are deferred (ROBOT-1)." + - name: SampleCamera + family: Camera + pv: "XF:17IDB-ES:AMX{Cam:7}" + confirm: true + note: "On-axis sample-viewing camera (a Prosilica; low-mag XF:17IDB-ES:AMX{Cam:6} and X-eye XF:17IDB-ES:AMX{Cam:9} cameras serve alignment). Reuses the Camera family. AMX exposes no separate on-axis backlight PV (an FMX-vs-AMX difference)." + +# =========================================================================== +# DETECTION STAGE: the Eiger, the fluorescence detector, the beam monitors +# =========================================================================== + +detector: + stage: detection + enclosure: 17-ID-B + intro: "The Eiger area detector, the fluorescence detector for energy / edge selection, the on-axis beamstop, and the beam-position and flux monitors. PVs verified against the amx-profile-collection startup files." + note: > + The Eiger reads the rotation diffraction data; the Mercury multi-element detector reads + fluorescence for energy-edge selection (anomalous MX); both bind catalog Families. The + full detector roster (Eiger model, beam centre, fluorescence ROIs) is DET-1. + devices: + - name: AreaDetector + family: Camera + confirm: "the MX science detector (an Eiger pixel-array detector); its PV is not exposed in the AMX profile collection (DET-1)" + note: "The Eiger area detector reading the rotation diffraction data. Reuses the Camera family (Detector Role). Not exposed in the profile collection, so model and beam centre are pending (DET-1)." + - name: FluorescenceDetector + family: EnergyDispersiveSpectrometer + pv: "XF:17IDB-ES:AMX{Det:Mer}" + confirm: true + note: "Mercury multi-element fluorescence detector (an energy-dispersive multi-channel analyzer reading the XRF spectrum to pick the absorption edge for anomalous data collection). Reuses the EnergyDispersiveSpectrometer family. Element count and ROI map pending (DET-1)." + - name: BeamStop + family: BeamStop + pv: "XF:17IDB-ES:AMX{BS:1" + confirm: true + note: "On-axis motorized beamstop (XF:17IDB-ES:AMX{BS:1-Ax:FX / FY}Mtr) blocking the direct beam ahead of the Eiger. Reuses the BeamStop family." + - name: BeamPositionMonitor + family: BeamPositionMonitor # loose Family (held; DIAG-1) + pv: "XF:17IDA-BI:AMX{BPM:1}" + confirm: true + note: "Beam-position monitors along the beam (XF:17IDA-BI:AMX{BPM:1}, XF:17IDB-BI:AMX{BPM:2 / BPM:3} four-quadrant monitors). Binds the loose BeamPositionMonitor family that the other NSLS-II beamlines also use (held; DIAG-1)." + - name: FluxMonitor + family: FluxMonitor + pv: "XF:17IDB-BI:AMX{Keith:1}readFloat" + confirm: true + note: "Keithley picoammeter reading the beam-intensity photocurrent (I0 normalization). Reuses the FluxMonitor family." + +# =========================================================================== +# Cross-cutting controls +# =========================================================================== + +controls: + intro: > + AMX runs the NSLS-II EPICS control stack driven by LSDC (the macromolecular- + crystallography acquisition system) and the mxtools bluesky library. Rotation data + collection is triggered against the Eiger by a Zebra FPGA; the autonomous sample + exchange is coordinated by the Governor state machine. Controller box models / firmware + are not fully in source (DRIVE-1). + motion_controllers: + - name: MotionController + family: MotionController + confirm: "the goniometer / optics motion controllers (a PowerBrick vector controller drives rotation data collection); box model / firmware not reliably in the profile collection (DRIVE-1)" + note: "Drives the goniometer vector and the optics axes. Reuses the MotionController family. The profile's PowerBrick vector PV is misconfigured to the FMX prefix in source, so it is not quoted here (DRIVE-1)." + triggering: + - name: Zebra + family: TimingController + pv: "XF:17IDB-ES:AMX{Zeb:1}:" + confirm: true + note: "Zebra FPGA position-capture and trigger box (a second Zebra sits at XF:17IDB-ES:AMX{Zeb:2}): gates the Eiger against the goniometer for rotation and fast grid scans. Reuses the TimingController family." + software_iocs_not_modeled: + [LSDC, mxtools, EigerIOC, EMBL, Governor, MercuryDXP] + +resources: + intro: Continuously-available resources. Facility-scope supplies live in deployments/nsls2/site.yaml. + supplies: + - kind: PhotonBeam + - kind: CoolingWater + - kind: Vacuum # in-vacuum undulator + optics beam path + - kind: LiquidNitrogen # sample cryo-cooling + - kind: Power + replaceable_parts: + swappable_with_identity: ["sample pucks / pins", "attenuator foils", "KB mirror stripes", "the Eiger detector"] diff --git a/deployments/nsls2/site.yaml b/deployments/nsls2/site.yaml index 3e359e4ca4..ed318edbbd 100644 --- a/deployments/nsls2/site.yaml +++ b/deployments/nsls2/site.yaml @@ -25,7 +25,7 @@ facility: heading: "NSLS-II" kind: Site institution: Brookhaven National Laboratory - beamlines: [FXI, HXN, BMM, SRX, SIX, CHX, CSX, IOS, XPD, ESM, SMI, IXS, SST, ISS, FMX, CMS, XFM, LIX, HEX] + beamlines: [FXI, HXN, BMM, SRX, SIX, CHX, CSX, IOS, XPD, ESM, SMI, IXS, SST, ISS, FMX, CMS, XFM, LIX, HEX, AMX] # ISA-88 Site Recipes: the facility-adapted form of a catalog Method. All pending # because they are reverse-engineered from the FXI profile collection, not yet @@ -134,6 +134,15 @@ practices: - {name: HEX_radiography_practice, method: radiography, pending: true, note: "time-resolved high-speed radiography on the Phantom Veo; reuses the radiography Method APS 7-BM left pending, the second consumer (TECH-1)"} - {name: HEX_energy_dispersive_diffraction_practice, method: energy_dispersive_diffraction, pending: true, note: "spatially-resolved energy-dispersive X-ray diffraction (EDXD) on the GeRM germanium strip detector; reuses the energy_dispersive_diffraction Method APS 7-BM left pending, the second consumer (TECH-1)"} - {name: HEX_powder_diffraction_practice, method: powder_diffraction, pending: true, note: "monochromatic angle-dispersive / powder diffraction (ADXD) on the PerkinElmer flat panel; reuses the powder_diffraction Method Diamond i11 left pending, the second consumer (TECH-1)"} + # AMX (17-ID-1) is FMX's high-throughput MX sibling on the shared 17-ID straight: rotation + # data collection on a single-omega goniometer + Eiger, fast grid scans, and an autonomous + # EMBL-robot sample-exchange loop. These reuse the three MX Methods i03 / FMX left pending; + # AMX is the third consumer of each. They stay pending: Methods coin on a conduct-path (an + # integration scenario that runs them), not a sighting count, so n=3 strengthens the case + # but does not coin them (the energy_scan discipline; TECH-1 / ROBOT-1). + - {name: AMX_mx_data_collection_practice, method: mx_data_collection, pending: true, note: "rotation / oscillation MX data collection on the single-omega goniometer + Eiger via the mxtools vector / Zebra flyer; reuses the i03 / FMX mx_data_collection Method, the third consumer (TECH-1)"} + - {name: AMX_grid_scan_practice, method: grid_scan, pending: true, note: "fast grid scan for sample location / centring via the Zebra-triggered goniometer raster; reuses the i03 / FMX grid_scan Method, the third consumer (TECH-1)"} + - {name: AMX_sample_exchange_practice, method: sample_exchange, pending: true, note: "autonomous EMBL-robot load / centre / collect / unmount loop coordinated by the LSDC Governor; reuses the i03 / FMX sample_exchange Method, the third consumer; a Procedure over the spine + a Subject custody thread (ROBOT-1)"} # Access BC Actors conceptually facility-wide at NSLS-II. Pending until the NSLS-II # operator and review structure is confirmed; the profile collection only exposes diff --git a/docs/deployments/amx/equipment/controls.md b/docs/deployments/amx/equipment/controls.md new file mode 100644 index 0000000000..261f51c65d --- /dev/null +++ b/docs/deployments/amx/equipment/controls.md @@ -0,0 +1,31 @@ +# Controls + +*The rotation motion, the Zebra trigger box, the motion controllers, and the seam between CORA and the floor.* + +## Rotation data collection + +AMX's defining operation is a rotation (oscillation) data collection: the goniometer omega sweeps a vector trajectory while the Eiger captures frames, gated by a hardware trigger. A PowerBrick vector controller runs the goniometer vector and the `Zebra` FPGA (`XF:17IDB-ES:AMX{Zeb:1}`, with a second at `{Zeb:2}`) captures position and fans out the triggers to the Eiger. The fast grid scan for crystal location uses the same vector + Zebra path. CORA would model the sweep as conducting a Run, with the vector as a held trajectory. + +## Motion controllers + +The goniometer vector and grid-scan motion run on a PowerBrick / PPMAC; the remaining axes (mirrors, slits, sample stages) are standard EPICS motor records. The controller box models, firmware, and IPs are not reliably in the profile collection (the profile's PowerBrick vector PV is misconfigured to the FMX prefix), so `MotionController` is carried as a `MotionController` family with the specifics blank (DRIVE-1). + +## The seam: CORA and the floor + +This is where CORA's design meets the AMX floor. The shape matches the other NSLS-II beamlines'. + +CORA **owns** (its conducting engine, over the `ControlPort`): + +- the acquisition: setting the energy, centring the crystal, running the rotation or grid-scan vector, and collecting the Eiger under the gated trigger; +- the autonomous loop: the EMBL-robot load / centre / collect / unmount sequence as a Procedure over the spine, threaded through the `Subject` custody lifecycle and gated by the [trust boundary](../governance.md#the-trust-boundary) (ROBOT-1); +- the choice of technique, energy, and program, and the beam-centre / energy calibrations. + +CORA **drives through** (the floor it actuates and observes, and does not replace): + +- the EPICS IOCs via the ophyd hardware abstraction: the `ControlPort` boundary; +- the LSDC Governor robot/human state machine, the PowerBrick vector and Zebra triggering, the bimorph mirror shaping, the Eiger and Mercury detector IOCs, and the PSS interlock; +- the facility filestore where the per-run data lands. CORA moves it, over the `TransferPort`, into CORA's own Dataset of record. + +So CORA brings one conducting engine to AMX, working over the ports: acquisition over the `ControlPort`, the per-technique reduction (indexing, integration, scaling, phasing) over the `ComputePort`, and data egress over the `TransferPort` into the CORA Dataset. + +The software systems (`LSDC`, `mxtools`, the EMBL robot, the Governor, the Eiger IOC, the Mercury DXP) are referenced by PV namespace only, never registered as Assets. diff --git a/docs/deployments/amx/equipment/detector.md b/docs/deployments/amx/equipment/detector.md new file mode 100644 index 0000000000..723b28b291 --- /dev/null +++ b/docs/deployments/amx/equipment/detector.md @@ -0,0 +1,25 @@ +# Detector + +*The Eiger area detector, the fluorescence detector, the beamstop, and the beam monitors. PVs verified against the amx-profile-collection startup files.* + +AMX's science detector is the Eiger, reading the rotation diffraction; a Mercury multi-element detector reads fluorescence to pick the absorption edge for anomalous data collection. + +| Asset | Family | PV | What it serves | +| --- | --- | --- | --- | +| `AreaDetector` | Camera | (not in profile) | rotation diffraction (the MX data, DET-1) | +| `FluorescenceDetector` | EnergyDispersiveSpectrometer | `XF:17IDB-ES:AMX{Det:Mer}` | XRF edge selection (anomalous MX) | +| `BeamStop` | BeamStop | `XF:17IDB-ES:AMX{BS:1}` | blocks the direct beam ahead of the Eiger | +| `BeamPositionMonitor` | BeamPositionMonitor (loose) | `XF:17IDA-BI:AMX{BPM:1}` | beam-position diagnostics | +| `FluxMonitor` | FluxMonitor | `XF:17IDB-BI:AMX{Keith:1}` | beam-intensity photocurrent (I0) | + +## The Eiger + +The `AreaDetector` is the Eiger pixel-array detector (the MX science detector); it reuses the `Camera` family (Detector Role), as i03's and FMX's Eigers do. Unlike FMX, the AMX profile collection does not expose the Eiger PV, so it is carried confirm-only: model, beam centre, and threshold energy are pending (DET-1). The detector frames flow through the LSDC / mxtools data plane, referenced by CORA as a Dataset rather than re-modelled. + +## The fluorescence detector + +The `FluorescenceDetector` is a Mercury multi-element detector (`XF:17IDB-ES:AMX{Det:Mer}`), an energy-dispersive multi-channel analyzer that reads the XRF spectrum so the operator can pick the absorption edge for SAD / MAD anomalous phasing. It reuses the catalog `EnergyDispersiveSpectrometer` family; element count and ROI map are pending (DET-1). + +## Beam monitors + +The `BeamStop` reuses `BeamStop`. The `BeamPositionMonitor` binds the loose `BeamPositionMonitor` family (the four-quadrant BPMs `XF:17IDA-BI:AMX{BPM:1}`, `XF:17IDB-BI:AMX{BPM:2 / BPM:3}`; held, DIAG-1). The `FluxMonitor` is a Keithley picoammeter reading the I0 photocurrent, reusing `FluxMonitor`. diff --git a/docs/deployments/amx/equipment/index.md b/docs/deployments/amx/equipment/index.md new file mode 100644 index 0000000000..4a4fd89bbf --- /dev/null +++ b/docs/deployments/amx/equipment/index.md @@ -0,0 +1,21 @@ +# The beamline + +*The AMX beam path, area by area. CORA models the beamline as one root Asset (`AMX`) with the devices nested below it; this page is the human walk, the [Inventory](../inventory.md) is the flat reference.* + +AMX is the high-throughput microfocus MX branch at sector 17-ID, FMX's sibling: a shared undulator and a front-end / optics enclosure (17-ID-A) feed a dedicated experiment enclosure (17-ID-B) that holds the KB mirrors, the goniometer, the EMBL robot, and the Eiger. + +``` + 17-ID-A (FOE, shared with FMX) 17-ID-B (AMX experiment) + ------------------------------------------ ------------------------------------- + IVU21 -> VDCM -> TDM -> high-heat slit ----> KB mirrors -> BCU attenuator + (energy) goniometer (omega) + EMBL robot + Eiger <- rotation data + Mercury XRF <- edge selection +``` + +- [Source](../beamline.md) (`17-ID-A`): the shared IVU21 undulator, the front-end and photon shutters, and the high-heat-load slit, then the optics, the vertical double-crystal monochromator, the tandem-deflection mirrors, the KB microfocus pair, the beam-conditioning attenuator, and the slits. This page is generated from the descriptor. +- [Sample](sample.md) (`17-ID-B`): the micro-goniometer, the automated EMBL robot, and the on-axis viewing camera. +- [Detector](detector.md): the Eiger area detector, the Mercury fluorescence detector, the beamstop, and the beam-position and flux monitors. +- [Controls](controls.md): the Zebra trigger box, the rotation motion, and the LSDC / mxtools seam. + +Each device the profile exposes binds a catalog [Family](../../../catalog/families.md) and a verified EPICS PV; the shutters, the Eiger, and the motion controller are carried confirm-only where the profile omits them. AMX graduates nothing: as FMX's sibling it reuses the i03 / FMX MX vocabulary (the graduated `Goniometer`, `Camera`); the loose family is the held `BeamPositionMonitor`, and the robot is a Positioner Asset with no Family. diff --git a/docs/deployments/amx/equipment/sample.md b/docs/deployments/amx/equipment/sample.md new file mode 100644 index 0000000000..0defd29f09 --- /dev/null +++ b/docs/deployments/amx/equipment/sample.md @@ -0,0 +1,23 @@ +# Sample + +*The micro-goniometer, the automated EMBL robot, and the on-axis viewing. PVs verified against the amx-profile-collection startup files.* + +AMX mounts cryo-cooled protein crystals on a single-omega micro-goniometer, exchanged by an automated EMBL robot from a 48-position dewar, and viewed on-axis for loop centring. + +| Asset | Family | PV | What it does | +| --- | --- | --- | --- | +| `Goniometer` | Goniometer | `XF:17IDB-ES:AMX{Gon:1}` | orients and centres the crystal | +| `Robot` | (Positioner Asset) | `XF:17IDB-ES:AMX{EMBL}:` | loads / unloads crystals from the dewar | +| `SampleCamera` | Camera | `XF:17IDB-ES:AMX{Cam:7}` | on-axis sample viewing | + +## The goniometer + +The `Goniometer` reuses the `Goniometer` family that Diamond i03 graduated and FMX reused: a single omega rotation (`XF:17IDB-ES:AMX{Gon:1-Ax:O}Mtr`) with GX / GY / GZ sample-centring and PY / PZ pin fine stages. AMX is the third sighting of the MX goniometer, reinforcing the graduation; axis count and centre-of-rotation are a per-Asset settings difference (GONIO-1). + +## The sample-changing robot + +The `Robot` is the automated EMBL sample changer (`XF:17IDB-ES:AMX{EMBL}:`), coordinated by the LSDC / mxtools Governor state machine with a 48-position dewar and a sample-detection smart magnet. Following the i03 / 19-BM / FMX precedent, it is **one Positioner-presenting Asset, not a new SampleChanger Family**: it loads and unloads a `Subject` (the crystal), gated by a `Clearance`, with the vendor in a bound Model. The exchange workflow and the Subject custody lifecycle (Received to mounted to measured to Returned) are the genuinely new MX modelling, deferred to a named question (ROBOT-1). Being "highly automated", AMX is where this autonomous loop matters most. + +## Sample environment + +The on-axis sample viewing uses the `SampleCamera` (a Prosilica; low-mag and X-eye cameras serve alignment); AMX exposes no separate on-axis backlight PV (an FMX-vs-AMX difference). Sample cryo-cooling (the cold-gas cryostream) is not exposed in the profile collection, so it is deferred (CRYO-1); it would bind `TemperatureController` (the i03 cryostream precedent) once its PV is supplied. diff --git a/docs/deployments/amx/governance.md b/docs/deployments/amx/governance.md new file mode 100644 index 0000000000..41b0de334f --- /dev/null +++ b/docs/deployments/amx/governance.md @@ -0,0 +1,17 @@ +# Governance + +*Who may act at AMX and the trust shape CORA applies. This is CORA's governance design landing on the beamline, not a description of the beamline's current controls authority.* + +People and agents are facility principals at the [NSLS-II Site](../nsls2/index.md#who-acts-here); on the beamline they surface through the actions they take. The human roster is not known from the profile collection (GOV-1), so the principals are the design shape, not a registered list. + +## Who acts + +CORA brings its own Access model: a small set of facility roles (operator, beamline scientist, safety reviewer, and the autonomous-agent and service principals) scoped at the NSLS-II Site. An AMX beamtime is run by an operator or beamline scientist Actor; a safety reviewer holds the clearance authority. + +## The trust boundary + +CORA's Trust BC (Zone, Conduit, Policy) gates every command by who is acting and what the beamline state allows: who may set the energy, move the goniometer, start a rotation data collection or a grid scan, drive the robot, override a caution, or commit a beam-centre calibration. This authority is CORA's own, expressed per Actor, not inherited from the beamline's controls layer (the LSDC Governor). The NSLS-II proposal and cycle are a fact CORA's Campaign uses for custody. + +## The autonomous loop under custody + +AMX is "highly automated": its defining governance wrinkle is the unattended EMBL-robot sample-exchange loop. CORA's Campaign, Trust, and Subject shapes are where that resolves: the robot loading a crystal is a command the trust boundary gates, and the crystal is a `Subject` whose custody (Received to mounted-on-goniometer to measured to Returned / Stored) is the record of record. The autonomous loop is gated by a `Clearance` issued after a safety review, the same pattern as i03 and FMX. An autonomous Agent driving the load-centre-collect-unmount cycle would be a facility principal scoped at the Site, governed by the same trust boundary, with each choice recorded as a [Decision](../../architecture/modules/decision/index.md). None is declared yet; the autonomous-loop lifecycle is deferred (ROBOT-1). diff --git a/docs/deployments/amx/index.md b/docs/deployments/amx/index.md new file mode 100644 index 0000000000..8fd0593d2f --- /dev/null +++ b/docs/deployments/amx/index.md @@ -0,0 +1,45 @@ +# AMX + +*Highly Automated Macromolecular Crystallography at NSLS-II, beamline 17-ID-1: high-throughput rotation MX data collection on a single-omega goniometer and an Eiger detector, with an automated EMBL robot sample changer. FMX's sibling on the shared 17-ID straight. This page describes how CORA would model and run AMX; the model is reverse-engineered from public configuration, not yet confirmed by AMX staff.* + +| Property | Value | +| --- | --- | +| Asset | `AMX` (root Asset, `tier = Unit`, `parent_id = None`) | +| Facility | [NSLS-II](../nsls2/index.md) (bound via `facility_code = "nsls2"`, `FacilityKind = Site`) | +| Sector | `Sector 17` (PV namespace `XF:17ID*`, the 17-ID-1 branch) | +| Institution | Brookhaven National Laboratory (context; not modeled as an Asset or Facility) | +| Status | Reverse-engineered from public config (design-phase scaffold) | +| Source | IVU21 in-vacuum undulator on the NSLS-II 3 GeV ring (shared with FMX on the 17-ID straight) | + +!!! note "How CORA would land on AMX" + These pages describe how CORA would model, govern, and conduct AMX, the seventeenth NSLS-II beamline after [FXI](../fxi/index.md), [HXN](../hxn/index.md), [BMM](../bmm/index.md), [SRX](../srx/index.md), [SIX](../six/index.md), [CHX](../chx/index.md), [CSX](../csx/index.md), [XPD](../xpd/index.md), [ESM](../esm/index.md), [SMI](../smi/index.md), [IXS](../ixs/index.md), [SST](../sst/index.md), [ISS](../iss/index.md), [FMX](../fmx/index.md), [CMS](../cms/index.md), and [XFM](../xfm/index.md), and CORA's third macromolecular-crystallography beamline after Diamond [i03](../i03/index.md) and NSLS-II FMX. They are not a survey of the beamline's current software. The hardware facts are read from public NSLS-II open source (the `NSLS2/amx-profile-collection` bluesky / ophyd startup files; the MX acquisition logic lives in the `lsdc` / `mxtools` libraries) and verified against it; the goniometer / robot / detector vendor identities and the crystal cut are not in it, so they, and every read value, are carried `confirm` until AMX staff verify them ([Open questions](questions.md)). This is a design-phase scaffold: the descriptor and these docs, with scenarios deferred. + +## The defining shape: completing the 17-ID MX pair + +AMX is FMX's high-throughput sibling: they share the 17-ID straight and the IVU21 undulator, and building AMX completes the NSLS-II MX pair. It is CORA's third MX deployment (after Diamond i03 and NSLS-II FMX) and a **pure-reuse** build: it coins no Family and graduates nothing. It reuses the MX vocabulary i03 and FMX established, the graduated `Goniometer` (the single-omega micro-goniometer), the `Camera` (the Eiger), the `Monochromator` (here a vertical DCM), the `Mirror` (the tandem-deflection and KB pairs), and the robot-as-Positioner pattern. It brings the three MX Methods (rotation `mx_data_collection`, `grid_scan`, `sample_exchange`) to their third consumer, which strengthens but does not coin them (Methods are coined on a conduct-path, not a sighting count). A few hardware differences from FMX show CORA's modelling generalizes: AMX uses a vertical (not horizontal) DCM, tandem-deflection mirrors (not a single horizontal focusing mirror), and has no CRL transfocator. + +## The beamline + +Along the beam, in order: + +- [Source](beamline.md): the shared IVU21 undulator, the front-end and photon shutters, and the high-heat-load slit, then the optics, the vertical double-crystal monochromator, the tandem-deflection and KB mirrors, the beam-conditioning attenuator, and the slits. +- [Sample](equipment/sample.md): the micro-goniometer, the automated EMBL robot, and the on-axis viewing. +- [Detector](equipment/detector.md): the Eiger area detector, the Mercury fluorescence detector for edge selection, the beamstop, and the beam-position and flux monitors. + +Cutting across all three: + +- [Controls](equipment/controls.md): the Zebra trigger box, the rotation motion, and the LSDC / mxtools acquisition seam. + +The cross-cutting reference view is the [Inventory](inventory.md). + +## Techniques + +[Techniques](techniques.md): the rotation data collection, grid scan, and autonomous sample exchange AMX runs, and why their Methods stay pending. + +## Governance + +[Governance](governance.md): who may act at AMX and the trust shape CORA applies; the autonomous robot loop is gated by a Clearance. + +## Model + +[Model](model.md): the developer's by-kind index into where each CORA aggregate's AMX content lives, and why AMX graduates nothing. diff --git a/docs/deployments/amx/inventory.md b/docs/deployments/amx/inventory.md new file mode 100644 index 0000000000..5faeec1027 --- /dev/null +++ b/docs/deployments/amx/inventory.md @@ -0,0 +1,55 @@ +# Inventory + +*The CORA Asset model for AMX: the device tree read from the profile collection and what still needs confirming.* + +This is the cross-cutting reference view of the [Source](beamline.md) walk and the [Sample](equipment/sample.md), [Detector](equipment/detector.md), and [Controls](equipment/controls.md) pages. It is generated-honest: authored from the same [`beamline.yaml`](https://github.com/xmap/cora/blob/main/deployments/amx/beamline.yaml) descriptor the Source page renders from. + +Devices bind to catalog [Families](../../catalog/families.md) and carry real EPICS PVs (verified against the `NSLS2/amx-profile-collection` `startup/*.py` device classes; the real MX acquisition logic lives in the `lsdc` / `mxtools` libraries, referenced not modelled). No vendor Model is bound: part numbers are not in the profile collection. AMX introduces **no new Family and graduates nothing**: as FMX's sibling it reuses the same MX vocabulary, including the graduated `Goniometer` and `Camera`. The robotic sample changer is one Positioner-presenting Asset (not a new Family, the i03 / 19-BM / FMX precedent, ROBOT-1); the beam-position monitors bind the loose, held `BeamPositionMonitor` family (DIAG-1); see [Model](model.md#deliberately-not-here-yet). + +## The Asset tree + +Root Asset `AMX` (`tier = Unit`, `facility_code = nsls2`); sub-systems nest below by `parent_id`. + +| Asset | Family | PV | What it is | +| --- | --- | --- | --- | +| `AMX` | (root) | `XF:17ID*` | bound to the NSLS-II Site (17-ID-1 branch) | +| `Undulator` | InsertionDevice | `SR:C17-ID:G1{IVU21:1}` | IVU21 undulator (shared with FMX) | +| `FrontEndShutter` | Shutter | (not in profile) | shared FOE photon shutter (PSS-1) | +| `PhotonShutter` | Shutter | (not in profile) | AMX photon shutter (PSS-1) | +| `FrontEndSlit` | Slit | `FE:C17A-OP{Slt}` | front-end white-beam slit | +| `HighHeatLoadSlit` | Slit | `XF:17IDA-OP:AMX{Slt:0}` | high-heat-load slit | +| `Monochromator` | Monochromator | `XF:17IDA-OP:AMX{Mono:DCM}` | vertical double-crystal mono (VDCM) | +| `TandemMirror` | Mirror | `XF:17IDA-OP:AMX{Mir:TDM}` | tandem-deflection harmonic-rejection mirrors | +| `KBMirrors` | Mirror | `XF:17IDB-OP:AMX{Mir:KBH/KBV}` | KB microfocus mirror pair | +| `BeamConditioningAttenuator` | Filter | `XF:17IDB-OP:AMX{Attn:BCU}` | BCU 4-foil attenuator | +| `ExperimentSlits` | Slit | `XF:17IDB-OP:AMX{Slt:2}` | experiment-hutch beam-defining slits | +| `EnergyAxis` | PseudoAxis | (computed) | master energy axis (LUT-coordinated) | +| `Goniometer` | Goniometer | `XF:17IDB-ES:AMX{Gon:1}` | single-omega MX micro-goniometer | +| `Robot` | (Positioner Asset) | `XF:17IDB-ES:AMX{EMBL}:` | EMBL robotic sample changer (ROBOT-1) | +| `SampleCamera` | Camera | `XF:17IDB-ES:AMX{Cam:7}` | on-axis sample-viewing camera | +| `AreaDetector` | Camera | (not in profile) | Eiger pixel detector (DET-1) | +| `FluorescenceDetector` | EnergyDispersiveSpectrometer | `XF:17IDB-ES:AMX{Det:Mer}` | Mercury XRF (edge selection) | +| `BeamStop` | BeamStop | `XF:17IDB-ES:AMX{BS:1}` | on-axis direct-beam stop | +| `BeamPositionMonitor` | BeamPositionMonitor (loose) | `XF:17IDA-BI:AMX{BPM:1}` | beam-position diagnostics | +| `FluxMonitor` | FluxMonitor | `XF:17IDB-BI:AMX{Keith:1}` | Keithley photocurrent monitor | +| `MotionController` | MotionController | (not in profile) | goniometer / optics controllers (DRIVE-1) | +| `Zebra` | TimingController | `XF:17IDB-ES:AMX{Zeb:1}` | FPGA trigger / position capture | + +Every family is in the catalog except the loose `BeamPositionMonitor` (held), and the `Robot`, a Positioner-presenting Asset with no Family (the i03 / 19-BM / FMX precedent). AMX graduates nothing: as FMX's sibling it reuses the MX vocabulary wholesale, completing the 17-ID MX pair. + +## Pending confirmations + +Every value below is read from the profile collection or inferred, awaiting the AMX team. Each is tracked by an [open question](questions.md). + +| Value to confirm | Applies to | Status | Tracking | +| --- | --- | --- | --- | +| Undulator identity, period, gap range; the FMX-shared straight | `Undulator` | `unknown-pending-confirmation` | (SRC-1) (TOPO-1) | +| PSS permit-leaf and shutter PVs | all enclosures | `unknown-pending-confirmation` | (PSS-1) | +| VDCM crystal cut, d-spacing, energy range | `Monochromator` | `unknown-pending-confirmation` | (DCM-1) | +| Mirror coatings, KB calibration | `TandemMirror` / `KBMirrors` | `unknown-pending-confirmation` | (KB-1) | +| Goniometer axis decomposition + centre-of-rotation calibration | `Goniometer` | `unknown-pending-confirmation` | (GONIO-1) | +| Robot model, the exchange workflow, the Subject custody lifecycle | `Robot` | `unknown-pending-confirmation` | (ROBOT-1) | +| Eiger model + beam centre (not in profile); fluorescence ROI map | `AreaDetector` / `FluorescenceDetector` | `unknown-pending-confirmation` | (DET-1) | +| Beam-position channel map and fold-vs-promote hold | `BeamPositionMonitor` | `unknown-pending-confirmation` | (DIAG-1) | +| Sample cryo-cooling (cryostream) modelling | `Goniometer` | `unknown-pending-confirmation` | (CRYO-1) | +| Motion-controller box models / firmware / IP | `MotionController` | `unknown-pending-confirmation` | (DRIVE-1) | diff --git a/docs/deployments/amx/model.md b/docs/deployments/amx/model.md new file mode 100644 index 0000000000..572adcab85 --- /dev/null +++ b/docs/deployments/amx/model.md @@ -0,0 +1,35 @@ +# Model + +*The developer's by-kind index: where each CORA aggregate's AMX content lives. It hosts no content of its own. Design-phase scaffold.* + +For the aggregate shapes see the [architecture model](../../architecture/model.md) and the per-BC +[modules](../../architecture/modules/index.md). + +| Aggregate (BC) | Where at AMX | +| --- | --- | +| Asset (Equipment) | [Inventory](inventory.md#the-asset-tree) (in this zone) | +| Computed / virtual axes (Equipment) | [Inventory](inventory.md#the-asset-tree) (EnergyAxis) | +| Capability, Method (Recipe) | [Techniques](techniques.md) | +| Enclosure (Enclosure) | [The beamline](equipment/index.md) (17-ID-A optics, 17-ID-B experiment) | +| Zone, Conduit, Policy (Trust); Actor (Access) | [Governance](governance.md) | +| Subject (the crystal custody thread) | [Governance](governance.md#the-autonomous-loop-under-custody) (deferred, ROBOT-1) | +| Procedure, Recipe, Caution, Supply, Run, Campaign, Dataset, Decision | deferred (design-phase; see below) | + +## What this deployment graduates: nothing (and that is the finding) + +AMX is a clean **pure-reuse** deployment, completing the NSLS-II MX pair as FMX's sibling. Its finding is that the MX vocabulary generalizes across a third independent beamline with no new modelling: the graduated `Goniometer` (single-omega micro-goniometer), the `Camera` (Eiger), the `Monochromator` (here vertical), the `Mirror` (tandem-deflection + KB), the `Filter` (BCU attenuator), the `BeamStop`, the `EnergyDispersiveSpectrometer` (Mercury), the `FluxMonitor` (Keithley), the `TimingController` (Zebra), and the loose `BeamPositionMonitor` all bind unchanged. The robot is one Positioner-presenting Asset, not a new Family (the i03 / 19-BM / FMX precedent). + +### FMX-vs-AMX differences + +The 17-ID pair is not identical, and the differences exercise the modelling: AMX uses a **vertical** DCM (FMX horizontal), **tandem-deflection** mirrors (FMX a horizontal focusing mirror), an **EMBL** robot, and has **no CRL transfocator** and **no on-axis backlight** in source. Each is a per-Asset settings or device-presence difference, not a Family split; both beamlines bind the same Families. + +## Deliberately not here yet + +This is a design-phase scaffold (descriptor + docs), mirroring FMX and the other NSLS-II beamlines. Left out on purpose: + +- **No catalog change.** AMX graduates nothing and coins nothing. The three MX Methods (`mx_data_collection`, `grid_scan`, `sample_exchange`) stay pending: AMX is their third consumer, which strengthens but does not coin them. Methods coin on a **conduct-path** (a deployment that runs them), not on a sighting count, which is why even at n=3 they defer (the `energy_scan` discipline; TECH-1). Coining them is a follow-on that needs an **MX conduct-path scenario** (event-sourced spine work), the genuine MX-graduation path. +- **The robot is not a Family.** The EMBL sample-changing robot is one Positioner-presenting Asset, gated by a Clearance, loading a `Subject`, vendor in a bound Model; not a new SampleChanger Family (the i03 / 19-BM precedent, ROBOT-1). +- **The autonomous loop and the Subject custody thread.** The unattended exchange loop is a Procedure over the spine threaded through the `Subject` aggregate; deferred with i03 / FMX (ROBOT-1). +- **Sample cryo-cooling.** The cold-gas cryostream is not exposed in the profile collection, so it is deferred (CRYO-1); it would bind `TemperatureController` (the i03 cryostream precedent) when its PV is supplied. +- **The area detector PV.** The Eiger is not exposed in the AMX profile collection; it is carried `Camera` confirm-only (DET-1). +- **Operations and experiment views, integration scenarios, vendor Models.** A runbook and registered Assets for a beamline CORA does not yet drive would be invention; they land when the design firms and the team confirms. The [2-BM Model page](../2-bm/model.md) shows the shape a fully-modelled deployment carries. diff --git a/docs/deployments/amx/questions.md b/docs/deployments/amx/questions.md new file mode 100644 index 0000000000..d34a475f9e --- /dev/null +++ b/docs/deployments/amx/questions.md @@ -0,0 +1,37 @@ +# Open questions + +*What CORA needs the AMX team to confirm. This model is reverse-engineered from public open source (the `NSLS2/amx-profile-collection` bluesky / ophyd startup files; the MX acquisition logic lives in the `lsdc` / `mxtools` libraries): the EPICS PVs are read from the `startup/*.py` device classes, but the goniometer / robot / detector vendor identities, the crystal cut, and physical positions are not. Each row is a fact the beamline team owns. It is a delete-on-answer queue.* + +Priorities: `Blocks-build`, `Blocks-go-live`, `Nice-to-have`. + +## Source and safety + +| ID | Priority | Question | CORA assumes | Resolves | +| --- | --- | --- | --- | --- | +| SRC-1 | Nice-to-have | The IVU21 undulator period, gap range, and gap-to-energy curve. The device (`SR:C17-ID:G1{IVU21:1}`) is in source; the parameters are not. | An in-vacuum undulator on the 3 GeV ring, identity-only. | The InsertionDevice settings. | +| TOPO-1 | Nice-to-have | AMX (17-ID-1) shares the IVU21 undulator and the 17-ID straight with FMX (17-ID-2, which uses IVU21:2). Is the straight canted (two beams), and is one root Unit per branch the right model? | One root Unit feeding the 17-ID-1 branch (the FMX / CSX canted precedent); FMX is the sibling branch. | The sector topology and the FMX relationship. | +| PSS-1 | Blocks-go-live | The PSS search-and-secure permit-leaf PVs and the front-end / photon shutter PVs (not in the profile collection; the front end is shared with FMX). | The permit signal is a confirm note, not a guessed PV. | The Enclosure permit signals. | + +## Optics + +| ID | Priority | Question | CORA assumes | Resolves | +| --- | --- | --- | --- | --- | +| DCM-1 | Nice-to-have | The vertical DCM crystal cut, d-spacing, and energy range. The monochromator (`Mono:DCM`) and its axes are in source. | One Monochromator Asset, crystal settings blank. | The Monochromator settings. | +| KB-1 | Nice-to-have | The tandem-deflection and KB mirror coatings and calibration. The mirrors (`Mir:TDM`, `Mir:KBH/KBV`) are in source. | The mirror internals are per-Asset settings on the existing Mirror Family. | The focusing-optic settings. | + +## Sample and detectors + +| ID | Priority | Question | CORA assumes | Resolves | +| --- | --- | --- | --- | --- | +| GONIO-1 | Blocks-go-live | The goniometer axis decomposition (single omega + GX / GY / GZ centring + PY / PZ pin fine) and the centre-of-rotation calibration. The stack (`Gon:1`) is in source. | A `Goniometer` Asset (catalog Family, graduated on the i03 Smargon); per-axis decomposition to confirm. | The goniometer model. | +| ROBOT-1 | Blocks-go-live | The EMBL sample-changing robot model, the dewar / puck layout, the exchange workflow, and the Subject custody lifecycle. The robot (`EMBL`) and Governor are in source. | One Positioner-presenting `Robot` Asset (not a new Family); the autonomous loop is a Procedure + a Subject custody thread, gated by a Clearance. | The robot model and the autonomous-loop modelling. | +| DET-1 | Blocks-go-live | The Eiger model and beam centre (not exposed in the profile collection), and the Mercury fluorescence detector element count and ROI map. | An Eiger (`Camera`, PV pending) and a Mercury (`EnergyDispersiveSpectrometer`); model / ROIs to confirm. | The detector roster. | +| DIAG-1 | Nice-to-have | The beam-position channel map (the four-quadrant BPMs) and the `BeamPositionMonitor` sensor fold-vs-promote hold. | Read-only beam-position (loose `BeamPositionMonitor`) probes; channel map blank. | The BeamPositionMonitor bindings. | +| CRYO-1 | Nice-to-have | The sample cryo-cooling (cold-gas cryostream), not exposed in the profile collection. | Sample cooling deferred; a `TemperatureController` when its PV is supplied. | The sample-environment Assets. | + +## Controls and technique scope + +| ID | Priority | Question | CORA assumes | Resolves | +| --- | --- | --- | --- | --- | +| DRIVE-1 | Blocks-go-live | The motion-controller box models, firmware, and IPs (the goniometer vector controller is a PowerBrick; the profile's vector PV is misconfigured to the FMX prefix). | Family bound (MotionController), specifics blank. | The MotionController Models. | +| TECH-1 | Blocks-go-live | Do the MX Methods (rotation `mx_data_collection`, `grid_scan`, `sample_exchange`) enter CORA's catalog, or stay pending? AMX is the third consumer (after i03, FMX). | The three Methods reused pending; coining awaits a conduct-path (an MX integration scenario), not the sighting count (the energy_scan discipline). | The MX Method scope. | diff --git a/docs/deployments/amx/techniques.md b/docs/deployments/amx/techniques.md new file mode 100644 index 0000000000..f33f646259 --- /dev/null +++ b/docs/deployments/amx/techniques.md @@ -0,0 +1,18 @@ +# Techniques + +*What CORA would run at AMX: macromolecular crystallography, each a [Catalog](../../catalog/methods.md) Method. AMX is CORA's third MX beamline (after Diamond i03 and NSLS-II FMX) and follows the same Method-deferral discipline.* + +AMX's science is high-throughput protein crystallography: rotate a cryo-cooled crystal in a focused microbeam and read the diffraction on the Eiger, locate crystals with fast grid scans, and exchange samples with an automated robot. These are the MX Methods i03 and FMX brought to CORA; AMX is their third consumer. The Methods below render unlinked and stay pending until a conduct-path coins them (TECH-1). + +| Technique | Beam | Detector | Status in CORA | +| --- | --- | --- | --- | +| Rotation (oscillation) data collection | monochromatic, microfocused | `AreaDetector` (Eiger, Detector Role) | the `mx_data_collection` Method, pending; 3rd consumer (TECH-1) | +| Grid scan / sample location | monochromatic, microfocused | `AreaDetector` + `SampleCamera` | the `grid_scan` Method over the Zebra-triggered goniometer raster, pending; 3rd consumer (TECH-1) | +| Autonomous sample exchange | n/a | n/a | the `sample_exchange` Method: a Procedure over the spine + a Subject custody thread, pending; 3rd consumer (ROBOT-1) | +| Anomalous element ID (fluorescence) | monochromatic, energy-swept | `FluorescenceDetector` (Mercury, Sensor) | the edge scan picks the energy for SAD / MAD; reuses the energy axis (DET-1) | + +## Why the Methods stay pending + +AMX reuses the three MX Methods i03 and FMX left pending, and is the third consumer of each. This is the moment the consumer count is strongest, so it is worth being precise about why they still do not graduate: unlike a device *Family* (which a second sighting promotes on a mechanical rule-of-three, as ISS did for the emission spectrometer), a *Method* is coined on a **conduct-path**, when a deployment actually runs it (an integration scenario or operational pilot, the way `tomography` and `xpcs` were coined). i03, FMX, and AMX are all descriptor-only scaffolds with no conduct-path, so three consumers strengthen the case but do not coin the Methods, exactly the discipline that keeps `energy_scan` deferred across its consumers. The device Roles already exist (the graduated `Goniometer` presents Positioner, the Eiger presents Detector); what is pending is the recipe. + +The genuine MX graduation, coining these Methods, is a follow-on that needs an MX conduct-path scenario (the event-sourced spine work), not another descriptor scaffold. The autonomous sample-exchange loop is the non-obvious modelling: an unattended Procedure over the spine, threaded through the `Subject` custody lifecycle and gated by a Clearance (ROBOT-1). diff --git a/docs/deployments/index.md b/docs/deployments/index.md index fcf4141f8b..a6ddee71ea 100644 --- a/docs/deployments/index.md +++ b/docs/deployments/index.md @@ -65,6 +65,7 @@ The fourth Site CORA models. Like the Diamond exercise, its beamlines are revers | [XFM](xfm/index.md) | Reverse-engineered | scanning X-ray fluorescence microprobe (raster XRF mapping on the Xspress3 + Maia detectors, bending magnet), 4-BM; CORA's 2nd scanning-XRF after 2-ID; modelled from public beamline config | | [LIX](lix/index.md) | Reverse-engineered | life-science solution scattering (bio-SAXS/WAXS, in-line SEC-SAXS) and scanning-microbeam mapping, 16-ID; the fleet's first solution beamline and fluidic sample-delivery chain; modelled from public beamline config | | [HEX](hex/index.md) | Reverse-engineered | high-energy engineering X-ray scattering (imaging/tomography + energy-dispersive and powder diffraction on a superconducting wiggler, white 30-250 keV / mono 30-200 keV), 27-ID; the fleet's first true high-energy hard X-ray beamline; modelled from public beamline config | +| [AMX](amx/index.md) | Reverse-engineered | highly automated macromolecular crystallography (rotation MX on a single-omega goniometer + Eiger, EMBL robot sample exchange), 17-ID-1; FMX's sibling, CORA's 3rd MX; modelled from public beamline config | ## [SLAC](slac/index.md) diff --git a/mkdocs.yml b/mkdocs.yml index abeb0273ff..3cbbed5ef2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -602,6 +602,19 @@ nav: - Techniques: deployments/hex/techniques.md - Governance: deployments/hex/governance.md - Model: deployments/hex/model.md + - AMX: + - deployments/amx/index.md + - Open questions: deployments/amx/questions.md + - The beamline: + - deployments/amx/equipment/index.md + - Source: deployments/amx/beamline.md + - Sample: deployments/amx/equipment/sample.md + - Detector: deployments/amx/equipment/detector.md + - Controls: deployments/amx/equipment/controls.md + - Inventory: deployments/amx/inventory.md + - Techniques: deployments/amx/techniques.md + - Governance: deployments/amx/governance.md + - Model: deployments/amx/model.md - SLAC: - deployments/slac/index.md - LCLS-MFX: