From 2e2a7c0dc0f2b0a2950e3dc89de86a1588e11429 Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Tue, 14 Jan 2025 14:44:27 +0000 Subject: [PATCH 1/2] Duplicated '_midpoint' function from 'murfey.client.contexts.tomo' to preserve client-server independence --- src/murfey/server/__init__.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/murfey/server/__init__.py b/src/murfey/server/__init__.py index 823df3063..16dfce9ce 100644 --- a/src/murfey/server/__init__.py +++ b/src/murfey/server/__init__.py @@ -48,7 +48,6 @@ import murfey.server.prometheus as prom import murfey.server.websocket import murfey.util.db as db -from murfey.client.contexts.tomo import _midpoint from murfey.server.murfey_db import url # murfey_db from murfey.util import LogFilter from murfey.util.config import ( @@ -165,6 +164,24 @@ def _mc_path(mov_path: Path) -> str: return [_mc_path(Path(r.movie_path)) for r in results] +def _midpoint(angles: List[float]) -> int: + """ + Duplicate of the function in 'murfey.client.contexts.tomo', so as to preserve + client-server independence. + """ + if not angles: + return 0 + if len(angles) <= 2: + return round(angles[0]) + sorted_angles = sorted(angles) + return round( + sorted_angles[len(sorted_angles) // 2] + if sorted_angles[len(sorted_angles) // 2] + and sorted_angles[len(sorted_angles) // 2 + 1] + else 0 + ) + + def get_job_ids(tilt_series_id: int, appid: int) -> JobIDs: results = murfey_db.exec( select( From 69888076b841c3ad1ba9cbd294a54c2eda9cd003 Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Tue, 14 Jan 2025 15:20:56 +0000 Subject: [PATCH 2/2] Moved 'midpoint' function to 'murfey.util.tomo' to function duplication --- src/murfey/client/contexts/tomo.py | 17 ++--------------- src/murfey/server/__init__.py | 21 ++------------------- src/murfey/server/api/__init__.py | 4 ++-- src/murfey/util/tomo.py | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 36 deletions(-) create mode 100644 src/murfey/util/tomo.py diff --git a/src/murfey/client/contexts/tomo.py b/src/murfey/client/contexts/tomo.py index e9bcd2aaf..f09dad951 100644 --- a/src/murfey/client/contexts/tomo.py +++ b/src/murfey/client/contexts/tomo.py @@ -21,6 +21,7 @@ ) from murfey.util import authorised_requests, capture_post, get_machine_config_client from murfey.util.mdoc import get_block, get_global_data, get_num_blocks +from murfey.util.tomo import midpoint logger = logging.getLogger("murfey.client.contexts.tomo") @@ -64,20 +65,6 @@ def _construct_tilt_series_name(file_path: Path) -> str: return "_".join(split_name[:-5]) -def _midpoint(angles: List[float]) -> int: - if not angles: - return 0 - if len(angles) <= 2: - return round(angles[0]) - sorted_angles = sorted(angles) - return round( - sorted_angles[len(sorted_angles) // 2] - if sorted_angles[len(sorted_angles) // 2] - and sorted_angles[len(sorted_angles) // 2 + 1] - else 0 - ) - - class ProcessFileIncomplete(BaseModel): dest: Path source: Path @@ -738,7 +725,7 @@ def gather_metadata( if environment else None ) - mdoc_metadata["manual_tilt_offset"] = -_midpoint( + mdoc_metadata["manual_tilt_offset"] = -midpoint( [float(b["TiltAngle"]) for b in blocks] ) mdoc_metadata["source"] = str(self._basepath) diff --git a/src/murfey/server/__init__.py b/src/murfey/server/__init__.py index 16dfce9ce..57b10dcc7 100644 --- a/src/murfey/server/__init__.py +++ b/src/murfey/server/__init__.py @@ -59,6 +59,7 @@ ) from murfey.util.processing_params import default_spa_parameters from murfey.util.state import global_state +from murfey.util.tomo import midpoint try: from murfey.server.ispyb import TransportManager # Session @@ -164,24 +165,6 @@ def _mc_path(mov_path: Path) -> str: return [_mc_path(Path(r.movie_path)) for r in results] -def _midpoint(angles: List[float]) -> int: - """ - Duplicate of the function in 'murfey.client.contexts.tomo', so as to preserve - client-server independence. - """ - if not angles: - return 0 - if len(angles) <= 2: - return round(angles[0]) - sorted_angles = sorted(angles) - return round( - sorted_angles[len(sorted_angles) // 2] - if sorted_angles[len(sorted_angles) // 2] - and sorted_angles[len(sorted_angles) // 2 + 1] - else 0 - ) - - def get_job_ids(tilt_series_id: int, appid: int) -> JobIDs: results = murfey_db.exec( select( @@ -2593,7 +2576,7 @@ def feedback_callback(header: dict, message: dict) -> None: ) if not stack_file.parent.exists(): stack_file.parent.mkdir(parents=True) - tilt_offset = _midpoint([float(get_angle(t)) for t in tilts]) + tilt_offset = midpoint([float(get_angle(t)) for t in tilts]) zocalo_message = { "recipes": ["em-tomo-align"], "parameters": { diff --git a/src/murfey/server/api/__init__.py b/src/murfey/server/api/__init__.py index 6f5d411e9..d6232f9ac 100644 --- a/src/murfey/server/api/__init__.py +++ b/src/murfey/server/api/__init__.py @@ -33,7 +33,6 @@ import murfey.server.websocket as ws import murfey.util.eer from murfey.server import ( - _midpoint, _murfey_id, _transport_object, check_tilt_series_mc, @@ -108,6 +107,7 @@ ) from murfey.util.processing_params import default_spa_parameters from murfey.util.state import global_state +from murfey.util.tomo import midpoint log = logging.getLogger("murfey.server.api") @@ -840,7 +840,7 @@ def register_completed_tilt_series( ) if not stack_file.parent.exists(): stack_file.parent.mkdir(parents=True) - tilt_offset = _midpoint([float(get_angle(t)) for t in tilts]) + tilt_offset = midpoint([float(get_angle(t)) for t in tilts]) zocalo_message = { "recipes": ["em-tomo-align"], "parameters": { diff --git a/src/murfey/util/tomo.py b/src/murfey/util/tomo.py new file mode 100644 index 000000000..dc7314ec1 --- /dev/null +++ b/src/murfey/util/tomo.py @@ -0,0 +1,16 @@ +def midpoint(angles: list[float]) -> int: + """ + Utility function to calculate the midpoint of the angles used in a tilt series. + Used primarily in the tomography workflow. + """ + if not angles: + return 0 + if len(angles) <= 2: + return round(angles[0]) + sorted_angles = sorted(angles) + return round( + sorted_angles[len(sorted_angles) // 2] + if sorted_angles[len(sorted_angles) // 2] + and sorted_angles[len(sorted_angles) // 2 + 1] + else 0 + )