1111import logging
1212import traceback
1313from pathlib import Path
14- from typing import Literal
14+ from typing import Literal , Optional
1515
1616from pydantic import BaseModel
1717from sqlmodel import Session , select
3434logger = logging .getLogger ("murfey.workflows.clem.register_preprocessing_results" )
3535
3636
37- class LIFPreprocessingResult (BaseModel ):
37+ class CLEMPreprocessingResult (BaseModel ):
3838 series_name : str
3939 number_of_members : int
4040 is_stack : bool
@@ -43,7 +43,10 @@ class LIFPreprocessingResult(BaseModel):
4343 Literal ["gray" , "red" , "green" , "blue" , "cyan" , "magenta" , "yellow" ], Path
4444 ]
4545 metadata : Path
46- parent_lif : Path
46+ parent_lif : Optional [Path ] = None
47+ parent_tiffs : dict [
48+ Literal ["gray" , "red" , "green" , "blue" , "cyan" , "magenta" , "yellow" ], list [Path ]
49+ ] = {}
4750 pixels_x : int
4851 pixels_y : int
4952 units : str
@@ -52,39 +55,27 @@ class LIFPreprocessingResult(BaseModel):
5255 extent : list [float ]
5356
5457
55- def register_lif_preprocessing_result (
56- message : dict , murfey_db : Session , demo : bool = False
57- ) -> bool :
58- """
59- session_id (recipe)
60- register (wrapper)
61- result (wrapper)
62- key1
63- key2
64- ...
65- """
58+ def run (message : dict , murfey_db : Session , demo : bool = False ) -> bool :
6659
6760 session_id : int = (
6861 int (message ["session_id" ])
6962 if not isinstance (message ["session_id" ], int )
7063 else message ["session_id" ]
7164 )
72-
73- # Validate message and try and load results
7465 try :
7566 if isinstance (message ["result" ], str ):
7667 json_obj : dict = json .loads (message ["result" ])
77- result = LIFPreprocessingResult (** json_obj )
68+ result = CLEMPreprocessingResult (** json_obj )
7869 elif isinstance (message ["result" ], dict ):
79- result = LIFPreprocessingResult (** message ["result" ])
70+ result = CLEMPreprocessingResult (** message ["result" ])
8071 else :
8172 logger .error (
82- f"Invalid type for LIF preprocessing result: { type (message ['result' ])} "
73+ f"Invalid type for TIFF preprocessing result: { type (message ['result' ])} "
8374 )
8475 return False
8576 except Exception :
8677 logger .error (
87- "Exception encountered when parsing LIF preprocessing result: \n "
78+ "Exception encountered when parsing TIFF preprocessing result: \n "
8879 f"{ traceback .format_exc ()} "
8980 )
9081 return False
@@ -99,169 +90,29 @@ def register_lif_preprocessing_result(
9990 session_id = session_id ,
10091 series_name = result .series_name ,
10192 )
102-
10393 clem_metadata : CLEMImageMetadata = get_db_entry (
10494 db = murfey_db ,
10595 table = CLEMImageMetadata ,
10696 session_id = session_id ,
10797 file_path = result .metadata ,
10898 )
109-
110- clem_lif_file : CLEMLIFFile = get_db_entry (
111- db = murfey_db ,
112- table = CLEMLIFFile ,
113- session_id = session_id ,
114- file_path = result .parent_lif ,
115- )
116-
117- # Iterate through image stacks and start populating them first
118- for channel , output_file in result .output_files .items ():
119- clem_img_stk : CLEMImageStack = get_db_entry (
99+ # Register and link parent LIF file if present
100+ if result .parent_lif is not None :
101+ clem_lif_file : CLEMLIFFile = get_db_entry (
120102 db = murfey_db ,
121- table = CLEMImageStack ,
103+ table = CLEMLIFFile ,
122104 session_id = session_id ,
123- file_path = output_file ,
105+ file_path = result . parent_lif ,
124106 )
107+ clem_img_series .parent_lif = clem_lif_file
108+ clem_metadata .parent_lif = clem_lif_file
125109
126- # Link tables to one another and populate fields
127- clem_img_stk .associated_metadata = clem_metadata
128- clem_img_stk .parent_lif = clem_lif_file
129- clem_img_stk .parent_series = clem_img_series
130- clem_img_stk .channel_name = channel
131- murfey_db .add (clem_img_stk )
132- murfey_db .commit ()
133-
134- # Link other tables together
110+ # Link and commit series and metadata tables first
135111 clem_img_series .associated_metadata = clem_metadata
136- clem_img_series .parent_lif = clem_lif_file
137112 clem_img_series .number_of_members = result .number_of_members
138- murfey_db .add (clem_img_series )
139- murfey_db .commit ()
140-
141- clem_metadata .parent_lif = clem_lif_file
142- murfey_db .add (clem_metadata )
113+ murfey_db .add_all ([clem_img_series , clem_metadata ])
143114 murfey_db .commit ()
144115
145- logger .info (
146- f"LIF preprocessing results registered for { result .series_name !r} "
147- )
148-
149- except Exception :
150- logger .error (
151- "Exception encountered when registering LIF preprocessing result for "
152- f"{ result .series_name !r} : \n "
153- f"{ traceback .format_exc ()} "
154- )
155- return False
156-
157- # Load instrument name
158- try :
159- instrument_name = (
160- murfey_db .exec (
161- select (MurfeySession ).where (MurfeySession .id == session_id )
162- )
163- .one ()
164- .instrument_name
165- )
166- except Exception :
167- logger .error (
168- f"Error requesting data from database for { result .series_name !r} series: \n "
169- f"{ traceback .format_exc ()} "
170- )
171- return False
172-
173- # Request for next stage of processing if all members are present
174- cluster_response = submit_cluster_request (
175- session_id = session_id ,
176- instrument_name = instrument_name ,
177- series_name = result .series_name ,
178- images = list (result .output_files .values ()),
179- metadata = result .metadata ,
180- crop_to_n_frames = processing_params .crop_to_n_frames ,
181- align_self = processing_params .align_self ,
182- flatten = processing_params .flatten ,
183- align_across = processing_params .align_across ,
184- messenger = _transport_object ,
185- )
186- if cluster_response is False :
187- logger .error (
188- "Error requesting align-and-merge processing job for "
189- f"{ result .series_name !r} series"
190- )
191- return False
192- logger .info (
193- "Successfully requested align-and-merge processing job for "
194- f"{ result .series_name !r} series"
195- )
196- return True
197-
198- finally :
199- murfey_db .close ()
200-
201-
202- class TIFFPreprocessingResult (BaseModel ):
203- series_name : str
204- number_of_members : int
205- is_stack : bool
206- is_montage : bool
207- output_files : dict [
208- Literal ["gray" , "red" , "green" , "blue" , "cyan" , "magenta" , "yellow" ], Path
209- ]
210- metadata : Path
211- parent_tiffs : dict [
212- Literal ["gray" , "red" , "green" , "blue" , "cyan" , "magenta" , "yellow" ], list [Path ]
213- ]
214- pixels_x : int
215- pixels_y : int
216- units : str
217- pixel_size : float
218- resolution : float
219- extent : list [float ]
220-
221-
222- def register_tiff_preprocessing_result (
223- message : dict , murfey_db : Session , demo : bool = False
224- ) -> bool :
225-
226- session_id : int = (
227- int (message ["session_id" ])
228- if not isinstance (message ["session_id" ], int )
229- else message ["session_id" ]
230- )
231- try :
232- if isinstance (message ["result" ], str ):
233- json_obj : dict = json .loads (message ["result" ])
234- result = TIFFPreprocessingResult (** json_obj )
235- elif isinstance (message ["result" ], dict ):
236- result = TIFFPreprocessingResult (** message ["result" ])
237- else :
238- logger .error (
239- f"Invalid type for TIFF preprocessing result: { type (message ['result' ])} "
240- )
241- return False
242- except Exception :
243- logger .error (
244- "Exception encountered when parsing TIFF preprocessing result: \n "
245- f"{ traceback .format_exc ()} "
246- )
247- return False
248-
249- # Outer try-finally block for tidying up database-related section of function
250- try :
251- # Register items in database if not already present
252- try :
253- clem_img_series : CLEMImageSeries = get_db_entry (
254- db = murfey_db ,
255- table = CLEMImageSeries ,
256- session_id = session_id ,
257- series_name = result .series_name ,
258- )
259- clem_metadata : CLEMImageMetadata = get_db_entry (
260- db = murfey_db ,
261- table = CLEMImageMetadata ,
262- session_id = session_id ,
263- file_path = result .metadata ,
264- )
265116 # Iteratively register the output image stacks
266117 for channel , output_file in result .output_files .items ():
267118 clem_img_stk : CLEMImageStack = get_db_entry (
@@ -275,37 +126,37 @@ def register_tiff_preprocessing_result(
275126 clem_img_stk .associated_metadata = clem_metadata
276127 clem_img_stk .parent_series = clem_img_series
277128 clem_img_stk .channel_name = channel
129+ if result .parent_lif is not None :
130+ clem_img_stk .parent_lif = clem_lif_file
278131 murfey_db .add (clem_img_stk )
279132 murfey_db .commit ()
280133
281- # Register parent TIFF files iteratively for each channel
282- for file in result .parent_tiffs [channel ]:
283- clem_tiff_file : CLEMTIFFFile = get_db_entry (
284- db = murfey_db ,
285- table = CLEMTIFFFile ,
286- session_id = session_id ,
287- file_path = file ,
288- )
289-
290- # Link associated metadata
291- clem_tiff_file .associated_metadata = clem_metadata
292- clem_tiff_file .child_series = clem_img_series
293- clem_tiff_file .child_stack = clem_img_stk
294- murfey_db .add (clem_tiff_file )
134+ # Register and link parent TIFF files if present
135+ if result .parent_tiffs :
136+ tiff_files_to_register = []
137+ for file in result .parent_tiffs [channel ]:
138+ clem_tiff_file : CLEMTIFFFile = get_db_entry (
139+ db = murfey_db ,
140+ table = CLEMTIFFFile ,
141+ session_id = session_id ,
142+ file_path = file ,
143+ )
144+
145+ # Link associated metadata
146+ clem_tiff_file .associated_metadata = clem_metadata
147+ clem_tiff_file .child_series = clem_img_series
148+ clem_tiff_file .child_stack = clem_img_stk
149+ tiff_files_to_register .append (clem_tiff_file )
150+ murfey_db .add_all (tiff_files_to_register )
295151 murfey_db .commit ()
296152
297- clem_img_series .associated_metadata = clem_metadata
298- clem_img_series .number_of_members = result .number_of_members
299- murfey_db .add (clem_img_series )
300- murfey_db .commit ()
301-
302153 logger .info (
303- f"TIFF preprocessing results registered for { result .series_name !r} "
154+ f"CLEM preprocessing results registered for { result .series_name !r} "
304155 )
305156
306157 except Exception :
307158 logger .error (
308- "Exception encountered when registering TIFF preprocessing result for "
159+ "Exception encountered when registering CLEM preprocessing result for "
309160 f"{ result .series_name !r} : \n "
310161 f"{ traceback .format_exc ()} "
311162 )
0 commit comments