Skip to content

Commit a410fa6

Browse files
committed
Adjusted logic for '_analyse' so that context-specific metadata processing is done within the relevant Context blocks
1 parent e348b9b commit a410fa6

1 file changed

Lines changed: 79 additions & 119 deletions

File tree

src/murfey/client/analyser.py

Lines changed: 79 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import threading
1515
from importlib.metadata import entry_points
1616
from pathlib import Path
17-
from typing import Type
17+
from typing import OrderedDict, Type
1818

1919
from murfey.client.context import Context
2020
from 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

Comments
 (0)