1010import json
1111import logging
1212import traceback
13- from ast import literal_eval
1413from pathlib import Path
14+ from typing import Literal
1515
16- from pydantic import BaseModel , field_validator
16+ from pydantic import BaseModel
1717from sqlmodel import Session , select
1818
1919from murfey .server import _transport_object
3535
3636
3737class LIFPreprocessingResult (BaseModel ):
38- image_stack : Path
39- metadata : Path
4038 series_name : str
41- channel : str
4239 number_of_members : int
40+ is_stack : bool
41+ is_montage : bool
42+ output_files : dict [
43+ Literal ["gray" , "red" , "green" , "blue" , "cyan" , "magenta" , "yellow" ], Path
44+ ]
45+ metadata : Path
4346 parent_lif : Path
47+ pixels_x : int
48+ pixels_y : int
49+ units : str
50+ pixel_size : float
51+ resolution : float
52+ extent : list [float ]
4453
4554
4655def register_lif_preprocessing_result (
@@ -84,13 +93,6 @@ def register_lif_preprocessing_result(
8493 try :
8594 # Register items in database if not already present
8695 try :
87- clem_img_stk : CLEMImageStack = get_db_entry (
88- db = murfey_db ,
89- table = CLEMImageStack ,
90- session_id = session_id ,
91- file_path = result .image_stack ,
92- )
93-
9496 clem_img_series : CLEMImageSeries = get_db_entry (
9597 db = murfey_db ,
9698 table = CLEMImageSeries ,
@@ -112,14 +114,24 @@ def register_lif_preprocessing_result(
112114 file_path = result .parent_lif ,
113115 )
114116
115- # Link tables to one another and populate fields
116- clem_img_stk .associated_metadata = clem_metadata
117- clem_img_stk .parent_lif = clem_lif_file
118- clem_img_stk .parent_series = clem_img_series
119- clem_img_stk .channel_name = result .channel
120- murfey_db .add (clem_img_stk )
121- murfey_db .commit ()
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 (
120+ db = murfey_db ,
121+ table = CLEMImageStack ,
122+ session_id = session_id ,
123+ file_path = output_file ,
124+ )
125+
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 ()
122133
134+ # Link other tables together
123135 clem_img_series .associated_metadata = clem_metadata
124136 clem_img_series .parent_lif = clem_lif_file
125137 clem_img_series .number_of_members = result .number_of_members
@@ -132,30 +144,18 @@ def register_lif_preprocessing_result(
132144
133145 logger .info (
134146 f"LIF preprocessing results registered for { result .series_name !r} "
135- f"{ result .channel !r} image stack"
136147 )
137148
138149 except Exception :
139150 logger .error (
140151 "Exception encountered when registering LIF preprocessing result for "
141- f"{ result .series_name !r} { result . channel !r } image stack : \n "
152+ f"{ result .series_name !r} : \n "
142153 f"{ traceback .format_exc ()} "
143154 )
144155 return False
145156
146- # Load all image stacks associated with current series from database
157+ # Load instrument name
147158 try :
148- image_stacks = [
149- Path (row )
150- for row in murfey_db .exec (
151- select (CLEMImageStack .file_path ).where (
152- CLEMImageStack .series_id == clem_img_series .id
153- )
154- ).all ()
155- ]
156- logger .debug (
157- f"Found the following images: { [str (file ) for file in image_stacks ]} "
158- )
159159 instrument_name = (
160160 murfey_db .exec (
161161 select (MurfeySession ).where (MurfeySession .id == session_id )
@@ -170,20 +170,12 @@ def register_lif_preprocessing_result(
170170 )
171171 return False
172172
173- # Check if all image stacks for this series are accounted for
174- if not len (image_stacks ) == clem_img_series .number_of_members :
175- logger .info (
176- f"Members of the series { result .series_name !r} are still missing; "
177- "the next stage of processing will not be triggered yet"
178- )
179- return True
180-
181173 # Request for next stage of processing if all members are present
182174 cluster_response = submit_cluster_request (
183175 session_id = session_id ,
184176 instrument_name = instrument_name ,
185177 series_name = result .series_name ,
186- images = image_stacks ,
178+ images = list ( result . output_files . values ()) ,
187179 metadata = result .metadata ,
188180 crop_to_n_frames = processing_params .crop_to_n_frames ,
189181 align_self = processing_params .align_self ,
@@ -208,26 +200,23 @@ def register_lif_preprocessing_result(
208200
209201
210202class TIFFPreprocessingResult (BaseModel ):
211- image_stack : Path
212- metadata : Path
213203 series_name : str
214- channel : str
215204 number_of_members : int
216- parent_tiffs : list [ Path ]
217-
218- @ field_validator ( "parent_tiffs" , mode = "before" )
219- @ classmethod
220- def parse_stringified_list ( cls , value ):
221- if isinstance ( value , str ):
222- try :
223- eval_result = literal_eval ( value )
224- if isinstance ( eval_result , list ):
225- parent_tiffs = [ Path ( p ) for p in eval_result ]
226- return parent_tiffs
227- except ( SyntaxError , ValueError ):
228- raise ValueError ( "Unable to parse input" )
229- # Return value as-is; if it fails, it fails
230- return value
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 ]
231220
232221
233222def register_tiff_preprocessing_result (
@@ -261,12 +250,6 @@ def register_tiff_preprocessing_result(
261250 try :
262251 # Register items in database if not already present
263252 try :
264- clem_img_stk : CLEMImageStack = get_db_entry (
265- db = murfey_db ,
266- table = CLEMImageStack ,
267- session_id = session_id ,
268- file_path = result .image_stack ,
269- )
270253 clem_img_series : CLEMImageSeries = get_db_entry (
271254 db = murfey_db ,
272255 table = CLEMImageSeries ,
@@ -279,27 +262,37 @@ def register_tiff_preprocessing_result(
279262 session_id = session_id ,
280263 file_path = result .metadata ,
281264 )
282-
283- # Link tables to one another and populate fields
284- # Register TIFF files and populate them iteratively first
285- for file in result .parent_tiffs :
286- clem_tiff_file : CLEMTIFFFile = get_db_entry (
265+ # Iteratively register the output image stacks
266+ for channel , output_file in result .output_files .items ():
267+ clem_img_stk : CLEMImageStack = get_db_entry (
287268 db = murfey_db ,
288- table = CLEMTIFFFile ,
269+ table = CLEMImageStack ,
289270 session_id = session_id ,
290- file_path = file ,
271+ file_path = output_file ,
291272 )
292- clem_tiff_file .associated_metadata = clem_metadata
293- clem_tiff_file .child_series = clem_img_series
294- clem_tiff_file .child_stack = clem_img_stk
295- murfey_db .add (clem_tiff_file )
273+
274+ # Link associated metadata
275+ clem_img_stk .associated_metadata = clem_metadata
276+ clem_img_stk .parent_series = clem_img_series
277+ clem_img_stk .channel_name = channel
278+ murfey_db .add (clem_img_stk )
296279 murfey_db .commit ()
297280
298- clem_img_stk .associated_metadata = clem_metadata
299- clem_img_stk .parent_series = clem_img_series
300- clem_img_stk .channel_name = result .channel
301- murfey_db .add (clem_img_stk )
302- murfey_db .commit ()
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 )
295+ murfey_db .commit ()
303296
304297 clem_img_series .associated_metadata = clem_metadata
305298 clem_img_series .number_of_members = result .number_of_members
@@ -308,30 +301,18 @@ def register_tiff_preprocessing_result(
308301
309302 logger .info (
310303 f"TIFF preprocessing results registered for { result .series_name !r} "
311- f"{ result .channel !r} image stack"
312304 )
313305
314306 except Exception :
315307 logger .error (
316308 "Exception encountered when registering TIFF preprocessing result for "
317- f"{ result .series_name !r} { result . channel !r } image stack : \n "
309+ f"{ result .series_name !r} : \n "
318310 f"{ traceback .format_exc ()} "
319311 )
320312 return False
321313
322- # Load all image stacks associated with current series from database
314+ # Load instrument name
323315 try :
324- image_stacks = [
325- Path (row )
326- for row in murfey_db .exec (
327- select (CLEMImageStack .file_path ).where (
328- CLEMImageStack .series_id == clem_img_series .id
329- )
330- ).all ()
331- ]
332- logger .debug (
333- f"Found the following images: { [str (file ) for file in image_stacks ]} "
334- )
335316 instrument_name = (
336317 murfey_db .exec (
337318 select (MurfeySession ).where (MurfeySession .id == session_id )
@@ -346,20 +327,12 @@ def register_tiff_preprocessing_result(
346327 )
347328 return False
348329
349- # Check if all image stacks for this series are accounted for
350- if not len (image_stacks ) == clem_img_series .number_of_members :
351- logger .info (
352- f"Members of the series { result .series_name !r} are still missing; "
353- "the next stage of processing will not be triggered yet"
354- )
355- return True
356-
357330 # Request for next stage of processing if all members are present
358331 cluster_response = submit_cluster_request (
359332 session_id = session_id ,
360333 instrument_name = instrument_name ,
361334 series_name = result .series_name ,
362- images = image_stacks ,
335+ images = list ( result . output_files . values ()) ,
363336 metadata = result .metadata ,
364337 crop_to_n_frames = processing_params .crop_to_n_frames ,
365338 align_self = processing_params .align_self ,
0 commit comments