1414import threading
1515from importlib .metadata import entry_points
1616from pathlib import Path
17- from typing import Type
17+ from typing import OrderedDict , Type
1818
1919from murfey .client .context import Context
2020from murfey .client .destinations import find_longest_data_directory
@@ -384,87 +384,24 @@ def _analyse(self, transferred_file: Path):
384384 )
385385 self .post_transfer (transferred_file )
386386 else :
387- dc_metadata = {}
387+ # Logic that doesn't require context determination
388388 if not self ._serialem and (
389- self ._force_mdoc_metadata
390- and transferred_file .suffix == ".mdoc"
391- or self ._mdoc_for_reading
389+ self ._force_mdoc_metadata and transferred_file .suffix == ".mdoc"
392390 ):
393- if self ._context :
394- try :
395- dc_metadata = self ._context .gather_metadata (
396- self ._mdoc_for_reading or transferred_file ,
397- environment = self ._environment ,
398- )
399- except KeyError as e :
400- logger .error (
401- f"Metadata gathering failed with a key error for key: { e .args [0 ]} "
402- )
403- raise e
404- if not dc_metadata :
405- self ._mdoc_for_reading = None
406- elif transferred_file .suffix == ".mdoc" :
407- self ._mdoc_for_reading = transferred_file
408- if not self ._context :
409- if not self ._find_extension (transferred_file ):
410- logger .debug (f"No extension found for { transferred_file } " )
411- return
391+ self ._mdoc_for_reading = transferred_file
392+
393+ # Try and determine context, and notify once when context is found
394+ if self ._context is None :
395+ # Exit early if the file can't be used to determine the context
412396 if not self ._find_context (transferred_file ):
413397 logger .debug (f"Couldn't find context for { str (transferred_file )!r} " )
414398 return
415- elif self ._extension :
416- logger .info (f"Context found successfully for { transferred_file } " )
417- try :
418- if self ._context is not None :
419- self ._context .post_first_transfer (
420- transferred_file ,
421- environment = self ._environment ,
422- )
423- except Exception as e :
424- logger .error (f"Exception encountered: { e } " )
425- if any (
426- context in str (self ._context )
427- for context in (
428- "SPAContext" ,
429- "SPAMetadataContext" ,
430- "TomographyContext" ,
431- "TomographyMetadataContext" ,
432- )
433- ):
434- if not dc_metadata :
435- try :
436- if self ._context is not None :
437- dc_metadata = self ._context .gather_metadata (
438- self ._xml_file (transferred_file ),
439- environment = self ._environment ,
440- )
441- except NotImplementedError :
442- dc_metadata = {}
443- except KeyError as e :
444- logger .error (
445- f"Metadata gathering failed with a key error for key: { e .args [0 ]} "
446- )
447- raise e
448- except ValueError as e :
449- logger .error (
450- f"Metadata gathering failed with a value error: { e } "
451- )
452- if not dc_metadata or not self ._force_mdoc_metadata :
453- self ._unseen_xml .append (transferred_file )
454- else :
455- self ._unseen_xml = []
456- if dc_metadata .get ("file_extension" ):
457- self ._extension = dc_metadata ["file_extension" ]
458- else :
459- dc_metadata ["file_extension" ] = self ._extension
460- if self ._context is not None :
461- dc_metadata ["acquisition_software" ] = (
462- self ._context ._acquisition_software
463- )
464- self .notify (dc_metadata )
465-
466- # Contexts that can be immediately posted without additional work
467- elif "CLEMContext" in str (self ._context ):
399+ else :
400+ logger .info (f"Context found successfully using { transferred_file } " )
401+
402+ # Trigger processing or metadata parsing according to the context
403+ # Go through the straightforward ones first
404+ if "CLEMContext" in str (self ._context ):
468405 logger .debug (f"File { transferred_file .name !r} is part of CLEM workflow" )
469406 self .post_transfer (transferred_file )
470407 elif "FIBContext" in str (self ._context ):
@@ -480,59 +417,82 @@ def _analyse(self, transferred_file: Path):
480417 self .post_transfer (transferred_file )
481418
482419 # Handle files with tomography and SPA context differently
483- elif not self ._extension or self ._unseen_xml :
484- if not self ._find_extension (transferred_file ):
485- logger .error (f"No extension found for { transferred_file } " )
486- return
487- if self ._extension :
488- logger .info (f"Extension found successfully for { transferred_file } " )
420+ elif (
421+ any (
422+ context in str (self ._context )
423+ for context in (
424+ "SPAContext" ,
425+ "SPAMetadataContext" ,
426+ "TomographyContext" ,
427+ "TomographyMetadataContext" ,
428+ )
429+ )
430+ and self ._context is not None
431+ ):
432+ context = str (self ._context ).split (" " )[0 ].split ("." )[- 1 ]
433+
434+ dc_metadata : OrderedDict | None = None
435+ if not self ._serialem and (
436+ self ._force_mdoc_metadata
437+ and transferred_file .suffix == ".mdoc"
438+ or self ._mdoc_for_reading
439+ ):
489440 try :
490- self ._context .post_first_transfer (
491- transferred_file ,
441+ dc_metadata = self ._context .gather_metadata (
442+ self . _mdoc_for_reading or transferred_file ,
492443 environment = self ._environment ,
493444 )
494- except Exception as e :
495- logger .error (f"Exception encountered: { e } " )
445+ except KeyError as e :
446+ logger .error (
447+ f"Metadata gathering failed with a key error for key: "
448+ f"{ e .args [0 ]} "
449+ )
450+ raise e
451+ # Set the mdoc field to None if no metadata was found
496452 if not dc_metadata :
497- try :
498- dc_metadata = self ._context .gather_metadata (
499- self ._mdoc_for_reading
500- or self ._xml_file (transferred_file ),
501- environment = self ._environment ,
502- )
503- except KeyError as e :
504- logger .error (
505- f"Metadata gathering failed with a key error for key: { e .args [0 ]} "
506- )
507- raise e
508- if not dc_metadata or not self ._force_mdoc_metadata :
509453 self ._mdoc_for_reading = None
510- self . _unseen_xml . append ( transferred_file )
511- if dc_metadata :
512- self . _unseen_xml = []
513- if dc_metadata . get ( "file_extension" ):
514- self . _extension = dc_metadata [ "file_extension" ]
515- else :
516- dc_metadata [ "file_extension" ] = self . _extension
517- dc_metadata [ "acquisition_software" ] = (
518- self . _context . _acquisition_software
454+
455+ if not self . _extension or self . _unseen_xml :
456+ # Early return if no extension was found
457+ if not self . _find_extension ( transferred_file ):
458+ logger . warning ( f"No extension found for { transferred_file } " )
459+ return
460+ else :
461+ logger . info (
462+ f"Extension found successfully for { transferred_file } "
519463 )
520- self .notify (dc_metadata )
521- elif any (
522- context in str (self ._context )
523- for context in (
524- "SPAContext" ,
525- "SPAMetadataContext" ,
526- "TomographyContext" ,
527- "TomographyMetadataContext" ,
528- )
529- ):
530- context = str (self ._context ).split (" " )[0 ].split ("." )[- 1 ]
464+
531465 logger .debug (
532466 f"Transferring file { str (transferred_file )} with context { context !r} "
533467 )
534468 self .post_transfer (transferred_file )
535469
470+ if not dc_metadata and transferred_file .suffix != ".mdoc" :
471+ try :
472+ dc_metadata = self ._context .gather_metadata (
473+ self ._mdoc_for_reading or self ._xml_file (transferred_file ),
474+ environment = self ._environment ,
475+ )
476+ except KeyError as e :
477+ logger .error (
478+ f"Metadata gathering failed with a key error for key: { e .args [0 ]} "
479+ )
480+ raise e
481+ if not dc_metadata or not self ._force_mdoc_metadata :
482+ self ._mdoc_for_reading = None
483+ self ._unseen_xml .append (transferred_file )
484+ if dc_metadata :
485+ self ._unseen_xml = []
486+ if dc_metadata .get ("file_extension" ):
487+ self ._extension = dc_metadata ["file_extension" ]
488+ else :
489+ dc_metadata ["file_extension" ] = self ._extension
490+ dc_metadata ["acquisition_software" ] = (
491+ self ._context ._acquisition_software
492+ )
493+ self .notify (dc_metadata )
494+ return
495+
536496 def _xml_file (self , data_file : Path ) -> Path :
537497 if not self ._environment :
538498 return data_file .with_suffix (".xml" )
0 commit comments