Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DIALS 3.19.1 #203

Merged
merged 3 commits into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 3.18.0
current_version = 3.19.1
commit = True
tag = False
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<release>[a-z]+)?(?P<patch>\d+)?
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
DIALS 3.19.1 (2024-05-23)
=========================

Bugfixes
--------

- Fix case where old I03 Eiger nexus data (pre-2020) would fail to process. (`#737 <https://github.com/cctbx/dxtbx/issues/737>`_)


dxtbx 3.19.0 (2024-04-17)
=========================

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

# Static version number which is updated by bump2version
# Do not change this manually - use 'bump2version <major/minor/patch/release>'
__version_tag__ = "3.18.0"
__version_tag__ = "3.19.1"

setup_kwargs = {
"name": "dxtbx",
Expand Down
56 changes: 44 additions & 12 deletions src/dxtbx/format/FormatNXmxDLS.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,77 @@
from __future__ import annotations

import contextlib
import datetime
import os
import logging
from functools import cached_property
from pathlib import Path
from typing import Union

import h5py
import numpy as np
import nxmx

from dxtbx.format.FormatNXmx import FormatNXmx

logger = logging.getLogger(__name__)

def get_bit_depth_from_meta(meta_file_name):

def get_bit_depth_from_meta(meta_file_name: Path) -> int:
with h5py.File(meta_file_name) as f:
return int(f["/_dectris/bit_depth_image"][()])
with contextlib.suppress(KeyError):
return int(f["/_dectris/bit_depth_image"][()])

# This might be a very old meta file, that only had 'datatype'?
if "datatype" in f:
unique_vals = np.unique(f["datatype"])
if not len(unique_vals) == 1:
raise RuntimeError(
f"Error: Could not determine bit depth from metafile {meta_file_name} (multiple bit depths)"
)
return np.dtype(unique_vals[0]).itemsize * 8

raise RuntimeError("Cannot determine metafile bit depth")


def find_meta_filename(master_like: Union[str, Path]) -> Union[str, Path]:
def find_meta_filename(master_like: Path) -> Path:
"""
Find the path to the '..._meta.h5' file in the same directory as the master file.
Args:
master_like: File path of the master HDF5 file.

Returns:
File path of the HDF5 metadata '..._meta.h5' file.

Raises:
RuntimeError: If no meta-file was found.
"""

def _local_visit(name):
def _local_visit(name) -> Path | None:
obj = f[name]
if not hasattr(obj, "keys"):
return None
for k in obj.keys():
kclass = obj.get(k, getlink=True, getclass=True)
if kclass is h5py._hl.group.ExternalLink:
kfile = obj.get(k, getlink=True).filename
if kfile.split(".")[0].endswith("meta"):
kfile = master_like.parent / obj.get(k, getlink=True).filename
if kfile.stem.endswith("meta"):
return kfile
return None

master_dir = os.path.split(master_like)[0]
master_like = Path(master_like)
with h5py.File(master_like) as f:
meta_filename = f.visit(_local_visit)

return os.path.join(master_dir, meta_filename)
if meta_filename is None:
# Try a fallback of looking for a file named the same but "meta.h5"
look_for = master_like.with_name(
master_like.stem.removesuffix("_master") + "_meta.h5"
)
if look_for.is_file():
meta_filename = look_for
else:
raise RuntimeError(f"Could not find h5 meta file for {master_like}")

return meta_filename


class FormatNXmxDLS(FormatNXmx):
Expand Down Expand Up @@ -76,11 +105,14 @@ def _start(self):
# See https://jira.diamond.ac.uk/browse/MXGDA-3674
try:
self._bit_depth_readout = get_bit_depth_from_meta(self._meta)
except Exception:
except RuntimeError:
logger.warning(
"Could not determine bit depth of legacy image data: Falling back to default of 16"
)
self._bit_depth_readout = 16

@cached_property
def _meta(self):
def _meta(self) -> Path:
return find_meta_filename(self._image_file)

def _get_nxmx(self, fh: h5py.File):
Expand Down
Loading