Skip to content

Commit 42a774a

Browse files
authored
Added FastAPI endpoint to trigger image alignment and merging job for CLEM workflow and updated function parameters (#420)
* Added FastAPI endpoint to trigger image alignment and merging job * Updated processing parameters for said job * Relocated Pydantic model associated with said job
1 parent 1d96699 commit 42a774a

File tree

9 files changed

+112
-30
lines changed

9 files changed

+112
-30
lines changed

src/murfey/cli/inject_spa_processing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
SPAFeedbackParameters,
2222
SPARelionParameters,
2323
)
24-
from murfey.util.spa_params import default_spa_parameters
24+
from murfey.util.processing_params import default_spa_parameters
2525

2626

2727
def run():

src/murfey/server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
get_microscope,
5757
get_security_config,
5858
)
59-
from murfey.util.spa_params import default_spa_parameters
59+
from murfey.util.processing_params import default_spa_parameters
6060
from murfey.util.state import global_state
6161

6262
try:

src/murfey/server/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
TiltSeriesInfo,
106106
Visit,
107107
)
108-
from murfey.util.spa_params import default_spa_parameters
108+
from murfey.util.processing_params import default_spa_parameters
109109
from murfey.util.state import global_state
110110

111111
log = logging.getLogger("murfey.server.api")

src/murfey/server/api/clem.py

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import re
44
import traceback
5+
from ast import literal_eval
56
from importlib.metadata import EntryPoint # type hinting only
67
from logging import getLogger
78
from pathlib import Path
8-
from typing import Optional, Type, Union
9+
from typing import Literal, Optional, Type, Union
910

1011
from backports.entry_points_selectable import entry_points
1112
from fastapi import APIRouter
13+
from pydantic import BaseModel, validator
1214
from sqlalchemy.exc import NoResultFound
1315
from sqlmodel import Session, select
1416

@@ -23,7 +25,6 @@
2325
CLEMTIFFFile,
2426
)
2527
from murfey.util.db import Session as MurfeySession
26-
from murfey.util.models import TIFFSeriesInfo
2728

2829
# Set up logger
2930
logger = getLogger("murfey.server.api.clem")
@@ -622,7 +623,7 @@ def register_image_stack(
622623
"/sessions/{session_id}/clem/preprocessing/process_raw_lifs"
623624
) # API posts to this URL
624625
def process_raw_lifs(
625-
session_id: int, # Used by the decorator
626+
session_id: int,
626627
lif_file: Path,
627628
db: Session = murfey_db,
628629
):
@@ -654,9 +655,15 @@ def process_raw_lifs(
654655
return True
655656

656657

658+
class TIFFSeriesInfo(BaseModel):
659+
series_name: str
660+
tiff_files: list[Path]
661+
series_metadata: Path
662+
663+
657664
@router.post("/sessions/{session_id}/clem/preprocessing/process_raw_tiffs")
658665
def process_raw_tiffs(
659-
session_id: int, # Used by the decorator
666+
session_id: int,
660667
tiff_info: TIFFSeriesInfo,
661668
db: Session = murfey_db,
662669
):
@@ -687,3 +694,72 @@ def process_raw_tiffs(
687694
messenger=_transport_object,
688695
)
689696
return True
697+
698+
699+
class AlignAndMergeParams(BaseModel):
700+
# Processing parameters
701+
series_name: str
702+
images: list[Path]
703+
metadata: Path
704+
# Optional processing parameters
705+
crop_to_n_frames: Optional[int] = None
706+
align_self: Literal["enabled", ""] = ""
707+
flatten: Literal["mean", "min", "max", ""] = ""
708+
align_across: Literal["enabled", ""] = ""
709+
710+
@validator(
711+
"images",
712+
pre=True,
713+
)
714+
def parse_stringified_list(cls, value):
715+
if isinstance(value, str):
716+
try:
717+
eval_result = literal_eval(value)
718+
if isinstance(eval_result, list):
719+
parent_tiffs = [Path(p) for p in eval_result]
720+
return parent_tiffs
721+
except (SyntaxError, ValueError):
722+
raise ValueError("Unable to parse input")
723+
# Return value as-is; if it fails, it fails
724+
return value
725+
726+
727+
@router.post("/sessions/{session_id}/clem/processing/align_and_merge_stacks")
728+
def align_and_merge_stacks(
729+
session_id: int,
730+
align_and_merge_params: AlignAndMergeParams,
731+
db: Session = murfey_db,
732+
):
733+
try:
734+
# Try and load relevant Murfey workflow
735+
workflow: EntryPoint = list(
736+
entry_points().select(group="murfey.workflows", name="clem.align_and_merge")
737+
)[0]
738+
except IndexError:
739+
raise RuntimeError("The relevant Murfey workflow was not found")
740+
741+
# Get instrument name from the database to load the correct config file
742+
session_row: MurfeySession = db.exec(
743+
select(MurfeySession).where(MurfeySession.id == session_id)
744+
).one()
745+
instrument_name = session_row.instrument_name
746+
747+
# Pass arguments to correct workflow
748+
workflow.load()(
749+
# Match the arguments found in murfey.workflows.clem.align_and_merge
750+
# Session parameters
751+
session_id=session_id,
752+
instrument_name=instrument_name,
753+
# Processing parameters
754+
series_name=align_and_merge_params.series_name,
755+
images=align_and_merge_params.images,
756+
metadata=align_and_merge_params.metadata,
757+
# Optional processing parameters
758+
crop_to_n_frames=align_and_merge_params.crop_to_n_frames,
759+
align_self=align_and_merge_params.align_self,
760+
flatten=align_and_merge_params.flatten,
761+
align_across=align_and_merge_params.align_across,
762+
# Optional session parameters
763+
messenger=_transport_object,
764+
)
765+
return True

src/murfey/server/demo_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
TiltSeriesInfo,
9191
Visit,
9292
)
93-
from murfey.util.spa_params import default_spa_parameters
93+
from murfey.util.processing_params import default_spa_parameters
9494
from murfey.util.state import global_state
9595

9696
log = logging.getLogger("murfey.server.demo_api")

src/murfey/util/models.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -147,19 +147,6 @@ class FractionationParameters(BaseModel):
147147
fractionation_file_name: str = "eer_fractionation.txt"
148148

149149

150-
"""
151-
Cryo-CLEM
152-
=========
153-
Models related to the cryo-CLEM workflow.
154-
"""
155-
156-
157-
class TIFFSeriesInfo(BaseModel):
158-
series_name: str
159-
tiff_files: List[Path]
160-
series_metadata: Path
161-
162-
163150
"""
164151
FIB
165152
===
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
1+
from typing import Literal, Optional
2+
13
from pydantic import BaseModel
24

35

6+
class CLEMAlignAndMergeParameters(BaseModel):
7+
crop_to_n_frames: Optional[int] = 50
8+
align_self: Literal["enabled", ""] = "enabled"
9+
flatten: Literal["mean", "min", "max", ""] = "mean"
10+
align_across: Literal["enabled", ""] = "enabled"
11+
12+
13+
default_clem_align_and_merge_parameters = CLEMAlignAndMergeParameters()
14+
15+
416
class SPAParameters(BaseModel):
517
nr_iter_2d: int = 25
618
nr_iter_3d: int = 25

src/murfey/workflows/clem/align_and_merge.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ def submit_cluster_request(
2525
images: list[Path],
2626
metadata: Path,
2727
# Optional processing parameters
28-
align_self: Optional[str] = None,
29-
flatten: Optional[Literal["min", "max", "mean"]] = "mean",
30-
align_across: Optional[str] = None,
28+
crop_to_n_frames: Optional[int] = None,
29+
align_self: Literal["enabled", ""] = "",
30+
flatten: Literal["mean", "min", "max", ""] = "mean",
31+
align_across: Literal["enabled", ""] = "",
3132
# Optional session parameters
3233
messenger: Optional[TransportManager] = None,
3334
):
@@ -64,6 +65,7 @@ def submit_cluster_request(
6465
"series_name": series_name,
6566
"images": [str(file) for file in images],
6667
"metadata": str(metadata),
68+
"crop_to_n_frames": crop_to_n_frames,
6769
"align_self": align_self,
6870
"flatten": flatten,
6971
"align_across": align_across,

src/murfey/workflows/clem/register_preprocessing_results.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
CLEMTIFFFile,
2626
)
2727
from murfey.util.db import Session as MurfeySession
28+
from murfey.util.processing_params import (
29+
default_clem_align_and_merge_parameters as processing_params,
30+
)
2831
from murfey.workflows.clem import get_db_entry
2932
from murfey.workflows.clem.align_and_merge import submit_cluster_request
3033

@@ -187,9 +190,10 @@ def register_lif_preprocessing_result(
187190
series_name=result.series_name,
188191
images=image_stacks,
189192
metadata=result.metadata,
190-
align_self=None,
191-
flatten="mean",
192-
align_across=None,
193+
crop_to_n_frames=processing_params.crop_to_n_frames,
194+
align_self=processing_params.align_self,
195+
flatten=processing_params.flatten,
196+
align_across=processing_params.align_across,
193197
messenger=_transport_object,
194198
)
195199
if cluster_response is False:
@@ -369,9 +373,10 @@ def register_tiff_preprocessing_result(
369373
series_name=result.series_name,
370374
images=image_stacks,
371375
metadata=result.metadata,
372-
align_self=None,
373-
flatten="mean",
374-
align_across=None,
376+
crop_to_n_frames=processing_params.crop_to_n_frames,
377+
align_self=processing_params.align_self,
378+
flatten=processing_params.flatten,
379+
align_across=processing_params.align_across,
375380
messenger=_transport_object,
376381
)
377382
if cluster_response is False:

0 commit comments

Comments
 (0)