Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 34 additions & 30 deletions src/murfey/client/analyser.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from typing import Type

from murfey.client.context import Context
from murfey.client.contexts.atlas import AtlasContext
from murfey.client.contexts.clem import CLEMContext
from murfey.client.contexts.spa import SPAModularContext
from murfey.client.contexts.spa_metadata import SPAMetadataContext
Expand Down Expand Up @@ -135,7 +136,7 @@ def _find_context(self, file_path: Path) -> bool:

# Tomography and SPA workflow checks
if "atlas" in file_path.parts:
self._context = SPAMetadataContext("epu", self._basepath)
self._context = AtlasContext("epu", self._basepath)
return True

if "Metadata" in file_path.parts or file_path.name == "EpuSession.dm":
Expand Down Expand Up @@ -266,7 +267,7 @@ def _analyse(self):
)
except Exception as e:
logger.error(f"Exception encountered: {e}")
if "atlas" not in transferred_file.parts:
if not isinstance(self._context, AtlasContext):
if not dc_metadata:
try:
dc_metadata = self._context.gather_metadata(
Expand Down Expand Up @@ -308,6 +309,10 @@ def _analyse(self):
)
self.post_transfer(transferred_file)

elif isinstance(self._context, AtlasContext):
logger.debug(f"File {transferred_file.name!r} is part of the atlas")
self.post_transfer(transferred_file)

# Handle files with tomography and SPA context differently
elif not self._extension or self._unseen_xml:
valid_extension = self._find_extension(transferred_file)
Expand All @@ -325,36 +330,35 @@ def _analyse(self):
)
except Exception as e:
logger.error(f"Exception encountered: {e}")
if "atlas" not in transferred_file.parts:
if not dc_metadata:
try:
dc_metadata = self._context.gather_metadata(
mdoc_for_reading
or self._xml_file(transferred_file),
environment=self._environment,
)
except KeyError as e:
logger.error(
f"Metadata gathering failed with a key error for key: {e.args[0]}"
)
raise e
if not dc_metadata or not self._force_mdoc_metadata:
mdoc_for_reading = None
self._unseen_xml.append(transferred_file)
if dc_metadata:
self._unseen_xml = []
if dc_metadata.get("file_extension"):
self._extension = dc_metadata["file_extension"]
else:
dc_metadata["file_extension"] = self._extension
dc_metadata["acquisition_software"] = (
self._context._acquisition_software
if not dc_metadata:
try:
dc_metadata = self._context.gather_metadata(
mdoc_for_reading
or self._xml_file(transferred_file),
environment=self._environment,
)
self.notify(
{
"form": dc_metadata,
}
except KeyError as e:
logger.error(
f"Metadata gathering failed with a key error for key: {e.args[0]}"
)
raise e
if not dc_metadata or not self._force_mdoc_metadata:
mdoc_for_reading = None
self._unseen_xml.append(transferred_file)
if dc_metadata:
self._unseen_xml = []
if dc_metadata.get("file_extension"):
self._extension = dc_metadata["file_extension"]
else:
dc_metadata["file_extension"] = self._extension
dc_metadata["acquisition_software"] = (
self._context._acquisition_software
)
self.notify(
{
"form": dc_metadata,
}
)
elif isinstance(
self._context,
(
Expand Down
51 changes: 51 additions & 0 deletions src/murfey/client/contexts/atlas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import logging
from pathlib import Path
from typing import Optional

import requests

from murfey.client.context import Context
from murfey.client.contexts.spa import _get_source
from murfey.client.contexts.spa_metadata import _atlas_destination
from murfey.client.instance_environment import MurfeyInstanceEnvironment
from murfey.util.api import url_path_for
from murfey.util.client import authorised_requests, capture_post

logger = logging.getLogger("murfey.client.contexts.spa_metadata")

requests.get, requests.post, requests.put, requests.delete = authorised_requests()


class AtlasContext(Context):
def __init__(self, acquisition_software: str, basepath: Path):
super().__init__("Atlas", acquisition_software)
self._basepath = basepath

def post_transfer(
self,
transferred_file: Path,
environment: Optional[MurfeyInstanceEnvironment] = None,
**kwargs,
):
super().post_transfer(
transferred_file=transferred_file,
environment=environment,
**kwargs,
)

if (
environment
and "Atlas_" in transferred_file.stem
and transferred_file.suffix == ".mrc"
):
source = _get_source(transferred_file, environment)
if source:
transferred_atlas_name = (
_atlas_destination(environment, source, transferred_file)
/ environment.samples[source].atlas.parent
/ transferred_file.name
)
capture_post(
f"{str(environment.url.geturl())}{url_path_for('session_control.spa_router', 'make_atlas_jpg', session_id=environment.murfey_session)}",
json={"atlas_mrc": transferred_atlas_name},
)
7 changes: 7 additions & 0 deletions src/murfey/server/api/session_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
SearchMapParameters,
Visit,
)
from murfey.workflows.spa.atlas import atlas_jpg_from_mrc
from murfey.workflows.spa.flush_spa_preprocess import (
register_foil_hole as _register_foil_hole,
)
Expand Down Expand Up @@ -319,6 +320,12 @@ def delete_rsyncer(session_id: int, source: Path, db=murfey_db):
)


@spa_router.get("/sessions/{session_id}/make_atlas_jpg")
def make_atlas_jpg(session_id: MurfeySessionID, atlas_mrc: str, db=murfey_db):
session = db.exec(select(Session).where(Session.id == session_id)).one()
return atlas_jpg_from_mrc(session.instrument_name, session.visit, Path(atlas_mrc))


@spa_router.get("/sessions/{session_id}/grid_squares")
def get_grid_squares(session_id: MurfeySessionID, db=murfey_db):
return _get_grid_squares(session_id, db)
Expand Down
35 changes: 35 additions & 0 deletions src/murfey/workflows/spa/atlas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from pathlib import Path

import mrcfile
import PIL.Image
from werkzeug.utils import secure_filename

from murfey.util.config import get_machine_config


def atlas_jpg_from_mrc(instrument_name: str, visit_name: str, atlas_mrc: Path):
with mrcfile.read(atlas_mrc) as mrc:
data = mrc.data

machine_config = get_machine_config(instrument_name=instrument_name)[
instrument_name
]

parts = [secure_filename(p) for p in atlas_mrc.parts]
visit_idx = parts.index(visit_name)
core = Path("/".join(parts[: visit_idx + 1]))
sample_id = "Sample"
for p in parts:
if "Sample" in p:
sample_id = p
break
atlas_jpg_file = (
core
/ machine_config.processed_directory_name
/ "atlas"
/ f"{sample_id}_{atlas_mrc.stem}_fullres.jpg"
)
atlas_jpg_file.parent.mkdir(parents=True, exist_ok=True)
Comment thread Fixed

im = PIL.Image.fromarray(data)
im.save(atlas_jpg_file)
3 changes: 2 additions & 1 deletion tests/client/test_analyser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import pytest

from murfey.client.analyser import Analyser
from murfey.client.contexts.atlas import AtlasContext
from murfey.client.contexts.clem import CLEMContext
from murfey.client.contexts.spa import SPAModularContext
from murfey.client.contexts.spa_metadata import SPAMetadataContext
Expand All @@ -28,7 +29,7 @@
["visit/FoilHole_01234_fractions.tiff", SPAModularContext],
["visit/FoilHole_01234_EER.eer", SPAModularContext],
# SPA metadata
["atlas/atlas.mrc", SPAMetadataContext],
["atlas/atlas.mrc", AtlasContext],
["visit/EpuSession.dm", SPAMetadataContext],
["visit/Metadata/GridSquare.dm", SPAMetadataContext],
# CLEM LIF file
Expand Down