44import logging
55import traceback
66from ast import literal_eval
7+ from functools import cached_property
78from pathlib import Path
89from typing import Optional
910
10- from pydantic import BaseModel , field_validator
11+ from pydantic import BaseModel , computed_field , field_validator
1112from sqlmodel import Session , select
1213
1314from murfey .util .db import ImagingSite
@@ -25,6 +26,27 @@ class AlignAndMergeResult(BaseModel):
2526 thumbnail : Optional [Path ] = None
2627 thumbnail_size : Optional [tuple [int , int ]] = None
2728
29+ # Valid Pydantic decorator not supported by MyPy
30+ @computed_field # type: ignore
31+ @cached_property
32+ def is_denoised (self ) -> bool :
33+ """
34+ The "_Lng_LVCC" suffix appended to a CLEM dataset's position name indicates
35+ that it's a denoised image set of the same position. These results should
36+ override or supersede the original ones once they're available.
37+ """
38+ return "_Lng_LVCC" in self .series_name
39+
40+ # Valid Pydantic decorator not supported by MyPy
41+ @computed_field # type: ignore
42+ @cached_property
43+ def site_name (self ) -> str :
44+ """
45+ Extract just the name of the site by removing the "_Lng_LVCC" suffix from
46+ the series name.
47+ """
48+ return self .series_name .replace ("_Lng_LVCC" , "" )
49+
2850 @field_validator ("image_stacks" , mode = "before" )
2951 @classmethod
3052 def parse_stringified_list (cls , value ):
@@ -78,26 +100,36 @@ def run(message: dict, murfey_db: Session) -> dict[str, bool]:
78100
79101 # Outer try-finally block for tidying up database-related section of function
80102 try :
81- # Register items in database if not already present
82103 try :
83- if not (
84- clem_img_series := murfey_db .exec (
85- select (ImagingSite )
86- .where (ImagingSite .session_id == session_id )
87- .where (ImagingSite .site_name == result .series_name )
88- ).one_or_none ()
89- ):
90- clem_img_series = ImagingSite (
91- session_id = session_id , series_name = result .series_name
104+ clem_img_site = murfey_db .exec (
105+ select (ImagingSite )
106+ .where (ImagingSite .session_id == session_id )
107+ .where (ImagingSite .site_name == result .site_name )
108+ ).one ()
109+
110+ # Update the stored entry only if the incoming one matches it
111+ if clem_img_site .image_path is not None and (
112+ # Denoised dataset results should be registered regardless
113+ result .is_denoised
114+ or (
115+ # Raw dataset result should only be considered
116+ # If the current entry is also a raw dataset
117+ not result .is_denoised
118+ and "_Lng_LVCC" not in clem_img_site .image_path
92119 )
93- clem_img_series .composite_created = True
94- murfey_db .add (clem_img_series )
95- murfey_db .commit ()
120+ ):
121+ clem_img_site .composite_created = True
122+ murfey_db .add (clem_img_site )
123+ murfey_db .commit ()
96124
97- logger .info (
98- "Align-and-merge processing result registered for "
99- f"{ result .series_name !r} series"
100- )
125+ logger .info (
126+ "Align-and-merge processing result registered for "
127+ f"{ result .series_name !r} series"
128+ )
129+ else :
130+ logger .info (
131+ "Skipping database registration as incoming result doesn't match stored entry"
132+ )
101133
102134 except Exception :
103135 logger .error (
0 commit comments