11from __future__ import annotations
22
3+ import json
34import logging
5+ import traceback
6+ from ast import literal_eval
47from pathlib import Path
58from 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
916logger = 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