14. Pass on_unstage to DetectorArmLogic.disarm#

Date: 2026-04-15

Status#

Accepted

Context#

StandardDetector._disarm_and_stop() is called from both stage() (to reset the detector before a new scan) and unstage() (to clean up after a scan ends). Both call sites previously invoked disarm() identically, giving implementations no way to distinguish between them.

This matters when a beamline embeds shutter logic inside a detector’s arm logic. For example, a detector may need a shutter to stay open between exposures during a scan, but the shutter must always be closed at the end. Closing the shutter inside disarm() without this context would close it at stage() too — potentially closing a shutter that should remain open.

Decision#

DetectorArmLogic.disarm now accepts on_unstage: bool = False. The flag is False when called from stage() (setup before a scan) and True when called from unstage() (teardown after a scan). All existing implementations default to False and ignore the flag, preserving backward compatibility.

Consequences#

Implementations that need end-of-scan cleanup (such as closing a shutter) can branch on on_unstage. Existing DetectorArmLogic subclasses must be updated to add the on_unstage: bool parameter; the change is mechanical and the flag can be ignored by implementations that do not need it.