|
1 | 1 | import logging |
| 2 | +from datetime import datetime |
2 | 3 | from pathlib import Path |
3 | 4 | from typing import Any |
4 | 5 |
|
|
13 | 14 | ) |
14 | 15 | from murfey.client.instance_environment import MurfeyInstanceEnvironment |
15 | 16 | from murfey.util.client import capture_post |
| 17 | +from murfey.util.models import File |
16 | 18 | from murfey.util.tomo import midpoint |
17 | 19 |
|
18 | 20 | logger = logging.getLogger("murfey.client.contexts.sxt") |
19 | 21 |
|
20 | 22 |
|
| 23 | +def _find_reference(txrm_file: Path) -> Path | None: |
| 24 | + """Find a suitable reference to apply to the given txrm file""" |
| 25 | + # Look for xrm files in the txrm folder, reverse sorted by time |
| 26 | + candidates = [] |
| 27 | + for gf in txrm_file.parent.glob("*.xrm"): |
| 28 | + candidates.append( |
| 29 | + File( |
| 30 | + name=gf.name, |
| 31 | + description="", |
| 32 | + size=gf.stat().st_size / 1e6, |
| 33 | + timestamp=datetime.fromtimestamp(gf.stat().st_mtime), |
| 34 | + full_path=str(gf), |
| 35 | + ) |
| 36 | + ) |
| 37 | + candidates.sort(key=lambda x: x.timestamp, reverse=True) |
| 38 | + for ref_option in candidates: |
| 39 | + mosaic_size = 1 |
| 40 | + with OleFileIO(str(ref_option)) as xrm_ole: |
| 41 | + # Find images which are not mosaics (txrm spec typos this as mosiac) |
| 42 | + if xrm_ole.exists("ImageInfo/MosiacRows") and xrm_ole.exists( |
| 43 | + "ImageInfo/MosiacColumns" |
| 44 | + ): |
| 45 | + mosaic_size = int( |
| 46 | + np.frombuffer( |
| 47 | + xrm_ole.openstream("ImageInfo/MosiacRows").getvalue(), np.int32 |
| 48 | + )[0] |
| 49 | + * np.frombuffer( |
| 50 | + xrm_ole.openstream("ImageInfo/MosiacColumns").getvalue(), |
| 51 | + np.int32, |
| 52 | + )[0] |
| 53 | + ) |
| 54 | + if mosaic_size == 0: |
| 55 | + logger.info(f"Found reference {ref_option}") |
| 56 | + return ref_option |
| 57 | + logger.warning(f"No reference found for {txrm_file}") |
| 58 | + return None |
| 59 | + |
| 60 | + |
21 | 61 | class SXTContext(Context): |
22 | 62 | def __init__( |
23 | 63 | self, |
@@ -206,9 +246,17 @@ def post_transfer( |
206 | 246 | ) |
207 | 247 | metadata["energy"] = int(round(axis_values[energy_index])) |
208 | 248 |
|
209 | | - if not metadata.get("has_reference", False): |
| 249 | + if ( |
| 250 | + not metadata.get("has_reference", False) |
| 251 | + and metadata.get("tilt_series_length", len(angles)) < 20 |
| 252 | + ): |
| 253 | + # References are collected with only 10 frames |
210 | 254 | logger.debug(f"Reference image {transferred_file} not processed") |
211 | 255 | return True |
| 256 | + elif not metadata.get("has_reference", False): |
| 257 | + reference_file = _find_reference(transferred_file) |
| 258 | + else: |
| 259 | + reference_file = None |
212 | 260 |
|
213 | 261 | tilt_series_tag = "_".join( |
214 | 262 | transferred_file.stem.split("@")[0].split("_")[:-1] |
@@ -260,6 +308,7 @@ def post_transfer( |
260 | 308 | "tilt_series_length", len(angles) |
261 | 309 | ), |
262 | 310 | "txrm": str(file_transferred_to), |
| 311 | + "xrm_reference": str(reference_file) if reference_file else None, |
263 | 312 | }, |
264 | 313 | ) |
265 | 314 | return True |
0 commit comments