Skip to content

Commit cbf056e

Browse files
committed
Updated CLEM preprocessing result registration workflow to parse new messsage formats
1 parent 569f326 commit cbf056e

File tree

1 file changed

+78
-105
lines changed

1 file changed

+78
-105
lines changed

src/murfey/workflows/clem/register_preprocessing_results.py

Lines changed: 78 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import json
1111
import logging
1212
import traceback
13-
from ast import literal_eval
1413
from pathlib import Path
14+
from typing import Literal
1515

16-
from pydantic import BaseModel, field_validator
16+
from pydantic import BaseModel
1717
from sqlmodel import Session, select
1818

1919
from murfey.server import _transport_object
@@ -35,12 +35,21 @@
3535

3636

3737
class 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

4655
def 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

210202
class 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

233222
def 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

Comments
 (0)