Skip to content

Commit f9dc813

Browse files
committed
Added entry point to register align-and-merge processing results
1 parent a309a6e commit f9dc813

File tree

1 file changed

+101
-3
lines changed

1 file changed

+101
-3
lines changed

src/murfey/workflows/clem/register_align_and_merge_results.py

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
from __future__ import annotations
22

3+
import json
34
import logging
5+
import traceback
6+
from ast import literal_eval
47
from pathlib import Path
58
from typing import Optional
69

7-
from pydantic import BaseModel
10+
from pydantic import BaseModel, validator
11+
from sqlmodel import Session
12+
13+
from murfey.util.db import CLEMImageSeries
14+
from murfey.workflows.clem import get_db_entry
815

916
logger = logging.getLogger("murfey.workflows.clem.register_align_and_merge_results")
1017

@@ -17,6 +24,97 @@ class AlignAndMergeResult(BaseModel):
1724
align_across: Optional[str] = None
1825
composite_image: Path
1926

27+
@validator(
28+
"image_stacks",
29+
pre=True,
30+
)
31+
def parse_stringified_list(cls, value):
32+
if isinstance(value, str):
33+
try:
34+
eval_result = literal_eval(value)
35+
if isinstance(eval_result, list):
36+
parent_tiffs = [Path(p) for p in eval_result]
37+
return parent_tiffs
38+
except (SyntaxError, ValueError):
39+
raise ValueError("Unable to parse input")
40+
# Return value as-is; if it fails, it fails
41+
return value
42+
43+
44+
def register_align_and_merge_result(
45+
message: dict, db: Session, demo: bool = False
46+
) -> bool:
47+
"""
48+
session_id (recipe)
49+
register (wrapper)
50+
result (wrapper)
51+
key1
52+
key2
53+
...
54+
"""
55+
56+
session_id: int = (
57+
int(message["session_id"])
58+
if not isinstance(message["session_id"], int)
59+
else message["session_id"]
60+
)
61+
62+
# Validate message and try and load results
63+
if isinstance(message["result"], str):
64+
try:
65+
json_obj: dict = json.loads(message["result"])
66+
result = AlignAndMergeResult(**json_obj)
67+
except Exception:
68+
logger.error(traceback.format_exc())
69+
logger.error(
70+
"Exception encountered when parsing align-and-merge processing result"
71+
)
72+
return False
73+
elif isinstance(message["result"], dict):
74+
try:
75+
result = AlignAndMergeResult(**message["result"])
76+
except Exception:
77+
logger.error(traceback.format_exc())
78+
logger.error(
79+
"Exception encountered when parsing align-and-merge processing result"
80+
)
81+
return False
82+
else:
83+
logger.error(
84+
"Invalid type for align-and-merge processing result: "
85+
f"{type(message['result'])}"
86+
)
87+
return False
88+
89+
# Outer try-finally block for tidying up database-related section of function
90+
try:
91+
# Register items in database if not already present
92+
try:
93+
clem_img_series: CLEMImageSeries = get_db_entry(
94+
db=db,
95+
table=CLEMImageSeries,
96+
session_id=session_id,
97+
series_name=result.series_name,
98+
)
99+
clem_img_series.composite_image = str(result.composite_image)
100+
clem_img_series.composite_created = True
101+
db.add(clem_img_series)
102+
db.commit()
103+
db.refresh(clem_img_series)
104+
105+
logger.info(
106+
"Align-and-merge processing result registered for "
107+
f"{result.series_name!r} series"
108+
)
109+
110+
except Exception:
111+
logger.error(traceback.format_exc())
112+
logger.error(
113+
"Exception encountered when registering LIF preprocessing result for "
114+
f"{result.series_name!r} {result.channel!r} image stack"
115+
)
116+
return False
20117

21-
def register_align_and_merge_result():
22-
return True
118+
return True
119+
finally:
120+
db.close()

0 commit comments

Comments
 (0)