daq:added http error handling for automation

This commit is contained in:
2025-11-25 18:01:07 +01:00
parent 04cf0447ef
commit bd84f2368f
2 changed files with 46 additions and 21 deletions
+20 -19
View File
@@ -49,9 +49,22 @@ class TransformationInvalidException(Exception):
class LoopCenteringFailed(Exception):
logger.error(f"Loop centering failed", extra={"exception:" : Exception})
pass
def __init__(self, message="Loop Centering did not detect a sample"):
super().__init__(message)
self.message = message
logger.error(f"{message}", extra={"exception:" : Exception})
def __str__(self):
return self.message
class MountingFailed(Exception):
def __init__(self, message="A sample was not mounted"):
super().__init__(message)
self.message = message
logger.error(f"{message}", extra={"exception:" : Exception})
def __str__(self):
return self.message
class AareDAQ:
def __init__(self, cfg: BeamlineConfig, bl: MXBeamline):
@@ -359,7 +372,7 @@ class AareDAQ:
logger.error("No sample was detected in gripper")
self.__devs.tell.dry(wait=True)
self.__aare.sample_failed(target, failed_comment = "No sample was detected in gripper")
raise Exception("No sample was detected in gripper, drying gripper")
raise MountingFailed(f"No sample was detected in gripper, drying gripper {target.sample_name} {target.location} {target.pin}")
elif value == "dry":
logger.info("Robot is drying")
else:
@@ -370,7 +383,7 @@ class AareDAQ:
if not mounted:
logger.error(f"Failed to mount target: {target.db_id} {target.location} {target.pin}")
self.__aare.sample_failed(target, failed_comment = "No sample was mounted")
raise Exception("No sample was mounted")
raise MountingFailed(f"No Sample detected on smart magent: {target.sample_name} {target.location} {target.pin}")
if target is not None:
self.__aare.sample_mounted(target)
@@ -475,11 +488,6 @@ class AareDAQ:
grid.file_prefix = f"{old_prefix}_{grid.omega_deg}deg"
grid.omega_deg = geom.omega_deg
res1 = self.__raster(grid)
self.__devs.reflector_up = True
time.sleep(0.1)
self.save_screenshot_db(sample.db_id, f"post_raster_{grid.omega_deg}deg")
time.sleep(0.1)
self.__devs.reflector_up = False
grid.omega_deg += 90
self.__devs.aerotech.move(grid.omega_deg, wait=True)
@@ -494,11 +502,6 @@ class AareDAQ:
# self.__devs.smargon.target = geom.translate_smargon(offset)
grid.smargon_top_left = geom.translate_smargon(offset)
res2 = self.__raster(grid)
self.__devs.reflector_up = True
time.sleep(0.1)
self.save_screenshot_db(sample.db_id, f"post_raster_{grid.omega_deg}deg")
time.sleep(0.1)
self.__devs.reflector_up = False
return CompletedRasterGrid(r=[res1, res2])
else:
return None
@@ -590,6 +593,9 @@ class AareDAQ:
self.__devs.smargon.target = save_smargon_position
if self.sample is not None and self.sample.db_id is not None and result is not None:
self.__devs.reflector_up = True
time.sleep(0.1)
self.save_screenshot_db(self.sample.db_id, f"post_raster_{r.omega_deg}deg")
try:
self.__aare.ingest_gridscan(sample = self.sample, raster_result =result,
raster_request = r, geom = self.sample_geometry,
@@ -607,11 +613,6 @@ class AareDAQ:
else:
raster_result = self.__raster(r)
result = CompletedRasterGrid(r=[raster_result])
self.__devs.reflector_up = True
time.sleep(0.1)
if self.sample is not None and self.sample.db_id is not None:
self.save_screenshot_db(self.sample.db_id, f"post_raster_{r.omega_deg}deg")
time.sleep(0.1)
self.__set_state(BeamlineStateEnum.SampleAlignment)
self.__cfg.state_busy = False
return result
+26 -2
View File
@@ -25,7 +25,7 @@ from urllib3.exceptions import InsecureRequestWarning
from aaredaq import auth
from aaredaqlib.beamline import mx_beamline
from aaredaq.config import BeamlineConfig
from aaredaq.daq import AareDAQ
from aaredaq.daq import AareDAQ, LoopCenteringFailed, TransformationInvalidException, MountingFailed
from aaredaq.camera_stat_thread import start_image_stats_receiver, stop_image_stats_receiver
@@ -395,9 +395,33 @@ async def rotation(val: RotationScanRequest, token: str = Depends(oauth2_scheme)
@app.post("/scan/auto")
async def auto(s: SampleShortInfo, token: str = Depends(oauth2_scheme)):
auth.check_jwt_rw(cfg, auth.parse_token(token))
runtime = daq.measure(s)
try:
runtime = daq.measure(s)
return f"{runtime:0.3f}"
except LoopCenteringFailed(Exception) as e:
raise HTTPException(
status_code=api_status.HTTP_404_NOT_FOUND,
detail=f"Loop centering failed: {e}",
)
except TransformationInvalidException(Exception) as e:
raise HTTPException(
status_code=api_status.HTTP_400_BAD_REQUEST,
detail=f"Transformation invalid: {e}",
)
except MountingFailed(Exception) as e:
raise HTTPException(
status_code=api_status.HTTP_404_NOT_FOUND,
detail=f"Mounting failed: {e}",
)
except Exception as e:
logger.error(f"Exception in auto: {e}")
raise HTTPException(
status_code=api_status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"error {e}"
)
return f"{runtime:0.3f}"
@app.post("/scan/smart_params")
async def set_smart_params(p: SimpleScanParameters, token: str = Depends(oauth2_scheme)) -> str:
token_data = auth.parse_token(token)