Skip to content

Commit 2861884

Browse files
authored
Basic SerialEM grid square mag image analyser (#812)
Add basic functionality to trigger SmartEM events when grid square mag images are seen from a SerialEM workflow (assumes that the stem of the file name is the UUID associated with the grid square)
1 parent 9b52fa6 commit 2861884

1 file changed

Lines changed: 68 additions & 15 deletions

File tree

src/murfey/client/contexts/spa_metadata.py

Lines changed: 68 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,27 @@ def _foil_hole_positions(xml_path: Path, grid_square: int) -> Dict[str, FoilHole
7373
return foil_holes
7474

7575

76+
def _get_visitless_source(
77+
source: Path, environment: MurfeyInstanceEnvironment, skip_search: bool = False
78+
) -> str:
79+
visitless_source_search_dir = "/".join(
80+
[part for part in source.parts if part != environment.visit]
81+
).replace("//", "/")
82+
if skip_search:
83+
return visitless_source_search_dir
84+
visitless_source_images_dirs = sorted(
85+
Path(visitless_source_search_dir).glob("Images-Disc*"),
86+
key=lambda x: x.stat().st_ctime,
87+
)
88+
if not visitless_source_images_dirs:
89+
logger.warning(f"Cannot find Images-Disc* in {visitless_source_search_dir}")
90+
visitless_source_images_dirs = [
91+
Path(visitless_source_search_dir) / "Images-Disc1"
92+
]
93+
visitless_source = str(visitless_source_images_dirs[-1])
94+
return visitless_source
95+
96+
7697
class SPAMetadataContext(Context):
7798
def __init__(
7899
self,
@@ -85,6 +106,7 @@ def __init__(
85106
self._basepath = basepath
86107
self._machine_config = machine_config
87108
self._registered_squares: set[int] = set()
109+
self._registered_squares_serialem: set[str] = set()
88110

89111
def post_transfer(
90112
self,
@@ -97,6 +119,51 @@ def post_transfer(
97119
environment=environment,
98120
**kwargs,
99121
)
122+
if self._acquisition_software == "serialem":
123+
self.post_transfer_serialem(
124+
transferred_file, environment=environment, **kwargs
125+
)
126+
else:
127+
self.post_transfer_epu(transferred_file, environment=environment, **kwargs)
128+
129+
def post_transfer_serialem(
130+
self,
131+
transferred_file: Path,
132+
environment: Optional[MurfeyInstanceEnvironment] = None,
133+
**kwargs,
134+
):
135+
if environment and transferred_file.suffix == ".mrc":
136+
source = _get_source(transferred_file, environment)
137+
if source:
138+
visitless_source = _get_visitless_source(
139+
source, environment, skip_search=True
140+
)
141+
capture_post(
142+
base_url=str(environment.url.geturl()),
143+
router_name="session_control.spa_router",
144+
function_name="register_square",
145+
token=self._token,
146+
instrument_name=environment.instrument_name,
147+
session_id=environment.murfey_session,
148+
gsid=transferred_file.stem,
149+
data={
150+
"tag": visitless_source,
151+
"count": len(self._registered_squares_serialem) + 1,
152+
},
153+
)
154+
self._registered_squares_serialem.add(transferred_file.stem)
155+
156+
def post_transfer_epu(
157+
self,
158+
transferred_file: Path,
159+
environment: Optional[MurfeyInstanceEnvironment] = None,
160+
**kwargs,
161+
):
162+
super().post_transfer(
163+
transferred_file=transferred_file,
164+
environment=environment,
165+
**kwargs,
166+
)
100167

101168
if transferred_file.name == "EpuSession.dm" and environment:
102169
logger.info("EPU session metadata found")
@@ -194,21 +261,7 @@ def post_transfer(
194261
f"Collecting foil hole positions for {str(transferred_file)} and grid square {gs_name}"
195262
)
196263
fh_positions = _foil_hole_positions(transferred_file, gs_name)
197-
visitless_source_search_dir = "/".join(
198-
[part for part in source.parts if part != environment.visit]
199-
).replace("//", "/")
200-
visitless_source_images_dirs = sorted(
201-
Path(visitless_source_search_dir).glob("Images-Disc*"),
202-
key=lambda x: x.stat().st_ctime,
203-
)
204-
if not visitless_source_images_dirs:
205-
logger.warning(
206-
f"Cannot find Images-Disc* in {visitless_source_search_dir}"
207-
)
208-
visitless_source_images_dirs = [
209-
Path(visitless_source_search_dir) / "Images-Disc1"
210-
]
211-
visitless_source = str(visitless_source_images_dirs[-1])
264+
visitless_source = _get_visitless_source(source, environment)
212265

213266
if fh_positions:
214267
gs_info = grid_square_data(

0 commit comments

Comments
 (0)