1111import logging
1212import re
1313import traceback
14+ from importlib .metadata import entry_points
1415from pathlib import Path
1516from typing import Literal , Optional
1617
@@ -164,10 +165,17 @@ def run(message: dict, murfey_db: Session, demo: bool = False) -> dict[str, bool
164165 murfey_db .add_all (clem_tiff_files )
165166 murfey_db .commit ()
166167
168+ # Add data type and image search string
169+ clem_img_series .search_string = str (output_file .parent / "*tiff" )
170+ clem_img_series .data_type = (
171+ "atlas" if "Overview_" in result .series_name else "grid_square"
172+ )
173+ murfey_db .add (clem_img_series )
174+ murfey_db .commit ()
175+
167176 logger .info (
168177 f"CLEM preprocessing results registered for { result .series_name !r} "
169178 )
170-
171179 except Exception :
172180 logger .error (
173181 "Exception encountered when registering CLEM preprocessing result for "
@@ -176,21 +184,120 @@ def run(message: dict, murfey_db: Session, demo: bool = False) -> dict[str, bool
176184 )
177185 return {"success" : False , "requeue" : False }
178186
179- # Load instrument name
180187 try :
181- instrument_name = (
182- murfey_db .exec (
183- select (MurfeyDB .Session ).where (MurfeyDB .Session .id == session_id )
184- )
185- .one ()
186- .instrument_name
188+ # Load current session from database
189+ murfey_session = murfey_db .exec (
190+ select (MurfeyDB .Session ).where (MurfeyDB .Session .id == session_id )
191+ ).one ()
192+
193+ # Determine variables to register data collection group and atlas with
194+ visit_name = murfey_session .visit
195+ proposal_code = "" .join (
196+ char for char in visit_name .split ("-" )[0 ] if char .isalpha ()
187197 )
198+ proposal_number = "" .join (
199+ char for char in visit_name .split ("-" )[0 ] if char .isdigit ()
200+ )
201+ visit_number = visit_name .split ("-" )[- 1 ]
202+
203+ # Generate name/tag for data colleciton group based on series name
204+ dcg_name = result .series_name .split ("--" )[0 ]
205+ if result .series_name .split ("--" )[1 ].isdigit ():
206+ dcg_name += f"--{ result .series_name .split ('--' )[1 ]} "
207+
208+ # Determine values for atlas
209+ if "Overview_" in result .series_name : # These are atlas datasets
210+ atlas_name = str (output_file .parent / "*.tiff" )
211+ atlas_pixel_size = result .pixel_size
212+ else :
213+ atlas_name = ""
214+ atlas_pixel_size = 0.0
215+
216+ registration_result : dict [str , bool ]
217+ if dcg_search := murfey_db .exec (
218+ select (MurfeyDB .DataCollectionGroup )
219+ .where (MurfeyDB .DataCollectionGroup .session_id == session_id )
220+ .where (MurfeyDB .DataCollectionGroup .tag == dcg_name )
221+ ).all ():
222+ # Update atlas if registering atlas dataset
223+ # and data collection group already exists
224+ dcg_entry = dcg_search [0 ]
225+ if "Overview_" in result .series_name :
226+ atlas_message = {
227+ "session_id" : session_id ,
228+ "dcgid" : dcg_entry .id ,
229+ "atlas_id" : dcg_entry .atlas_id ,
230+ "atlas" : atlas_name ,
231+ "atlas_pixel_size" : atlas_pixel_size ,
232+ "sample" : dcg_entry .sample ,
233+ }
234+ if entry_point_result := entry_points (
235+ group = "murfey.workflows" , name = "atlas_update"
236+ ):
237+ (workflow ,) = entry_point_result
238+ registration_result = workflow .load ()(
239+ message = atlas_message ,
240+ murfey_db = murfey_db ,
241+ )
242+ else :
243+ logger .warning ("No workflow found for 'atlas_update'" )
244+ registration_result = {"success" : False , "requeue" : False }
245+ else :
246+ registration_result = {"success" : True }
247+ else :
248+ # Register data collection group
249+ dcg_message = {
250+ "microscope" : murfey_session .instrument_name ,
251+ "proposal_code" : proposal_code ,
252+ "proposal_number" : proposal_number ,
253+ "visit_number" : visit_number ,
254+ "session_id" : session_id ,
255+ "tag" : dcg_name ,
256+ "experiment_type" : "experiment" ,
257+ "experiment_type_id" : None ,
258+ "atlas" : atlas_name ,
259+ "atlas_pixel_size" : atlas_pixel_size ,
260+ "sample" : None ,
261+ }
262+ if entry_point_result := entry_points (
263+ group = "murfey.workflows" , name = "data_collection_group"
264+ ):
265+ (workflow ,) = entry_point_result
266+ # Register grid square
267+ registration_result = workflow .load ()(
268+ message = dcg_message ,
269+ murfey_db = murfey_db ,
270+ )
271+ else :
272+ logger .warning ("No workflow found for 'data_collection_group'" )
273+ registration_result = {"success" : False , "requeue" : False }
274+ if registration_result .get ("success" , False ):
275+ logger .info (
276+ "Successfully registered data collection group for CLEM workflow "
277+ f"using{ result .series_name !r} "
278+ )
279+ else :
280+ logger .warning (
281+ "Failed to register data collection group for CLEM workflow "
282+ f"using { result .series_name !r} "
283+ )
284+
285+ # Store data collection group id in CLEM image series table
286+ dcg_entry = murfey_db .exec (
287+ select (MurfeyDB .DataCollectionGroup )
288+ .where (MurfeyDB .DataCollectionGroup .session_id == session_id )
289+ .where (MurfeyDB .DataCollectionGroup .tag == dcg_name )
290+ ).one ()
291+ clem_img_series .dcg_id = dcg_entry .id
292+ clem_img_series .dcg_name = dcg_entry .tag
293+ murfey_db .add (clem_img_series )
294+ murfey_db .commit ()
188295 except Exception :
189296 logger .error (
190- f"Error requesting data from database for { result .series_name !r} series: \n "
297+ "Exception encountered when registering data collection group for CLEM workflow "
298+ f"using { result .series_name !r} : \n "
191299 f"{ traceback .format_exc ()} "
192300 )
193- return {"success" : False , "requeue" : False }
194301
195302 # Construct list of files to use for image alignment and merging steps
196303 image_combos_to_process = [
@@ -218,7 +325,7 @@ def run(message: dict, murfey_db: Session, demo: bool = False) -> dict[str, bool
218325 try :
219326 submit_cluster_request (
220327 session_id = session_id ,
221- instrument_name = instrument_name ,
328+ instrument_name = murfey_session . instrument_name ,
222329 series_name = result .series_name ,
223330 images = image_combo ,
224331 metadata = result .metadata ,
0 commit comments