Skip to content

Commit 0dc6856

Browse files
authored
Merge pull request #900 from HEXRD/parse-ims-add-group-support
Add group support when parsing imageseries
2 parents b3bf8d5 + f47b042 commit 0dc6856

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

hexrd/core/instrument/hedm_instrument.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ def _parse_imgser_dict(
246246
imgser_dict: Mapping[str, OmegaImageSeries | NDArray[np.float64]],
247247
det_key: str,
248248
roi: Optional[tuple[tuple[int, int], ...]] = None,
249+
group: Optional[str] = None,
249250
) -> OmegaImageSeries | ProcessedImageSeries | NDArray[np.float64]:
250251
"""
251252
Associates a dict of imageseries to the target panel(s).
@@ -262,6 +263,9 @@ def _parse_imgser_dict(
262263
The roi of the target images. Format is
263264
((row_start, row_stop), (col_start, col_stop))
264265
The stops are used in the normal sense of a slice. The default is None.
266+
group : str or None, optional
267+
The detector group name. Used as a fallback key when `det_key` is not
268+
found in `imgser_dict`. The default is None.
265269
266270
Raises
267271
------
@@ -290,6 +294,9 @@ def _parse_imgser_dict(
290294
img_keys: NDArray[np.str_] = np.asarray(list(imgser_dict.keys()))
291295
matched_det_key = img_keys[matched_det_keys][0]
292296
images_in = imgser_dict[matched_det_key]
297+
elif group is not None and group in imgser_dict:
298+
# match by detector group name
299+
images_in = imgser_dict[group]
293300
else:
294301
raise RuntimeError(
295302
f"neither '{det_key}' nor '{multi_ims_key}' found"
@@ -1140,7 +1147,9 @@ def extract_polar_maps(
11401147
ptth, peta = panel.pixel_angles()
11411148

11421149
# grab imageseries for this detector
1143-
ims = _parse_imgser_dict(imgser_dict, det_key, roi=panel.roi)
1150+
ims = _parse_imgser_dict(
1151+
imgser_dict, det_key, roi=panel.roi, group=panel.group
1152+
)
11441153
assert isinstance(ims, OmegaImageSeries)
11451154

11461155
# grab omegas from imageseries and squawk if missing
@@ -1321,7 +1330,9 @@ def make_instr_cfg(panel):
13211330

13221331
images = []
13231332
for detector_id, panel in self.detectors.items():
1324-
images.append(_parse_imgser_dict(imgser_dict, detector_id, roi=panel.roi))
1333+
images.append(_parse_imgser_dict(
1334+
imgser_dict, detector_id, roi=panel.roi, group=panel.group
1335+
))
13251336

13261337
panels = [self.detectors[k] for k in self.detectors]
13271338
instr_cfgs = [make_instr_cfg(x) for x in panels]
@@ -1677,7 +1688,7 @@ def _pull_spots_check_only(
16771688
for detector_id, panel in self.detectors.items():
16781689
# pull out the OmegaImageSeries for this panel from input dict
16791690
omega_image_series = _parse_imgser_dict(
1680-
imgser_dict, detector_id, roi=panel.roi
1691+
imgser_dict, detector_id, roi=panel.roi, group=panel.group
16811692
)
16821693
assert isinstance(omega_image_series, OmegaImageSeries)
16831694

@@ -1889,7 +1900,7 @@ def pull_spots(
18891900
npdiv,
18901901
)
18911902
omega_image_series = _parse_imgser_dict(
1892-
imgser_dict, detector_id, roi=panel.roi
1903+
imgser_dict, detector_id, roi=panel.roi, group=panel.group
18931904
)
18941905
assert isinstance(omega_image_series, OmegaImageSeries)
18951906

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import numpy as np
2+
import pytest
3+
4+
from hexrd.core.instrument.hedm_instrument import _parse_imgser_dict
5+
6+
7+
class TestParseImgserDictGroupFallback:
8+
"""Test that _parse_imgser_dict falls back to the group name."""
9+
10+
def test_group_fallback_with_ndarray(self):
11+
# Image keyed by group name, not detector name
12+
img = np.arange(20, dtype=np.float64).reshape(4, 5)
13+
imgser_dict = {'my_group': img}
14+
roi = ((1, 3), (0, 5))
15+
16+
result = _parse_imgser_dict(
17+
imgser_dict, det_key='det_0', roi=roi, group='my_group'
18+
)
19+
20+
expected = img[1:3, 0:5]
21+
np.testing.assert_array_equal(result, expected)
22+
23+
def test_group_fallback_not_used_when_det_key_matches(self):
24+
# Direct det_key match should take priority over group
25+
img_direct = np.ones((4, 5), dtype=np.float64)
26+
img_group = np.zeros((4, 5), dtype=np.float64)
27+
imgser_dict = {'det_0': img_direct, 'my_group': img_group}
28+
29+
result = _parse_imgser_dict(imgser_dict, det_key='det_0', group='my_group')
30+
31+
np.testing.assert_array_equal(result, img_direct)
32+
33+
def test_group_none_raises_when_no_match(self):
34+
imgser_dict = {'other': np.zeros((4, 5))}
35+
36+
with pytest.raises(RuntimeError, match="neither"):
37+
_parse_imgser_dict(imgser_dict, det_key='det_0', group=None)

0 commit comments

Comments
 (0)