Skip to content

feat(deployments): NSLS-II SST (soft+tender spectroscopy); graduate ElectronAnalyzer#370

Closed
xmap wants to merge 2 commits into
mainfrom
sst-deployment
Closed

feat(deployments): NSLS-II SST (soft+tender spectroscopy); graduate ElectronAnalyzer#370
xmap wants to merge 2 commits into
mainfrom
sst-deployment

Conversation

@xmap

@xmap xmap commented Jun 25, 2026

Copy link
Copy Markdown
Owner

What

NSLS-II SST (Spectroscopy Soft and Tender, sector 7-ID), CORA's fourth soft X-ray deployment and its first config-driven extraction (devices.toml prefix + the sst-base library class grammar, not startup/*.py). Scoped to spine + the SST-1 soft/RSoXS branch + the SST-2 tender/HAXPES branch; the UCAL TES microcalorimeter and VPPEM microscope are deferred.

Consolidation + graduation

  • Graduates ElectronAnalyzer — the HAXPES Scienta SES is the 2nd hemispherical electron analyzer after ESM, earning the rule-of-three. ESM's references swept loose→graduated; removed from _ALLOWED_LOOSE_FAMILIES. Presents Detector, distinct from photon detectors.
  • Reuses three graduated families: GratingMonochromator (soft PGM, 4th), Monochromator (tender Si DCM), Manipulator (RSoXS + HAXPES, 3rd/4th). No new family.
  • RSoXS reuses resonant_scattering; HAXPES adds pending xray_photoelectron_spectroscopy (distinct from ESM's angle_resolved_photoemission).

Anti-fabrication (config-driven source)

A dedicated verified-extraction workflow cited every PV to a source line and flagged the one unresolvable item: the full multi-channel I400 isn't instantiated, so only the single :IC1_MON channel is modelled (carried confirm). The config-driven traps — the soft PGM's empty toml prefix (real base XF:07ID1-OP{Mono:PGM1 hardcoded in sst-base) and the tender DCM XF:07ID6-OP{Mono:DCM1 — are read from the library, not invented.

Verification

282 deployment guards green (graduation consistent); mkdocs build --strict; ruff full-tree clean. Adversarial pre-merge audit follows.

🤖 Generated with Claude Code

…lectronAnalyzer

SST (Spectroscopy Soft and Tender, sector 7-ID) is the eleventh NSLS-II beamline and
CORA's fourth soft X-ray deployment. Reverse-engineered from the config-driven SST
profile collections (NSLS2/sst-rsoxs + sst-haxpes) and the NSLS-II-SST/sst-base library;
every PV verified against source via a dedicated extraction pass, no vendor Models.

SST is CORA's first config-driven extraction (devices.toml prefix + sst-base class
suffix grammar, not startup/*.py), modelled as spine + the SST-1 soft / RSoXS branch +
the SST-2 tender / HAXPES branch (UCAL TES microcalorimeter + VPPEM deferred):
- GRADUATES ElectronAnalyzer into the catalog: the HAXPES Scienta SES is the 2nd
  hemispherical electron analyzer after ESM, earning the rule-of-three. ESM's references
  are swept loose -> graduated; removed from _ALLOWED_LOOSE_FAMILIES. Presents Detector,
  distinct from the photon detectors. naming-r3 done.
- REUSES three graduated families: GratingMonochromator (soft PGM, 4th), Monochromator
  (tender Si DCM), Manipulator (RSoXS + HAXPES UHV manipulators, 3rd/4th). No new family.
- RSoXS reuses resonant_scattering; HAXPES adds a new pending method
  xray_photoelectron_spectroscopy (distinct from ESM's angle_resolved_photoemission).

Anti-fabrication: a verified-extraction workflow cited every PV to source and flagged
the one unresolvable item (the full multi-channel I400 is not instantiated; only the
single :IC1_MON channel is modelled, carried confirm). The config-driven traps (empty
soft-PGM toml prefix -> hardcoded XF:07ID1-OP{Mono:PGM1; tender DCM XF:07ID6-OP{Mono:DCM1)
are read from the sst-base library, not invented.

Verified: 282 deployment guards green (graduation consistent: ElectronAnalyzer in catalog,
ESM + SST bind it, removed from loose allowlist); mkdocs build --strict; ruff full-tree clean.

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

Copy link
Copy Markdown

Coverage report

This PR does not seem to contain any modification to coverable code.

…x_ray naming

Pre-merge audit (GO) follow-ups:
- deployments/esm/beamline.yaml + equipment/detector.md: finish the loose -> graduated
  sweep (two residual sentences still called ElectronAnalyzer "NEW loose" / "held loose
  at n=1" on the same lines that say graduated).
- rename the new Method x_ray_photoelectron_spectroscopy (was xray_...) to match the
  sibling inelastic_x_ray_scattering spelling.
- SST descriptor: rename the DCM axis key crystal_x -> goni_lateral (the profile labels
  that PV the DCM goniometer lateral stage, not a crystal-x; the PV is unchanged).

Verified: 282 deployment guards green; mkdocs build --strict; ruff full-tree clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@xmap xmap enabled auto-merge (squash) June 25, 2026 19:51
@xmap xmap disabled auto-merge June 25, 2026 19:55
@xmap

xmap commented Jun 25, 2026

Copy link
Copy Markdown
Owner Author

Superseded by #372, which landed the NSLS-II SST deployment first and more completely (multi-endstation: RSoXS + NEXAFS + HAXPES). This PR is a duplicate, and it additionally GRADUATES ElectronAnalyzer whereas #372 deliberately HELD it at n=2 as a recorded graduation candidate. Closing to align with main and avoid overriding that hold; the ElectronAnalyzer graduation can be a separate gate-reviewed PR if the owner decides (like CRL-1). Branch left in place pending cleanup decision.

@xmap xmap closed this Jun 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant