Source code for mxcubecore.HardwareObjects.MAXIV.MicroMAX.beamline_actions

import logging

from tango import DeviceProxy

from mxcubecore import HardwareRepository as HWR
from mxcubecore.utils.units import kev_to_ev

log = logging.getLogger("user_level_log")


[docs]class PrepareOpenHutch: """ Prepare beamline for opening the hutch door. - close safety shutter - close detector cover - close fast shutter - move detector to a safe position - put MD3 into 'Transfer' phase in case of OSC delivery mode - move MD3's `BeamstopPosition` and `CapillaryPosition` to `PARK` in case of HVE - if jungfrau is used, take pedestal """ def __call__(self): try: # Ensure laser is stopped before opening the hutch laser = HWR.beamline.get_object_by_role("laser") laser.disarm() collect = HWR.beamline.collect diffractometer = HWR.beamline.diffractometer detector = HWR.beamline.detector log.info("Preparing experimental hutch for door opening.") collect.close_fast_shutter() collect.close_safety_shutter() collect.close_detector_cover() diffractometer.wait_device_ready() if HWR.beamline.is_hve_sample_delivery(): # This is 'equivalent' of Transfer phase for HVE experiments log.info("Setting diffractometer to 'equivalent' of Transfer phase.") diffractometer.channel_dict["BeamstopPosition"].set_value("PARK") diffractometer.channel_dict["CapillaryPosition"].set_value("PARK") else: log.info("Setting diffractometer to Transfer phase.") diffractometer.set_phase("Transfer") log.info("Moving detector to safe position.") collect.move_detector_to_safe_position() if detector.get_property("model") == "JUNGFRAU": log.info("Collecting Jungfrau pedestal.") detector.pedestal() except Exception as ex: # Explicitly add raised exception into the log message, # so that it is shown to the user in the beamline action UI log. log.exception("Error preparing to open hutch.\nError was: '%s'", str(ex)) # noqa: TRY401
class CheckBeam: def __call__(self): """ Check beam stability """ xbpms = { "DM3": DeviceProxy("b312a-o06/dia/xbpm-01"), "DM4": DeviceProxy("b312a-e01/dia/xbpm-01"), "BCU XBPM1": DeviceProxy("b312a-e04/dia/xbpm-01"), "BCU XBPM2": DeviceProxy("b312a-e04/dia/xbpm-02"), } energy = kev_to_ev(HWR.beamline.energy.get_value()) transmission = HWR.beamline.transmission.get_value() for name, xbpm in xbpms.items(): total_current = xbpm.S flux = total_current * ( -0.534515 * energy**4 - 43197.6 * energy**3 + 5.13449e09 * energy**2 - 4.39169e13 * energy + 1.14591e17 ) log.info( f"XBPM: {name}, total current: {total_current * 1e6:.2f} uA, " f"estimated flux at sample position: {flux:.2e} ph/s" ) if "BCU" in name: full_flux = flux * 100.0 / transmission log.info( f"Current transmission: {transmission:.2f}%, " f"estimated full flux at sample position: {full_flux:.2e} ph/s" ) class MeasureFlux: def __call__(self): """ calculate flux at sample position """ flux_at_sample = HWR.beamline.collect.get_instant_flux() log.info("Flux at sample position is %.2e ph/s", flux_at_sample) class SaveMD3Position: def __call__(self): HWR.beamline.diffractometer.save_centered_position() class MoveToMD3SavedPosition: def __call__(self): HWR.beamline.diffractometer.goto_centered_position() class EmptyMount: def __call__(self): isara = HWR.beamline.sample_changer log.info("Performing empty mount recovery sequence.") isara.execute_command("Reset") log.info("Recovery sequence completed.")