|
17 | 17 | from sqlalchemy.exc import NoResultFound |
18 | 18 | from sqlmodel import Session, select |
19 | 19 |
|
| 20 | +from murfey.server import _transport_object |
20 | 21 | from murfey.util.config import get_machine_config |
21 | 22 | from murfey.util.db import ( |
22 | 23 | CLEMImageMetadata, |
|
27 | 28 | ) |
28 | 29 | from murfey.util.db import Session as MurfeySession |
29 | 30 | from murfey.util.models import LIFPreprocessingResult, TIFFPreprocessingResult |
| 31 | +from murfey.workflows.clem.align_and_merge import submit_cluster_request |
30 | 32 |
|
31 | 33 | logger = logging.getLogger("murfey.workflows.clem.register_results") |
32 | 34 |
|
@@ -232,70 +234,130 @@ def register_lif_preprocessing_result( |
232 | 234 | ) |
233 | 235 | return False |
234 | 236 |
|
235 | | - # Register items in database if not already present |
| 237 | + # Outer try-finally block for tidying up database-related section of function |
236 | 238 | try: |
237 | | - clem_img_stk: CLEMImageStack = get_db_entry( |
238 | | - db=db, |
239 | | - table=CLEMImageStack, |
240 | | - session_id=session_id, |
241 | | - file_path=result.image_stack, |
242 | | - ) |
| 239 | + # Register items in database if not already present |
| 240 | + try: |
| 241 | + clem_img_stk: CLEMImageStack = get_db_entry( |
| 242 | + db=db, |
| 243 | + table=CLEMImageStack, |
| 244 | + session_id=session_id, |
| 245 | + file_path=result.image_stack, |
| 246 | + ) |
243 | 247 |
|
244 | | - clem_img_series: CLEMImageSeries = get_db_entry( |
245 | | - db=db, |
246 | | - table=CLEMImageSeries, |
247 | | - session_id=session_id, |
248 | | - series_name=result.series_name, |
249 | | - ) |
| 248 | + clem_img_series: CLEMImageSeries = get_db_entry( |
| 249 | + db=db, |
| 250 | + table=CLEMImageSeries, |
| 251 | + session_id=session_id, |
| 252 | + series_name=result.series_name, |
| 253 | + ) |
250 | 254 |
|
251 | | - clem_metadata: CLEMImageMetadata = get_db_entry( |
252 | | - db=db, |
253 | | - table=CLEMImageMetadata, |
254 | | - session_id=session_id, |
255 | | - file_path=result.metadata, |
256 | | - ) |
| 255 | + clem_metadata: CLEMImageMetadata = get_db_entry( |
| 256 | + db=db, |
| 257 | + table=CLEMImageMetadata, |
| 258 | + session_id=session_id, |
| 259 | + file_path=result.metadata, |
| 260 | + ) |
257 | 261 |
|
258 | | - clem_lif_file: CLEMLIFFile = get_db_entry( |
259 | | - db=db, |
260 | | - table=CLEMLIFFile, |
261 | | - session_id=session_id, |
262 | | - file_path=result.parent_lif, |
263 | | - ) |
| 262 | + clem_lif_file: CLEMLIFFile = get_db_entry( |
| 263 | + db=db, |
| 264 | + table=CLEMLIFFile, |
| 265 | + session_id=session_id, |
| 266 | + file_path=result.parent_lif, |
| 267 | + ) |
264 | 268 |
|
265 | | - # Link tables to one another and populate fields |
266 | | - clem_img_stk.associated_metadata = clem_metadata |
267 | | - clem_img_stk.parent_lif = clem_lif_file |
268 | | - clem_img_stk.parent_series = clem_img_series |
269 | | - clem_img_stk.channel_name = result.channel |
270 | | - clem_img_stk.stack_created = True |
271 | | - db.add(clem_img_stk) |
272 | | - db.commit() |
273 | | - db.refresh(clem_img_stk) |
| 269 | + # Link tables to one another and populate fields |
| 270 | + clem_img_stk.associated_metadata = clem_metadata |
| 271 | + clem_img_stk.parent_lif = clem_lif_file |
| 272 | + clem_img_stk.parent_series = clem_img_series |
| 273 | + clem_img_stk.channel_name = result.channel |
| 274 | + clem_img_stk.stack_created = True |
| 275 | + db.add(clem_img_stk) |
| 276 | + db.commit() |
| 277 | + db.refresh(clem_img_stk) |
274 | 278 |
|
275 | | - clem_img_series.associated_metadata = clem_metadata |
276 | | - clem_img_series.parent_lif = clem_lif_file |
277 | | - clem_img_series.number_of_members = result.number_of_members |
278 | | - db.add(clem_img_series) |
279 | | - db.commit() |
280 | | - db.refresh(clem_img_series) |
| 279 | + clem_img_series.associated_metadata = clem_metadata |
| 280 | + clem_img_series.parent_lif = clem_lif_file |
| 281 | + clem_img_series.number_of_members = result.number_of_members |
| 282 | + db.add(clem_img_series) |
| 283 | + db.commit() |
| 284 | + db.refresh(clem_img_series) |
281 | 285 |
|
282 | | - clem_metadata.parent_lif = clem_lif_file |
283 | | - db.add(clem_metadata) |
284 | | - db.commit() |
285 | | - db.refresh(clem_metadata) |
| 286 | + clem_metadata.parent_lif = clem_lif_file |
| 287 | + db.add(clem_metadata) |
| 288 | + db.commit() |
| 289 | + db.refresh(clem_metadata) |
286 | 290 |
|
| 291 | + logger.info( |
| 292 | + f"LIF preprocessing results registered for {result.series_name!r} " |
| 293 | + f"{result.channel!r} image stack" |
| 294 | + ) |
| 295 | + |
| 296 | + except Exception: |
| 297 | + logger.error(traceback.format_exc()) |
| 298 | + logger.error( |
| 299 | + "Exception encountered when registering LIF preprocessing result for " |
| 300 | + f"{result.series_name!r} {result.channel!r} image stack" |
| 301 | + ) |
| 302 | + return False |
| 303 | + |
| 304 | + # Load all image stacks associated with current series from database |
| 305 | + try: |
| 306 | + image_stacks = [ |
| 307 | + Path(row) |
| 308 | + for row in db.exec( |
| 309 | + select(CLEMImageStack.file_path).where( |
| 310 | + CLEMImageStack.series_id == clem_img_series.id |
| 311 | + ) |
| 312 | + ).all() |
| 313 | + ] |
| 314 | + logger.debug( |
| 315 | + f"Found the following images: {[str(file) for file in image_stacks]}" |
| 316 | + ) |
| 317 | + instrument_name = ( |
| 318 | + db.exec(select(MurfeySession).where(MurfeySession.id == session_id)) |
| 319 | + .one() |
| 320 | + .instrument_name |
| 321 | + ) |
| 322 | + except Exception: |
| 323 | + logger.error(traceback.format_exc()) |
| 324 | + logger.error( |
| 325 | + f"Error requesting data from database for {result.series_name!r} series" |
| 326 | + ) |
| 327 | + return False |
| 328 | + |
| 329 | + # Check if all image stacks for this series are accounted for |
| 330 | + if not len(image_stacks) == clem_img_series.number_of_members: |
| 331 | + logger.info( |
| 332 | + f"Members of the series {result.series_name!r} are still missing; " |
| 333 | + "the next stage of processing will not be triggered yet" |
| 334 | + ) |
| 335 | + return True |
| 336 | + |
| 337 | + # Request for next stage of processing if all members are present |
| 338 | + cluster_response = submit_cluster_request( |
| 339 | + session_id=session_id, |
| 340 | + instrument_name=instrument_name, |
| 341 | + series_name=result.series_name, |
| 342 | + images=image_stacks, |
| 343 | + metadata=result.metadata, |
| 344 | + align_self=None, |
| 345 | + flatten="mean", |
| 346 | + align_across=None, |
| 347 | + messenger=_transport_object, |
| 348 | + ) |
| 349 | + if cluster_response is False: |
| 350 | + logger.error( |
| 351 | + "Error requesting align-and-merge processing job for " |
| 352 | + f"{result.series_name!r} series" |
| 353 | + ) |
| 354 | + return False |
287 | 355 | logger.info( |
288 | | - f"LIF preprocessing results registered for {result.series_name!r} {result.channel!r} image stack" |
| 356 | + "Successfully requested align-and-merge processing job for " |
| 357 | + f"{result.series_name!r} series" |
289 | 358 | ) |
290 | 359 | return True |
291 | 360 |
|
292 | | - except Exception: |
293 | | - logger.error(traceback.format_exc()) |
294 | | - logger.error( |
295 | | - f"Exception encountered when registering LIF preprocessing result for {result.series_name!r} {result.channel!r} image stack" |
296 | | - ) |
297 | | - return False |
298 | | - |
299 | 361 | finally: |
300 | 362 | db.close() |
301 | 363 |
|
@@ -330,68 +392,128 @@ def register_tiff_preprocessing_result( |
330 | 392 | ) |
331 | 393 | return False |
332 | 394 |
|
333 | | - # Register items in database if not already present |
| 395 | + # Outer try-finally block for tidying up database-related section of function |
334 | 396 | try: |
335 | | - clem_img_stk: CLEMImageStack = get_db_entry( |
336 | | - db=db, |
337 | | - table=CLEMImageStack, |
338 | | - session_id=session_id, |
339 | | - file_path=result.image_stack, |
340 | | - ) |
341 | | - clem_img_series: CLEMImageSeries = get_db_entry( |
342 | | - db=db, |
343 | | - table=CLEMImageSeries, |
344 | | - session_id=session_id, |
345 | | - series_name=result.series_name, |
346 | | - ) |
347 | | - clem_metadata: CLEMImageMetadata = get_db_entry( |
348 | | - db=db, |
349 | | - table=CLEMImageMetadata, |
350 | | - session_id=session_id, |
351 | | - file_path=result.metadata, |
352 | | - ) |
353 | | - |
354 | | - # Link tables to one another and populate fields |
355 | | - # Register TIFF files and populate them iteratively first |
356 | | - for file in result.parent_tiffs: |
357 | | - clem_tiff_file: CLEMTIFFFile = get_db_entry( |
| 397 | + # Register items in database if not already present |
| 398 | + try: |
| 399 | + clem_img_stk: CLEMImageStack = get_db_entry( |
| 400 | + db=db, |
| 401 | + table=CLEMImageStack, |
| 402 | + session_id=session_id, |
| 403 | + file_path=result.image_stack, |
| 404 | + ) |
| 405 | + clem_img_series: CLEMImageSeries = get_db_entry( |
| 406 | + db=db, |
| 407 | + table=CLEMImageSeries, |
| 408 | + session_id=session_id, |
| 409 | + series_name=result.series_name, |
| 410 | + ) |
| 411 | + clem_metadata: CLEMImageMetadata = get_db_entry( |
358 | 412 | db=db, |
359 | | - table=CLEMTIFFFile, |
| 413 | + table=CLEMImageMetadata, |
360 | 414 | session_id=session_id, |
361 | | - file_path=file, |
| 415 | + file_path=result.metadata, |
362 | 416 | ) |
363 | | - clem_tiff_file.associated_metadata = clem_metadata |
364 | | - clem_tiff_file.child_series = clem_img_series |
365 | | - clem_tiff_file.child_stack = clem_img_stk |
366 | | - db.add(clem_tiff_file) |
| 417 | + |
| 418 | + # Link tables to one another and populate fields |
| 419 | + # Register TIFF files and populate them iteratively first |
| 420 | + for file in result.parent_tiffs: |
| 421 | + clem_tiff_file: CLEMTIFFFile = get_db_entry( |
| 422 | + db=db, |
| 423 | + table=CLEMTIFFFile, |
| 424 | + session_id=session_id, |
| 425 | + file_path=file, |
| 426 | + ) |
| 427 | + clem_tiff_file.associated_metadata = clem_metadata |
| 428 | + clem_tiff_file.child_series = clem_img_series |
| 429 | + clem_tiff_file.child_stack = clem_img_stk |
| 430 | + db.add(clem_tiff_file) |
| 431 | + db.commit() |
| 432 | + db.refresh(clem_tiff_file) |
| 433 | + |
| 434 | + clem_img_stk.associated_metadata = clem_metadata |
| 435 | + clem_img_stk.parent_series = clem_img_series |
| 436 | + clem_img_stk.channel_name = result.channel |
| 437 | + clem_img_stk.stack_created = True |
| 438 | + db.add(clem_img_stk) |
367 | 439 | db.commit() |
368 | | - db.refresh(clem_tiff_file) |
| 440 | + db.refresh(clem_img_stk) |
369 | 441 |
|
370 | | - clem_img_stk.associated_metadata = clem_metadata |
371 | | - clem_img_stk.parent_series = clem_img_series |
372 | | - clem_img_stk.channel_name = result.channel |
373 | | - clem_img_stk.stack_created = True |
374 | | - db.add(clem_img_stk) |
375 | | - db.commit() |
376 | | - db.refresh(clem_img_stk) |
| 442 | + clem_img_series.associated_metadata = clem_metadata |
| 443 | + clem_img_series.number_of_members = result.number_of_members |
| 444 | + db.add(clem_img_series) |
| 445 | + db.commit() |
| 446 | + db.refresh(clem_img_series) |
377 | 447 |
|
378 | | - clem_img_series.associated_metadata = clem_metadata |
379 | | - clem_img_series.number_of_members = result.number_of_members |
380 | | - db.add(clem_img_series) |
381 | | - db.commit() |
382 | | - db.refresh(clem_img_series) |
| 448 | + logger.info( |
| 449 | + f"TIFF preprocessing results registered for {result.series_name!r} " |
| 450 | + f"{result.channel!r} image stack" |
| 451 | + ) |
383 | 452 |
|
| 453 | + except Exception: |
| 454 | + logger.error(traceback.format_exc()) |
| 455 | + logger.error( |
| 456 | + "Exception encountered when registering TIFF preprocessing result for " |
| 457 | + f"{result.series_name!r} {result.channel!r} image stack" |
| 458 | + ) |
| 459 | + return False |
| 460 | + |
| 461 | + # Load all image stacks associated with current series from database |
| 462 | + try: |
| 463 | + image_stacks = [ |
| 464 | + Path(row) |
| 465 | + for row in db.exec( |
| 466 | + select(CLEMImageStack.file_path).where( |
| 467 | + CLEMImageStack.series_id == clem_img_series.id |
| 468 | + ) |
| 469 | + ).all() |
| 470 | + ] |
| 471 | + logger.debug( |
| 472 | + f"Found the following images: {[str(file) for file in image_stacks]}" |
| 473 | + ) |
| 474 | + instrument_name = ( |
| 475 | + db.exec(select(MurfeySession).where(MurfeySession.id == session_id)) |
| 476 | + .one() |
| 477 | + .instrument_name |
| 478 | + ) |
| 479 | + except Exception: |
| 480 | + logger.error(traceback.format_exc()) |
| 481 | + logger.error( |
| 482 | + f"Error requesting data from database for {result.series_name!r} series" |
| 483 | + ) |
| 484 | + return False |
| 485 | + |
| 486 | + # Check if all image stacks for this series are accounted for |
| 487 | + if not len(image_stacks) == clem_img_series.number_of_members: |
| 488 | + logger.info( |
| 489 | + f"Members of the series {result.series_name!r} are still missing; " |
| 490 | + "the next stage of processing will not be triggered yet" |
| 491 | + ) |
| 492 | + return True |
| 493 | + |
| 494 | + # Request for next stage of processing if all members are present |
| 495 | + cluster_response = submit_cluster_request( |
| 496 | + session_id=session_id, |
| 497 | + instrument_name=instrument_name, |
| 498 | + series_name=result.series_name, |
| 499 | + images=image_stacks, |
| 500 | + metadata=result.metadata, |
| 501 | + align_self=None, |
| 502 | + flatten="mean", |
| 503 | + align_across=None, |
| 504 | + messenger=_transport_object, |
| 505 | + ) |
| 506 | + if cluster_response is False: |
| 507 | + logger.error( |
| 508 | + "Error requesting align-and-merge processing job for " |
| 509 | + f"{result.series_name!r} series" |
| 510 | + ) |
| 511 | + return False |
384 | 512 | logger.info( |
385 | | - f"TIFF preprocessing results registered for {result.series_name!r} {result.channel!r} image stack" |
| 513 | + "Successfully requested align-and-merge processing job for " |
| 514 | + f"{result.series_name!r} series" |
386 | 515 | ) |
387 | 516 | return True |
388 | 517 |
|
389 | | - except Exception: |
390 | | - logger.error(traceback.format_exc()) |
391 | | - logger.error( |
392 | | - f"Exception encountered when registering TIFF preprocessing result for {result.series_name!r} {result.channel!r} image stack" |
393 | | - ) |
394 | | - return False |
395 | | - |
396 | 518 | finally: |
397 | 519 | db.close() |
0 commit comments