Skip to content

Commit 6d23984

Browse files
committed
Collapsed the LIF and TIFF preprocessing result registration functions into one single function that accepts messages from both workflows
1 parent 9c1ace9 commit 6d23984

File tree

2 files changed

+42
-192
lines changed

2 files changed

+42
-192
lines changed

pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ GitHub = "https://github.com/DiamondLightSource/python-murfey"
104104
"clem.process_raw_lifs" = "murfey.workflows.clem.process_raw_lifs:zocalo_cluster_request"
105105
"clem.process_raw_tiffs" = "murfey.workflows.clem.process_raw_tiffs:zocalo_cluster_request"
106106
"clem.register_align_and_merge_result" = "murfey.workflows.clem.register_align_and_merge_results:register_align_and_merge_result"
107-
"clem.register_lif_preprocessing_result" = "murfey.workflows.clem.register_preprocessing_results:register_lif_preprocessing_result"
108-
"clem.register_tiff_preprocessing_result" = "murfey.workflows.clem.register_preprocessing_results:register_tiff_preprocessing_result"
107+
"clem.register_preprocessing_result" = "murfey.workflows.clem.register_preprocessing_results:run"
109108
"pato" = "murfey.workflows.notifications:notification_setup"
110109
"picked_particles" = "murfey.workflows.spa.picking:particles_picked"
111110
"spa.flush_spa_preprocess" = "murfey.workflows.spa.flush_spa_preprocess:flush_spa_preprocess"

src/murfey/workflows/clem/register_preprocessing_results.py

Lines changed: 41 additions & 190 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import logging
1212
import traceback
1313
from pathlib import Path
14-
from typing import Literal
14+
from typing import Literal, Optional
1515

1616
from pydantic import BaseModel
1717
from sqlmodel import Session, select
@@ -34,7 +34,7 @@
3434
logger = 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

Comments
 (0)