Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 26 additions & 36 deletions mxcubecore/HardwareObjects/EMBLFlexHarvester.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,9 @@

import logging
import time
from typing import (
Any,
List,
)
from typing import Any, List

import gevent
from gevent import Timeout, sleep, spawn

from mxcubecore import HardwareRepository as HWR
from mxcubecore.HardwareObjects.EMBLFlexHCD import EMBLFlexHCD
Expand All @@ -48,11 +45,9 @@


class EMBLFlexHarvester(EMBLFlexHCD):
"""EMBLFlexHarvester is the Hardware Object interface for the EMBL Flex Sample Changer
It inherits from EMBLFlexHCD and implements the Harvester interface.
"""
"""Implement the MBL Harvester interface as Flex sample changer" """

__TYPE__ = "Flex Sample Changer"
__TYPE__ = "EMBL Harvester Sample Changer"

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand All @@ -66,7 +61,7 @@ def init(self):
self._loaded_sample = (-1, -1, -1)
self._harvester_hwo = self.get_object_by_role("harvester")

EMBLFlexHCD.init(self)
super().init()

def get_room_temperature_mode(self) -> bool:
"""Get the Harvester Room Temperature Mode"""
Expand Down Expand Up @@ -96,9 +91,9 @@ def get_sample_list(self) -> List[Any]:
ha_sample_lists = self._harvester_hwo.get_crystal_uuids()
ha_sample_names = self._harvester_hwo.get_sample_names()
ha_sample_states = self._harvester_hwo.get_samples_state()
except Exception as e:
except Exception as err:
self.user_log.error(
"Failed retrieving sample metadata from Harvester: %s", e
f"Failed retrieving sample metadata from Harvester: {err}"
)
return present_sample_list

Expand Down Expand Up @@ -173,7 +168,7 @@ def load_a_pin_for_calibration(self):
self.prepare_load()
self.enable_power()

load_task = gevent.spawn(
load_task = spawn(
self._execute_cmd_exporter,
"loadSampleFromHarvester",
self.pin_cleaning,
Expand All @@ -182,40 +177,33 @@ def load_a_pin_for_calibration(self):

self._wait_busy(30)
err_msg = "Timeout while waiting to sample to be loaded"
with gevent.Timeout(600, RuntimeError(err_msg)):
with Timeout(600, RuntimeError(err_msg)):
while not load_task.ready():
logging.getLogger("user_level_log").info("wait loading task")
gevent.sleep(2)
sleep(2)

with gevent.Timeout(600, RuntimeError(err_msg)):
with Timeout(600, RuntimeError(err_msg)):
while True:
logging.getLogger("user_level_log").info("Wait Robot Safe position")
is_safe = self._execute_cmd_exporter(
"getRobotIsSafe", attribute=True
)
if is_safe:
break
gevent.sleep(2)
sleep(2)
return True
except RuntimeError:
return False

def start_harvester_centring(self):
logging.getLogger("user_level_log").info("Start Auto Harvesting Centring")
try:
dm = HWR.beamline.diffractometer

logging.getLogger("user_level_log").info("Start Auto Harvesting Centring")

computed_offset = HWR.beamline.harvester.get_offsets_for_sample_centring()
dm.start_harvester_centring(computed_offset)
HWR.beamline.sample_view.start_harvester_centring()

except Exception as exc:
logging.getLogger("user_level_log").exception(
"Could not center sample, skipping"
)
raise QueueExecutionException(
"Could not center sample, skipping", self
) from exc
msg = "Could not center sample, skipping"
logging.getLogger("user_level_log").exception(msg)
raise QueueExecutionException(msg, self) from exc

def _set_loaded_sample_and_prepare(self, loaded_sample_tup, previous_sample_tup):
res = False
Expand All @@ -232,7 +220,8 @@ def _set_loaded_sample_and_prepare(self, loaded_sample_tup, previous_sample_tup)
self.queue_harvest_next_sample(loaded_sample.get_address())

# we expect CENTRING_METHOD to be None
# NB: move this call to base_queue_entry mount_sample and add Harvester Centring METHOD
# NB: move this call to base_queue_entry mount_sample and
# add Harvester Centring METHOD
HWR.beamline.queue_manager.centring_method = CENTRING_METHOD.NONE
self.start_harvester_centring()

Expand Down Expand Up @@ -263,7 +252,8 @@ def _do_load(self, sample=None) -> bool:
sample.get_basket_no(),
sample.get_vial_no(),
)
# Flex/Exporter Does not know the loaded sample location we keep track of it ourselfs
# Flex/Exporter does not know the loaded sample location,
# keep track locally.
self._loaded_sample = loaded_sample
return self._set_loaded_sample_and_prepare(loaded_sample, previous_sample)

Expand All @@ -272,7 +262,7 @@ def _perform_loading_sequence(self, sample_uuid) -> bool:
logging.getLogger("user_level_log").info(
"Start loading from harvester SAMPLE_UUID %s", sample_uuid
)
load_task = gevent.spawn(
load_task = spawn(
self._execute_cmd_exporter,
"loadSampleFromHarvester",
sample_uuid,
Expand All @@ -296,13 +286,13 @@ def _perform_loading_sequence(self, sample_uuid) -> bool:
# Wait for sample to be loaded
err_msg = "Timeout while waiting to sample to be loaded"
try:
with gevent.Timeout(600, RuntimeError(err_msg)):
with Timeout(600, RuntimeError(err_msg)):
while not load_task.ready():
logging.getLogger("user_level_log").info("Wait loading task")
loaded_sample = self._hw_get_mounted_crystal_id()
if loaded_sample == sample_uuid:
break
gevent.sleep(2)
sleep(2)
except RuntimeError:
logging.getLogger("user_level_log").error(err_msg)
return False
Expand All @@ -314,14 +304,14 @@ def _finalize_loading_sequence(self) -> bool:
# Wait for robot to be in safe state
err_msg = "Timeout while waiting for robot to be in safe state"
try:
with gevent.Timeout(600, RuntimeError(err_msg)):
with Timeout(600, RuntimeError(err_msg)):
while True:
is_safe = self._execute_cmd_exporter(
"getRobotIsSafe", attribute=True
)
if is_safe:
break
gevent.sleep(2)
sleep(2)
except RuntimeError:
logging.getLogger("user_level_log").error(err_msg)
return False
Expand Down
Loading
Loading