Skip to content

Commit 25e0074

Browse files
Assign parameters per context rather than per environment (#607)
* Convert find_extension to return a bool * Migrate parameters from environment to context * Removed unnecessary parameters * Fix for eer fractionation from frontend * Ensure environments initialise with the right attributes * Gain is better as a string in the client * Remove dependencies for old parameters
1 parent 68e1f94 commit 25e0074

File tree

15 files changed

+172
-392
lines changed

15 files changed

+172
-392
lines changed

src/murfey/client/analyser.py

Lines changed: 22 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,12 @@
2121
from murfey.client.contexts.tomo import TomographyContext
2222
from murfey.client.instance_environment import MurfeyInstanceEnvironment
2323
from murfey.client.rsync import RSyncerUpdate, TransferResult
24-
from murfey.client.tui.forms import FormDependency
2524
from murfey.util.client import Observer, get_machine_config_client
2625
from murfey.util.mdoc import get_block
2726
from murfey.util.models import ProcessingParametersSPA, ProcessingParametersTomo
2827

2928
logger = logging.getLogger("murfey.client.analyser")
3029

31-
spa_form_dependencies: dict = {
32-
"use_cryolo": FormDependency(
33-
dependencies={"estimate_particle_diameter": False}, trigger_value=False
34-
),
35-
"estimate_particle_diameter": FormDependency(
36-
dependencies={
37-
"use_cryolo": True,
38-
"boxsize": "None",
39-
"small_boxsize": "None",
40-
"mask_diameter": "None",
41-
"particle_diameter": "None",
42-
},
43-
trigger_value=True,
44-
),
45-
}
46-
4730

4831
class Analyser(Observer):
4932
def __init__(
@@ -85,7 +68,7 @@ def __init__(
8568
def __repr__(self) -> str:
8669
return f"<Analyser ({self._basepath})>"
8770

88-
def _find_extension(self, file_path: Path):
71+
def _find_extension(self, file_path: Path) -> bool:
8972
"""
9073
Identifies the file extension and stores that information in the class.
9174
"""
@@ -101,32 +84,30 @@ def _find_extension(self, file_path: Path):
10184
.get(file_path.suffix)
10285
):
10386
if not any(r in file_path.name for r in required_substrings):
104-
return []
87+
return False
10588

106-
# Checks for MRC, TIFF, TIF, and EER files if no extension has been defined
107-
if (
108-
file_path.suffix in (".mrc", ".tiff", ".tif", ".eer")
109-
and not self._extension
110-
):
111-
logger.info(f"File extension determined: {file_path.suffix}")
112-
self._extension = file_path.suffix
113-
# Check for TIFF, TIF, or EER if the file's already been assigned an extension
114-
elif (
115-
file_path.suffix in (".tiff", ".tif", ".eer")
116-
and self._extension != file_path.suffix
117-
):
118-
logger.info(f"File extension re-evaluated: {file_path.suffix}")
119-
self._extension = file_path.suffix
89+
# Checks for MRC, TIFF, TIF, and EER files
90+
if file_path.suffix in (".mrc", ".tiff", ".tif", ".eer"):
91+
if not self._extension:
92+
logger.info(f"File extension determined: {file_path.suffix}")
93+
self._extension = file_path.suffix
94+
elif self._extension != file_path.suffix:
95+
logger.info(f"File extension re-evaluated: {file_path.suffix}")
96+
self._extension = file_path.suffix
97+
return True
12098
# If we see an .mdoc file first, use that to determine the file extensions
12199
elif file_path.suffix == ".mdoc":
122100
with open(file_path, "r") as md:
123101
md.seek(0)
124102
mdoc_data_block = get_block(md)
125103
if subframe_path := mdoc_data_block.get("SubFramePath"):
126104
self._extension = Path(subframe_path).suffix
105+
return True
127106
# Check for LIF files separately
128107
elif file_path.suffix == ".lif":
129108
self._extension = file_path.suffix
109+
return True
110+
return False
130111

131112
def _find_context(self, file_path: Path) -> bool:
132113
"""
@@ -269,7 +250,10 @@ def _analyse(self):
269250
elif transferred_file.suffix == ".mdoc":
270251
mdoc_for_reading = transferred_file
271252
if not self._context:
272-
self._find_extension(transferred_file)
253+
valid_extension = self._find_extension(transferred_file)
254+
if not valid_extension:
255+
logger.error(f"No extension found for {transferred_file}")
256+
break
273257
found = self._find_context(transferred_file)
274258
if not found:
275259
logger.debug(
@@ -325,13 +309,6 @@ def _analyse(self):
325309
self.notify(
326310
{
327311
"form": dc_metadata,
328-
"dependencies": (
329-
spa_form_dependencies
330-
if isinstance(
331-
self._context, SPAModularContext
332-
)
333-
else {}
334-
),
335312
}
336313
)
337314

@@ -344,7 +321,10 @@ def _analyse(self):
344321

345322
# Handle files with tomography and SPA context differently
346323
elif not self._extension or self._unseen_xml:
347-
self._find_extension(transferred_file)
324+
valid_extension = self._find_extension(transferred_file)
325+
if not valid_extension:
326+
logger.error(f"No extension found for {transferred_file}")
327+
break
348328
if self._extension:
349329
logger.info(
350330
f"Extension found successfully for {transferred_file}"
@@ -384,13 +364,6 @@ def _analyse(self):
384364
self.notify(
385365
{
386366
"form": dc_metadata,
387-
"dependencies": (
388-
spa_form_dependencies
389-
if isinstance(
390-
self._context, SPAModularContext
391-
)
392-
else {}
393-
),
394367
}
395368
)
396369
elif isinstance(

src/murfey/client/context.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Context:
3939
def __init__(self, name: str, acquisition_software: str):
4040
self._acquisition_software = acquisition_software
4141
self.name = name
42+
self.data_collection_parameters: dict = {}
4243

4344
def post_transfer(
4445
self,

src/murfey/client/contexts/spa.py

Lines changed: 11 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import logging
4-
from datetime import datetime
54
from itertools import count
65
from pathlib import Path
76
from typing import Any, Dict, List, Optional, OrderedDict, Tuple
@@ -109,27 +108,9 @@ class SPAModularContext(Context):
109108
"Dose Per Frame [e- / Angstrom^2 / frame] (after EER grouping if relevant)",
110109
default=1,
111110
),
112-
ProcessingParameter(
113-
"estimate_particle_diameter",
114-
"Use crYOLO to Estimate Particle Diameter",
115-
default=True,
116-
),
117-
ProcessingParameter(
118-
"particle_diameter", "Particle Diameter (Angstroms)", default=None
119-
),
120-
ProcessingParameter("use_cryolo", "Use crYOLO Autopicking", default=True),
121111
ProcessingParameter("symmetry", "Symmetry Group", default="C1"),
122112
ProcessingParameter("eer_fractionation", "EER Fractionation", default=20),
123-
ProcessingParameter(
124-
"mask_diameter", "Mask Diameter (2D classification)", default=190
125-
),
126-
ProcessingParameter("boxsize", "Box Size", default=256),
127-
ProcessingParameter("downscale", "Downscale Extracted Particles", default=True),
128-
ProcessingParameter(
129-
"small_boxsize", "Downscaled Extracted Particle Size (pixels)", default=128
130-
),
131113
ProcessingParameter("gain_ref", "Gain Reference"),
132-
ProcessingParameter("gain_ref_superres", "Unbinned Gain Reference"),
133114
]
134115
metadata_params = [
135116
ProcessingParameter("voltage", "Voltage"),
@@ -164,7 +145,6 @@ def gather_metadata(
164145
return OrderedDict({})
165146
data = xmltodict.parse(for_parsing)
166147
magnification = 0
167-
num_fractions = 1
168148
metadata: OrderedDict = OrderedDict({})
169149
metadata["experiment_type"] = "SPA"
170150
if data.get("Acquisition"):
@@ -217,14 +197,6 @@ def gather_metadata(
217197
) # convert e / m^2 to e / A^2
218198
except ValueError:
219199
metadata["total_exposed_dose"] = 1
220-
try:
221-
num_fractions = int(
222-
data["MicroscopeImage"]["microscopeData"]["acquisition"]["camera"][
223-
"CameraSpecificInput"
224-
]["a:KeyValueOfstringanyType"][2]["a:Value"]["b:NumberOffractions"]
225-
)
226-
except (KeyError, IndexError):
227-
pass
228200
c2_index = 3
229201
for i, el in enumerate(
230202
data["MicroscopeImage"]["CustomData"]["a:KeyValueOfstringanyType"]
@@ -293,85 +265,13 @@ def gather_metadata(
293265
metadata["image_size_x"] = str(int(metadata["image_size_x"]) * binning_factor)
294266
metadata["image_size_y"] = str(int(metadata["image_size_y"]) * binning_factor)
295267
metadata["motion_corr_binning"] = 1 if binning_factor_xml == 2 else 2
296-
if environment:
297-
metadata["gain_ref"] = (
298-
environment.data_collection_parameters.get("gain_ref")
299-
if environment
300-
and environment.data_collection_parameters.get("gain_ref")
301-
not in (None, "None")
302-
else f"{datetime.now().year}/{environment.visit}/processing/gain.mrc"
303-
)
304-
metadata["gain_ref_superres"] = (
305-
environment.data_collection_parameters.get("gain_ref_superres")
306-
if environment
307-
and environment.data_collection_parameters.get("gain_ref_superres")
308-
not in (None, "None")
309-
else f"{datetime.now().year}/{environment.visit}/processing/gain_superres.mrc"
310-
)
311-
else:
312-
metadata["gain_ref"] = None
313-
metadata["gain_ref_superres"] = None
314-
if metadata.get("total_exposed_dose"):
315-
metadata["dose_per_frame"] = (
316-
environment.data_collection_parameters.get("dose_per_frame")
317-
if environment
318-
and environment.data_collection_parameters.get("dose_per_frame")
319-
not in (None, "None")
320-
else round(metadata["total_exposed_dose"] / num_fractions, 3)
321-
)
322-
else:
323-
metadata["dose_per_frame"] = (
324-
environment.data_collection_parameters.get("dose_per_frame")
325-
if environment
326-
else None
327-
)
328-
329-
metadata["use_cryolo"] = (
330-
environment.data_collection_parameters.get("use_cryolo")
331-
if environment
332-
else None
333-
) or True
334-
metadata["symmetry"] = (
335-
environment.data_collection_parameters.get("symmetry")
336-
if environment
337-
else None
338-
) or "C1"
339-
metadata["mask_diameter"] = (
340-
environment.data_collection_parameters.get("mask_diameter")
341-
if environment
342-
else None
343-
) or 190
344-
metadata["boxsize"] = (
345-
environment.data_collection_parameters.get("boxsize")
346-
if environment
347-
else None
348-
) or 256
349-
metadata["downscale"] = (
350-
environment.data_collection_parameters.get("downscale")
351-
if environment
352-
else None
353-
) or True
354-
metadata["small_boxsize"] = (
355-
environment.data_collection_parameters.get("small_boxsize")
356-
if environment
357-
else None
358-
) or 128
268+
metadata["gain_ref"] = environment.gain_ref if environment else None
269+
metadata["dose_per_frame"] = environment.dose_per_frame if environment else None
270+
metadata["symmetry"] = (environment.symmetry if environment else None) or "C1"
359271
metadata["eer_fractionation"] = (
360-
environment.data_collection_parameters.get("eer_fractionation")
361-
if environment
362-
else None
272+
environment.eer_fractionation if environment else None
363273
) or 20
364274
metadata["source"] = str(self._basepath)
365-
metadata["particle_diameter"] = (
366-
environment.data_collection_parameters.get("particle_diameter")
367-
if environment
368-
else None
369-
) or 0
370-
metadata["estimate_particle_diameter"] = (
371-
environment.data_collection_parameters.get("estimate_particle_diameter")
372-
if environment
373-
else None
374-
) or True
375275
return metadata
376276

377277
def _position_analysis(
@@ -584,10 +484,10 @@ def post_transfer(
584484
f"{str(environment.url.geturl())}{url_path_for('file_io_instrument.router', 'write_eer_fractionation_file', visit_name=environment.visit, session_id=environment.murfey_session)}",
585485
json={
586486
"eer_path": str(file_transferred_to),
587-
"fractionation": environment.data_collection_parameters[
487+
"fractionation": self.data_collection_parameters[
588488
"eer_fractionation"
589489
],
590-
"dose_per_frame": environment.data_collection_parameters[
490+
"dose_per_frame": self.data_collection_parameters[
591491
"dose_per_frame"
592492
],
593493
"fractionation_file_name": "eer_fractionation_spa.txt",
@@ -619,20 +519,16 @@ def post_transfer(
619519
"image_number": environment.movies[
620520
file_transferred_to
621521
].movie_number,
622-
"pixel_size": environment.data_collection_parameters.get(
522+
"pixel_size": self.data_collection_parameters.get(
623523
"pixel_size_on_image"
624524
),
625525
"autoproc_program_id": None,
626-
"dose_per_frame": environment.data_collection_parameters.get(
627-
"dose_per_frame"
628-
),
629-
"mc_binning": environment.data_collection_parameters.get(
526+
"dose_per_frame": environment.dose_per_frame,
527+
"mc_binning": self.data_collection_parameters.get(
630528
"motion_corr_binning", 1
631529
),
632-
"gain_ref": environment.data_collection_parameters.get(
633-
"gain_ref"
634-
),
635-
"extract_downscale": environment.data_collection_parameters.get(
530+
"gain_ref": environment.gain_ref,
531+
"extract_downscale": self.data_collection_parameters.get(
636532
"downscale", True
637533
),
638534
"eer_fractionation_file": eer_fractionation_file,

0 commit comments

Comments
 (0)