From dddb25e2c9c97bb15e13a19c65366ad0cdddf2f9 Mon Sep 17 00:00:00 2001 From: Daniel Bolin Date: Tue, 24 Oct 2023 15:07:17 -0400 Subject: [PATCH] Fix azimuth bugs --- containers/azimuth/context/main.py | 8 +++++--- src/algorithm/report.py | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/containers/azimuth/context/main.py b/containers/azimuth/context/main.py index 9474b94..636208a 100644 --- a/containers/azimuth/context/main.py +++ b/containers/azimuth/context/main.py @@ -1,7 +1,7 @@ import logging import subprocess -from pathlib import Path import typing as t +from pathlib import Path import anndata import pandas @@ -72,19 +72,21 @@ def copy_annotations( def run_azimuth_scripts(self, matrix_path: Path, reference_data: Path): script_command = ["Rscript", "/run_azimuth.R", matrix_path, reference_data] - subprocess.run(script_command, capture_output=True, check=True) + subprocess.run(script_command, capture_output=True, check=True, text=True) return "./result.h5ad" def find_reference_data(self, organ: str, dir: Path): def is_reference_data_candidate(path: Path): return path.is_dir() and organ.lower() in path.name.lower() - return self._find_in_dir( + subdir = self._find_in_dir( dir, is_reference_data_candidate, f"Cannot find reference data for organ '{organ}'", f"Multiple reference data candidates for organ '{organ}'", ) + # idx.annoy and ref.Rds is always located inside an 'azimuth' subdirectory + return subdir / "azimuth" def _find_in_dir( self, dir: Path, cond: t.Callable[[Path], bool], error_msg: str, warn_msg: str diff --git a/src/algorithm/report.py b/src/algorithm/report.py index da1765d..20ece2c 100644 --- a/src/algorithm/report.py +++ b/src/algorithm/report.py @@ -3,6 +3,7 @@ import io import json import pprint +import subprocess import traceback import typing as t from pathlib import Path @@ -67,6 +68,11 @@ def format_cause(self, result: dict): if isinstance(cause, Exception): result["cause"] = repr(cause) result["traceback"] = traceback.format_tb(cause.__traceback__) + if isinstance(cause, subprocess.CalledProcessError): + # stdout and stderr does not show in the repr of a CalledProcessError + # Add them to the result here instead to give more context on errors + result["stdout"] = cause.stdout + result["stderr"] = cause.stderr else: stream = io.StringIO() pprint.pprint(cause, stream=stream)